实现VMware+Alpine+Gogs服务自启动

前言

最近中了docker的毒,发现Alpine Linux真是个好东西,麻雀虽小五脏俱全。
只可惜Docker的Hyper-V和VMware Workstation不相容,由于业务关系只得放弃docker for windows。
之前在Ubuntu Server虚拟机里跑Gogs觉得太重,空镜像1GB+而且很多服务用不上。
这里决定尝试更加轻量化的Vmware+Alpine搭建本地Git服务器。

踩坑

让Gogs在Alpine Linux上跑起来需要踩不少坑……(结论可直接跳至安装部署章节)

安装系统

安装Alpine必须联网,否则在系统分区那一步会报错,无法继续。

无法运行

进入系统第一个遇到的坑就是Alpine Linux无法直接运行Gogs官网提供的二进制Linux-amd64发行版,提示not found错误。
这个牵扯到gnu libc和musl libc的差异,Alpine使用更为精简的musl libc与主流Linux发行版采用gun libc不兼容。
因此解决的方法有两个:

  1. 在Alpine里面安装glibc,让Alpine不再是Alpine
  2. 使用musl libc重新编译Gogs,保持Alpine原貌

我选择第二种,因为Gogs的官方docker镜像里有现成的musl libc版二进制文件直接拿来用(哈哈)

缺少组件

使用ldd查看依赖发现缺少pam相关组件,使用apk add linux-pam添加
成功进入web端配置完成后提示没有git,使用apk add git添加

公钥无效

成功安装并添加ssh key但无法通过ssh clone提示需要git账户密码
原因是git账户没有限制登录,需要修改/etc/shadow中git第二个字段为*

无法提交

ssh可以clone但无法commit报错bash not found看来Gogs依赖bash
手动安装apk add bash

安装部署

前期准备

环境配齐

apk add git bash linux-pam

用户配置

创建一个用户专门用作git相关服务adduser git -D -G Gogs -u 1000
修改/etc/shadow文件中第二个字段为*限制git登录,类似git:*:18460:0:99999:7:::
从gogs官方docker镜像的/app文件夹中找到gogs二进制文件,复制到/home/git/gogs
使用su git切换用户并运行./gogs web确认hostname:3000可以正常显示

开机启动

手动创建一个daemon实现开机启动并防止gogs被中断,这里用nohup实现。熟悉OpenRC也可以自行编写服务实现。

Alpine Linux 的开机自启目录在/etc/local.d下,该目录下的README简要描述了用法:

This directory should contain programs or scripts which are to be run
when the local service is started or stopped.

If a file in this directory is executable and it has a .start extension,
it will be run when the local service is started. If a file is
executable and it has a .stop extension, it will be run when the local
service is stopped.

All files are processed in lexical order.

Keep in mind that files in this directory are processed sequentially,
and the local service is not considered started or stopped until
everything is processed, so if you have a process which takes a long
time to run, it can delay your boot or shutdown processing.

综上,只需要创建.start结尾的脚本并激活local服务即可。

vi gogs.start
su - git -c "nohup /home/git/gogs/gogs web >/dev/null 2>&1 &"
chmod +x gogs.start
rc-update add local

数据迁移

参考Gogs官方社区,在源系统执行./gogs backup获得包含数据库和仓库的完整备份
进入目标系统执行./gogs restore --from="gogs-backup-xxx.zip"完成恢复
仓库较大可选择仅备份数据库并手动迁移gogs-repositories文件夹(文末链接)

参考

shell脚本中使用其他用户执行脚本 - Bigben - 博客园
使用nohup不产生log文件方法 - azureology - 博客园
Alpine Linux 实现开机自启脚本 – 刺客博客
How to backup, restore and migrate - Tips, Tricks, and How-To‘s - Gogs Discussion

相关推荐