「Gogs」- 升级 0.11.91 到 0.12.3 版本(迁移、Docker Compose)

问题描述

最开始我们使用 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