Gogs

Gogs 是使用 golang 开发的开源 git 管理应用,官方网站:https://gogs.io/,相比起来 gitlabGogs 更加轻量,部署起来非常便捷,非常适合小型团队内部使用。

Gogs 官方文档提供了源码编译和二进制安装的方法,总体来说部署花费的时间不会太长,按照官方问题提供的说明,修改 app.ini 自定义配置,很快就能运行起一套高效的 git 项目仓库。

故障

一直以来,小组内使用的 gogs 是部署在一台年代久远物理机上的虚拟机里面,国庆后发现物理机上 raid 阵列一直处在 rebuild 状态,机器开机会不定期自动重启,考虑到机器已经过保,也没有多余的精力花在修复机器上,所以考虑将里面的虚拟机迁移出来。

庆幸的是,gogs 宿主机是采用 virtualbox 来部署虚拟环境,只要将虚拟机对于的 vdi 格式的磁盘和 logs 目录拷贝到本地,就能通过本地的 virtualbox 直接“复现”挂掉的虚拟机,相对来说比较简单,主要的时间都花在拷贝文件(大概 50GB 左右),中间还有过一次服务器自动断掉重启的情况。

迁移

虚拟机复现以后,为了安全起见,需要将其中的 gogs 数据完整迁移到其他服务器上。

首先需要导出 mysql 数据库 SQL 到新新服务器数据库中,相对容易。

gogs 项目目录只需要迁移 custom 目录和 data 目录,custom 目录主要包含了项目运行的配置文件信息(app.ini),data 目录中主要是一些会话信息。

最关键的代码仓库需要完整打包后迁移到新服务器中,在 app.inirepository 配置项下可以找到仓库的地址。

以上步骤完成以后,理论上就可以启动服务了,可以执行命令

/path/to/gogs/gogs web

如果想要常驻后台执行,scripts 目录下面有对应系统可用的启动脚本,centos 7 使用 systemctl 管理后台服务,可以拷贝 gogs/scripts/systemd/gogs.service 到 /lib/systemd/system/ 下,启动服务:

systemctl daemon-reload
systemctl start gogs

服务启动后, gogs 会监听 3000 端口,访问 http://SERVER_IP:3000 就能效果了。

踩坑

  • 服务启动后,发现部分创建目录的操作报 500 错误,解决办法:

编辑 gogs.service, 将这些配置注释掉:

ProtectSystem=full
PrivateDevices=yes
PrivateTmp=yes
NoNewPrivileges=true
  • 如果迁移前后代码仓库绝对路径不一致,会出现无法推送的错误,具体报错:remote: hooks/pre-receive: line 2: <path>: No such file or directory

原因:代码仓库中,hooks 目录下的各种钩子脚本里面的仓库目录指向了迁移前的仓库地址,需要批量替换成新的目录,如果原目录是:/root/gogs-repo,新的仓库目录是:/home/gogs-repo,那么可以执行以下命令:

cd /home/gogs-repo
grep '/root/gogs-repo' -rl * | xargs sed -i 's@/root/gogs-repo@/home/gogs-repo@g'