很早之前在 QNAP 上就已经安装过老版本的 Gogs,一路升级到 0.11.91 之后很久没有更新,看了一下用的镜像还是 2020 年 2 月份的,看到 Gogs 也已经迭代了好几个版本,正好这一次做迁移,把 Gogs 从 QNAP 迁移到 VPS 上,随便想着也升级一下 Gogs 的版本。
因为之前使用 Docker 安装的,所以迁移的步骤也比较简单,两个部分数据,一部分是 MySQL 数据库,mysqldump 迁移导入即可,另一部分是写的磁盘持久化部分,tar
打包,scp 或 rsync 传输也比较快。
修改配置文件
Gogs 升级到 0.12.x 的时候官方有一些配置发生了变化,我的所有配置文件都在 ~/gogs
文件夹下,所以我需要修改:
vi ~/gogs/gogs/conf/app.ini
然后修改其中的配置。官方的 0.12.0 的 changelog 已经写的非常清楚了,将这些修改都更改了。
❯ cat ~/gogs/gogs/conf/app.ini
BRAND_NAME = Gogs
RUN_USER = git
RUN_MODE = dev
[database]
TYPE = mysql
HOST = db_host:3306
NAME = gogs
USER = gogs
PASSWORD = BTxax
SSL_MODE = disable
PATH = data/gogs.db
[repository]
ROOT = /data/git/gogs-repositories
[server]
DOMAIN = git.example.com
HTTP_PORT = 3000
EXTERNAL_URL = https://git.example.com
DISABLE_SSH = false
SSH_PORT = 10022
START_SSH_SERVER = false
OFFLINE_MODE = false
[mailer]
ENABLED = false
[service]
REQUIRE_EMAIL_CONFIRMATION = false
ENABLE_NOTIFY_MAIL = false
DISABLE_REGISTRATION = false
ENABLE_CAPTCHA = true
REQUIRE_SIGNIN_VIEW = false
[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false
[session]
PROVIDER = file
[log]
MODE = file
LEVEL = Info
ROOT_PATH = /app/gogs/log
[security]
INSTALL_LOCK = true
SECRET_KEY = Mj
可以大致参考我的,但不是每一个选项都要一致,最好自行查看每个选项的含义。
cp app.ini app.ini.bak
sed -i \
-e 's/APP_NAME/BRAND_NAME/g' \
-e 's/ROOT_URL/EXTERNAL_URL/g' \
-e 's/LANDING_PAGE/LANDING_URL/g' \
-e 's/DB_TYPE/TYPE/g' \
-e 's/PASSWD/PASSWORD/g' \
-e 's/REVERSE_PROXY_AUTHENTICATION_USER/REVERSE_PROXY_AUTHENTICATION_HEADER/g' \
-e 's/\[mailer\]/\[email\]/g' \
-e 's/\[service\]/\[auth\]/g' \
-e 's/ACTIVE_CODE_LIVE_MINUTES/ACTIVATE_CODE_LIVES/g' \
-e 's/RESET_PASSWD_CODE_LIVE_MINUTES/RESET_PASSWORD_CODE_LIVES/g' \
-e 's/ENABLE_CAPTCHA/ENABLE_REGISTRATION_CAPTCHA/g' \
-e 's/ENABLE_NOTIFY_MAIL/ENABLE_EMAIL_NOTIFICATION/g' \
-e 's/GC_INTERVAL_TIME/GC_INTERVAL/g' \
-e 's/SESSION_LIFE_TIME/MAX_LIFE_TIME/g' \
app.ini
使用命令 sed 替换。1
修改 Docker Compose 配置
然后在新的 VPS 上使用 docker-compose:
version: "3"
services:
gogs:
image: gogs/gogs:0.12.3
container_name: gogs
restart: always
volumes:
- ~/gogs:/data
ports:
- "10022:22"
environment:
VIRTUAL_HOST: git.example.com
VIRTUAL_PORT: 3000
LETSENCRYPT_HOST: git.example.com
LETSENCRYPT_EMAIL: admin@example.info
networks:
default:
external:
name: nginx-proxy
因为我使用 Nginx Proxy 做反向代理,如果需要可以去除掉。
然后直接 docker-compose up -d
启动即可。
这个时候我遇到一些问题。查看日志
less ~/gogs/gogs/log/gogs.log
2021/10/30 07:35:18 [ INFO] Gogs 0.12.3
2021/10/30 07:35:18 [FATAL] [...o/gogs/internal/route/install.go:75 GlobalInit()] Failed to initialize ORM engine: auto migrate "LFSObject": Error 1071: Specified key was too long; max key length is 767 bytes
会发现报错,这个错误 GitHub issue 上面也有人报错,之前因为迁移,没有来得及查看,后来仔细查看 Gogs 其他日志:
less ~/gogs/gogs/log/gorm.log
发现 gorm 日志中在创建 lfs_object
表的时候发生了错误。
2021/10/30 07:33:49 [log] [gogs.io/gogs/internal/db/db.go:166] Error 1071: Specified key was too long; max key length is 767 bytes
2021/10/30 07:33:49 [sql] [gogs.io/gogs/internal/db/db.go:166] [823.087µs] CREATE TABLE `lfs_object` (`repo_id` bigint,`oid` varchar(255),`size` bigint NOT NULL,`storage` varchar(255) NOT NULL,`created_at` DATETIME NOT NULL , PRIMARY KEY (`repo_id`,`oid`)) ENGINE=InnoDB [] (0 rows affected)
结合之前在 changelog 中看到的,升级到 0.12.x 之后 Gogs 会自动创建这张表,而创建失败了自然就无法启动报 502 错误了。
看这个错误 Error 1071,一看就是 MySQL 的错误。
Error 1071: Specified key was too long; max key length is 767 bytes
我的机器上使用的是 MariaDB,然后 gogs 数据库默认使用的是 utf8mb4_general_ci
collation,默认情况下索引长度会有问题,所以将数据库的默认 collation 改成 utf8_general_ci
即可。
使用 phpmyadmin 修改 collation
登录 phpmyadmin 选中数据库 gogs,然后在 Operations 最下面可以看到 Collation 设置,直接修改保存即可。
使用命令行修改 collation
ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_general_ci;