最近的项目需要进行版本管理,且数据及其重要(99.999),数据库已经采用了多可用备份,而源代码自然也需要,gitea本身不支持多端同步,但是可以通过gitea dump来在容器内创建备份,然后docker cp出来,然后使用rclone同步到腾讯cos,下面是具体实现

1.环境依赖

1.服务器为Ubuntu 22,安装了Docker gitea

2.安装了Corn:

apt install cron

3.安装了rclone

curl https://rclone.org/install.sh | sudo bash

2.配置rclone

1.在腾讯云建立COS库,记住名字和可用区

2.创建腾讯云api密钥,记住secretid和secretkey

3.对rclone进行配置

rclone config #进入配置页面
n #创建新的配置
tencentcos #输入配置名称,这个后面要用,可以自定义,要记住
4 #输入选择4,基于s3协议
31 #输入选择31,选择腾讯云cos
1 #这步我暂时没搞懂,我就是选的1
这一步输入secretid
这一步输入secretkey
1 #选择可用区,跟着上面选,我是北京区就选1
1 #存储权限选默认
1 #存储模式也选默认
后面一路按enter,最后一步选q退出

3.创建备份shell脚本

找一个地方,创建.sh脚本,内容如下(填上内容):

#!/bin/bash

# 容器ID或名称
CONTAINER_ID="[替换为你的]"

# 时间戳
TIMESTAMP=$(date +'%Y%m%d_%H%M%S')
BACKUP_NAME="gitea-dump-${TIMESTAMP}.zip"
TMP_DIR="/tmp"
HOST_BACKUP_DIR="/opt/gitea-backups"

# Step 1: 在容器内创建备份
docker exec -u git -w $TMP_DIR $CONTAINER_ID bash -c "/usr/local/bin/gitea dump --file $BACKUP_NAME"

# Step 2: 拷贝到宿主机
docker cp $CONTAINER_ID:$TMP_DIR/$BACKUP_NAME $HOST_BACKUP_DIR/$BACKUP_NAME

# Step 3: 清理容器内临时备份文件
docker exec -u git $CONTAINER_ID rm $TMP_DIR/$BACKUP_NAME

# Step 4: 上传到 COS/OSS(以 rclone 为例)
rclone copy $HOST_BACKUP_DIR/$BACKUP_NAME [刚才rclone设置的配置名称]:[cos存储桶的名称]/gitea-backups/

# Step 5: (可选)本地只保留最近7个备份
ls -tp $HOST_BACKUP_DIR/gitea-dump-*.zip | grep -v '/$' | tail -n +8 | xargs -I {} rm -- {}                                                                                                                              
#填写示例:
CONTAINER_ID="gitea1"
rclone copy $HOST_BACKUP_DIR/$BACKUP_NAME tencentcos:git-1234567/gitea-backups/

别忘了设置权限!

chmod 777 ./gitea-backup.sh

可以手动运行下试试能不能正常创建并上传备份,运行后cos存储痛内应该就会出现新文件位于/gitea-backups下

4.添加定时任务

运行

crontab -e

如果是首次运行,可能会让你选择使用哪个文本编辑器(vim,nano),使用数字选择就行

运行之后会打开一个文件,在文件末尾添加一行:

(下面给出的是12小时备份一次的示例,如果需要更改频率可以查看crontab文档更改)

0 */12 * * * /bin/bash [你的sh脚本路径] >> /var/log/gitea_backup.log 2>&1
#填写样例
0 */12 * * * /bin/bash /gitea_backup.sh >> /var/log/gitea_backup.log 2>&1

保存,退出

然后检查下cron运行状态

# 检查 cron 服务
systemctl status cron

# 或者重新启动
systemctl restart cron

如果全部正常运行,那么就全部完成了