GitLab在Linux上的备份方法
GitLab提供自带的gitlab-rake命令,可快速完成实例级备份(包含仓库、数据库、配置等)。
手动执行备份:
登录GitLab服务器,切换至git用户(GitLab数据目录属主),执行以下命令:
sudo -u git -H gitlab-rake gitlab:backup:create CRON=1
CRON=1表示立即执行(跳过定时任务调度);/var/opt/gitlab/backups目录,文件名格式为TIMESTAMP_gitlab_backup.tar(如1724234567_gitlab_backup.tar)。修改备份路径:
若需更改备份存储位置,编辑/etc/gitlab/gitlab.rb配置文件,添加或修改以下参数:
gitlab_rails['backup_path'] = '/your/custom/backup/path'
保存后运行sudo gitlab-ctl reconfigure使配置生效。
自动化定时备份:
通过Linux的crontab设置定时任务,例如每天凌晨2点执行备份:
sudo crontab -e
添加以下行:
0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
(注:/opt/gitlab/bin/为GitLab可执行文件路径,可通过which gitlab-rake确认)
若需更细粒度的控制(如仅备份特定目录),可使用rsync或tar命令:
备份配置文件:
GitLab配置文件位于/etc/gitlab,使用tar打包:
sudo tar -czvf /path/to/backup/gitlab_configs.tar.gz /etc/gitlab
备份数据目录:
GitLab数据(仓库、日志、数据库文件等)存储在/var/opt/gitlab,使用rsync排除临时文件:
sudo rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /var/opt/gitlab/ /path/to/backup/gitlab_data/
备份数据库:
GitLab默认使用PostgreSQL,可通过pg_dump导出数据库:
sudo -u postgres pg_dump -Fc gitlabhq_production > /path/to/backup/gitlab_db.dump
(gitlabhq_production为GitLab数据库名,默认配置下无需修改)
若仅需备份Git仓库(不包含数据库、配置),可使用git bundle命令将每个仓库打包为单个文件:
sudo -u git -H cd /var/opt/gitlab/repositories
sudo -u git -H find . -name "*.git" -exec sh -c 'git bundle create /path/to/backup/{}.bundle --all' {} \;
.bundle文件包含仓库的所有历史记录,可直接导入至其他GitLab实例。若项目已配置GitLab CI/CD,可在.gitlab-ci.yml中添加备份作业,实现代码推送时自动触发备份:
backup:
script:
- sudo -u git -H gitlab-rake gitlab:backup:create CRON=1
only:
- master # 仅在master分支推送时执行
(注:需确保CI/CD Runner有权限执行gitlab-rake命令)
GitLab的Git仓库本身支持增量备份(Git的.git目录仅存储变更),但数据库(如PostgreSQL)需额外处理。以下是基于rsync的增量备份脚本示例:
/data/backups/gitlab/gitlab_incremental.sh:#!/bin/bash
BACKUP_DIR="/data/backups/gitlab"
LAST_BACKUP=$(ls -t $BACKUP_DIR | head -n 1)
NEW_BACKUP="gitlab_$(date +%Y%m%d_%H%M%S).tar"
# 执行GitLab内置备份
sudo -u git -H gitlab-rake gitlab:backup:create
LATEST_BACKUP=$(ls -t $BACKUP_DIR | head -n 1)
# 增量同步到远程服务器
rsync -avz --link-dest=$BACKUP_DIR/$LAST_BACKUP $BACKUP_DIR/$LATEST_BACKUP user@remote:/data/backups/gitlab/
sudo crontab -e
添加:0 1 * * * /data/backups/gitlab/gitlab_incremental.sh
(注:--link-dest参数实现硬链接增量备份,节省存储空间)git用户或root用户执行,确保备份文件属主正确(如chown -R git:git /path/to/backup)。