在 Debian 上备份 GitLab 的完整做法
一 准备与关键注意事项
- 备份命令仅打包应用数据(仓库、数据库、上传等),不会包含敏感配置文件。请务必单独备份:/etc/gitlab/gitlab.rb、/etc/gitlab/gitlab-secrets.json、以及 /etc/ssl/(证书与密钥)。恢复时缺少这些文件可能导致无法登录或 Runner 注册失败。备份文件还可能包含敏感信息,需妥善保护与传输加密。恢复前后建议保持 GitLab 版本一致,避免不兼容问题。
二 手动创建备份
- Omnibus 包安装(Debian 常见)常用两种方式,任选其一:
- 命令方式:执行
sudo gitlab-backup create
备份默认生成在 /var/opt/gitlab/backups,文件名类似 TIMESTAMP_VERSION_gitlab_backup.tar。
- Rake 方式(兼容旧版本或习惯 rake 的场景):
sudo gitlab-rake gitlab:backup:create
- 如需前台静默(便于 cron 不输出邮件),可加环境变量:
sudo gitlab-rake gitlab:backup:create CRON=1
- 以上两种方式均为官方支持的做法,选用与你环境一致的即可。
三 配置备份路径与保留策略
- 编辑配置文件 /etc/gitlab/gitlab.rb,按需调整:
gitlab_rails[‘manage_backup_path’] = true
gitlab_rails[‘backup_path’] = “/data/gitlab/backups” # 自定义备份目录
gitlab_rails[‘backup_archive_permissions’] = 0644 # 备份包权限
gitlab_rails[‘backup_keep_time’] = 604800 # 保留 7 天(单位:秒)
- 创建目录并授权(示例路径):
sudo mkdir -p /data/gitlab/backups
sudo chown -R git:git /data/gitlab/backups
- 使配置生效:
sudo gitlab-ctl reconfigure
- 说明:修改 backup_path 后,备份与清理任务都会使用该新目录;保留时间到期后,旧包会被自动清理。
四 定时备份与异地容灾
- 本地定时任务(crontab)示例:每天 02:00 执行
0 2 * * * /usr/bin/gitlab-backup create CRON=1 >> /var/log/gitlab/backup.log 2>&1
- 异地备份脚本示例(推送到备份服务器):
- 前提:已配置本机到备份机的 SSH 免密登录。
- 脚本(/usr/local/bin/gitlab_backup_remote.sh):
#!/usr/bin/env bash
set -e
LOCAL_BACKUP_DIR=“/var/opt/gitlab/backups”
REMOTE_USER=“backup”
REMOTE_HOST=“192.0.2.10”
REMOTE_DIR=“/data/gitlab/remote_backups”
TS=$(date +%F-%H%M%S)
LOG=“$LOCAL_BACKUP_DIR/backup_$TS.log”
echo “[$TS] Start backup” >> “$LOG”
执行备份
if /usr/bin/gitlab-backup create; then
echo “[$TS] Backup created” >> “$LOG”
else
echo “[$TS] Backup FAILED” >> “$LOG”
exit 1
fi
取最新 .tar 包并推送
NEWEST=$(find “$LOCAL_BACKUP_DIR” -name ‘*.tar’ -mmin -5 | tail -n1)
if [[ -n “$NEWEST” ]]; then
scp -p “$NEWEST” “$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/” &&
echo “[$TS] Sent $NEWEST to $REMOTE_HOST:$REMOTE_DIR” >> “$LOG”
else
echo “[$TS] No new .tar found” >> “$LOG”
fi
- 赋权并加入 cron(每天 02:30 推送):
sudo chmod +x /usr/local/bin/gitlab_backup_remote.sh
30 2 * * * /usr/local/bin/gitlab_backup_remote.sh >> /var/log/gitlab/backup_remote.log 2>&1
- 提示:若备份量大,可在脚本中加入 find … -mtime +N -delete 做本地保留策略,避免磁盘占满。
五 恢复步骤简要
- 准备:在新/原服务器安装同版本 GitLab,先恢复配置文件与密钥(见第一部分),并确保备份包已就位(默认 /var/opt/gitlab/backups 或自定义的 backup_path)。
- 停止相关进程(避免写入冲突):
sudo gitlab-ctl stop unicorn
sudo gitlab-ctl stop sidekiq
- 执行恢复(BACKUP 为备份编号或去掉后缀的 tar 名,二选一):
- 使用编号:sudo gitlab-rake gitlab:backup:restore BACKUP=1687460936_2023_06_22_14.3.3
- 使用文件名(不含 “_gitlab_backup.tar” 后缀):sudo gitlab-rake gitlab:backup:restore BACKUP=/var/opt/gitlab/backups/1687460936_2023_06_22_14.3.3
- 恢复过程中按提示输入 yes 确认;完成后启动服务:
sudo gitlab-ctl start
- 验证:登录 Web,检查项目、仓库、LFS、Pages、Runner 等是否正常;必要时执行 gitlab-rake gitlab:check 做健康检查。