Gitea从包管理版迁移到Docker版

对于官方文档做一点点补充

spark1e ·

尽管Gitea没有官方的恢复命令,但是官方文档提供了一份可以用来参考的基于dump文件的恢复步骤,链接

0. 为什么要迁移

在PVE的LXC的优势
  • 可以利用PVE的备份机制将整个LXC进行dump,万一出现Boom情况,可以基于整个dump立即还原LXC确保服务
  • 一种轻量化的,与宿主几乎不混淆的容器服务,由于其IP也是由PVE主机进行控制,所以也不需要担心端口问题
PVE在LXC的问题

最大问题:二进制安装时是根据系统底层的内核版本来决定Alpine版本的,Alpine版本又决定了Gitea的二进制版本,也就意味着 没有办法使用最新版本的Gitea ,1.20推出了新的Gitea Action,很想体验,那对于我现在的方案来说就基本无缘了……

1. 迁移准备工作

根据官方文档需要将现在运行的Gitea进行dump,进入到对应LXC容器,执行官方提供的dump命令:su git && ./gitea dump -c /path/to/app.ini

在我使用的时候没有git用户,因而是切到gitea目录进行操作的。正常情况下切换用户后应该当前目录在/usr/bin下,建议dump时输出到其他目录,我自己是切换到gitea的home目录再执行/usr/bin/gitea dump -c /path/to/app.ini

生成了dump文件之后,有一个小问题是我这个LXC的SSH是直接委托给了Gitea,宿主机的22端口被占用,没办法使用SCP方案,这里可以用Proxmox的工具来转移文件到外部(Proxmox宿主机): pct pull 111 /var/lib/gitea/gitea-dump-1692177100.zip /root/gitea-dump-1692177100.zip

111是我的Gitea LXC的id,需要更换成你自己的。

2. 更换到Docker所在的机器上

这里我的迁移目标是群晖上的Docker,由于之前踩过几轮未知问题的坑,这次我选择同版本先小升级。

按照官方文档进行挂载目录,暴露端口,然后启动容器。

启动之后先不要进入到web界面,需要将备份的内容还原到docker的data目录:

docker cp gitea-dump-1692177100.zip  gitea:/tmp

复制后 进入到容器内继续操作

# reference: https://github.com/go-gitea/gitea/issues/23964
docker exec -u root -it -w /tmp  gitea /bin/bash
unzip gitea-dump-1692177100.zip
# restore the old file
cp --parents -rf data/* /data/gitea
cp --parents -rf repos/*  /data/git/repositories/
# must chown otherwise the gitea container can no be restarted
chown -R git:git /data
#  exit the gitea container
exit

到目前为止,还原了文件目录,但是还缺少数据库恢复(此步骤在官方文档上缺失)

# enter the   gitea container
docker exec -u root -it -w /tmp  gitea /bin/bash
# restore database, e.g. sqlite
# 此步骤耗时较长,如果瞬间结束,请检查$DATABASE_PATH变量,可能不存在值,需要手工指定为注释的命令版本
sqlite3 $DATABASE_PATH <gitea-db.sql
# sqlite3 /data/gitea/gitea.db <gitea-db.sql

执行完毕后,可以对比两边sql文件大小和db文件大小,如果相近证明还原完成。

最后一步,按照文档恢复钩子函数

# enter gitea  container with git user
docker exec -u git -it  gitea /bin/bash
# this command must be run by git user. 
/usr/local/bin/gitea -c '/data/gitea/conf/app.ini' admin regenerate hooks

# exit the gitea container
exit

# restart gitea container
docker restart gitea

最后一步

请务必检查Docker容器是否有对应目录的写入权限,尤其是群晖系统。

完成上面的还原,如果容器重启无异常,可以进入到web管理页面,会出现初始化,检查对应的目录是否是我们刚还原的目录,如果是的话,点击保存,会出现一个“即将写入到已经有内容的数据库”的确认,勾选相应的确认,我这边顺利进入了。

晚上会继续进行版本升级,切换host的操作,看看有没有新的问题。

Gitea从包管理版迁移到Docker版
本文作者
spark1e
发布于
2023-08-17
许可协议
转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!
评论区 - Powered by Giscus