问题描述
最开始我们使用 YUM 安装 Gogs 0.11.91 版本,但是在 YUM 仓库中的 Gogs 使用未升级。
官方现在(08/06/2021)已经发布到 0.12.3 版本,我们只能采用其他方式升级到 0.12.3 版本。
该笔记将记录:在 CentOS 中,将 Gogs 0.11.91 升级到 0.12.3 版本的方法,以及相关问题的解决方案。
解决方案
官方主页提供 binary、source、package 安装方式,GitHub 仓库提供 Docker 安装方式。
经过对比,对于此次升级,我们使用 Docker 部署(使用 Docker Compose 编排)。
第一步、停止服务,并备份数据
systemctl stop gogs.service gogs-web.service gogs-web-1.service rsync --progress -avz /home/gogs/gogs-repositories/ /srv/backup/gogs/gogs-repositories-20210806
第二步、创建数据目录
在测试 Gogs 0.12.3 版本时,我们发现其目录结构如下:
# tree -L 3 . ├── git │ └── gogs-repositories │ └── team-common ├── gogs │ ├── conf │ │ └── app.ini │ ├── data │ │ └── gogs.db │ └── log │ ├── gogs.log │ ├── gorm.log │ └── xorm.log └── ssh ├── ssh_host_dsa_key ├── ssh_host_dsa_key.pub ├── ssh_host_ecdsa_key ├── ssh_host_ecdsa_key.pub ├── ssh_host_ed25519_key ├── ssh_host_ed25519_key.pub ├── ssh_host_rsa_key └── ssh_host_rsa_key.pub
需要进行如下操作,来创建数据目录:
mkdir -pv /srv/hdd/gogs/ mkdir -pv /srv/hdd/gogs/git/ mv /home/gogs/gogs-repositories /srv/hdd/gogs/git/ mkdir -pv /srv/hdd/gogs/gogs/ rsync -avz /opt/gogs/data/ /srv/hdd/gogs/gogs/data/ rsync -avz /opt/gogs/log/ /srv/hdd/gogs/gogs/log/ mkdir -pv /srv/hdd/gogs/ssh/ rsync -avz /etc/ssh/ssh_host_* /srv/hdd/gogs/ssh/
创建配置文件:
# 原来的配置文件不能直接使用,我们使用 0.12.3 生成的配置文件 docker run --rm --name=gogs -p 10022:22 -p 10080:3000 -v /tmp/gogs/:/data gogs/gogs # 然后浏览器访问进行安装 firefox http://container-ip-address:10080 # 复制配置文件 rsync -avz /tmp/gogs/gogs/conf/app.ini /srv/hdd/gogs/gogs/conf/ # 修改配置文件,诸如 DOMAIN、EXTERNAL_URL、SECRET_KEY 等等字段; vim /srv/hdd/gogs/gogs/conf/
修改数据文件权限:
chown -R 1000:1000 /srv/hdd/gogs/* # Gogs 0.12.3 生成的配置文件,将以 git 用户运行; # 并且容器中只有 git 用户,而没有 gogs 用户; # 并且 User id 为 1000,所以这里直接修改用户 ID 值;
第三步、编写 Docker Compose 文件
version: '3' services: gogs: image: "gogs/gogs:0.12.3" container_name: "gogs" network_mode: host ports: - 10022:22 - 10080:3000 restart: always volumes: - /etc/localtime:/etc/localtime - /srv/hdd/gogs/:/data
第四步,启动服务并检查
docker-compose up -d firefox http://gogs.example.com
已知问题
remote: hooks/pre-receive: line 2: /opt/gogs/gogs: No such file or directory
在创建仓库之后,服务器的仓库目录(gogs-repositories/<username>/<repository>.git)将创建 hooks/pre-receive 文件:
#!/usr/bin/env bash "/opt/gogs/gogs" hook --config='/etc/gogs/conf/app.ini' pre-receive
这个路径是硬编码,而迁移之后,容器内的路径不同,导致代码提交失败。
所以我们需要手动处理这个路径:
find ./ -path '*/hooks/*' -type f -not -name '*.sample' \ | xargs -i sed -i 's%"/opt/gogs/gogs"%"/app/gogs/gogs"%g' '{}' find ./ -path '*/hooks/*' -type f -not -name '*.sample' \ | xargs -i sed -i "s%'/etc/gogs/conf/app.ini'%'/data/gogs/conf/app.ini'%g" '{}'
参考文献
Installation – Gogs
gogs/docker at main · gogs/gogs
gogs/gogs – Docker Image | Docker Hub