gitlab服务器
gitlab安装
安装的是gitlab社区版 官方文档
备份和恢复
脚本路径:/var/opt/gitlab/backups
备份
备份脚本 :/usr/local/bin/gitlab_auto_backup.sh
bash
#!/bin/bash
# ========================================
# GitLab 自动备份脚本(SMB 同步版)
# ========================================
BACKUP_DIR="/var/opt/gitlab/backups"
CONFIG_DIR="/etc/gitlab"
KEEP_BACKUPS=5
SMB_DIR="/mnt/gitlab_smb/gitlab" # 备份到 SMB 上的子目录
LOG_FILE="/var/log/gitlab_backup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] === 开始 GitLab 备份 ===" >> $LOG_FILE
# 创建备份
/opt/gitlab/bin/gitlab-backup create CRON=1 >> $LOG_FILE 2>&1
if [ $? -ne 0 ]; then
echo "[$DATE] ❌ GitLab 备份失败" >> $LOG_FILE
exit 1
fi
# 备份配置文件
cp $CONFIG_DIR/gitlab.rb $BACKUP_DIR/gitlab.rb
cp $CONFIG_DIR/gitlab-secrets.json $BACKUP_DIR/gitlab-secrets.json
# 清理旧备份
echo "[$DATE] 清理旧备份,仅保留最近 $KEEP_BACKUPS 个 ..." >> $LOG_FILE
cd $BACKUP_DIR
ls -t *.tar 2>/dev/null | tail -n +$(($KEEP_BACKUPS+1)) | xargs -r rm -f
# ---------- SMB 同步 ----------
echo "[$DATE] 开始同步到 SMB 共享目录 $SMB_DIR ..." >> $LOG_FILE
SMB_PARENT=$(dirname "$SMB_DIR")
if mount | grep -q "$SMB_PARENT"; then
mkdir -p "$SMB_DIR"
rsync -avh --delete "$BACKUP_DIR/" "$SMB_DIR/" >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
echo "[$DATE] ✅ SMB 同步成功" >> $LOG_FILE
else
echo "[$DATE] ⚠️ SMB 同步失败,请检查挂载" >> $LOG_FILE
fi
else
echo "[$DATE] ⚠️ SMB 未挂载,尝试自动重挂载..." >> $LOG_FILE
sudo mount -a
if mount | grep -q "$SMB_PARENT"; then
echo "[$DATE] 🔁 自动挂载成功,重新同步..." >> $LOG_FILE
rsync -avh --delete "$BACKUP_DIR/" "$SMB_DIR/" >> $LOG_FILE 2>&1
else
echo "[$DATE] ❌ SMB 仍未挂载,跳过同步" >> $LOG_FILE
fi
fi
echo "[$DATE] === GitLab 备份完成 ===" >> $LOG_FILE恢复
恢复脚本 :/usr/local/bin/gitlab_restore.sh
bash
#!/bin/bash
#
# GitLab 恢复脚本 (按官方 Restore GitLab 文档流程)
#
# 用法: sudo gitlab_restore_from_backup.sh <备份文件名.tar>
# 要求版本一致,secrets 恢复,停止必要服务等。
BACKUP_DIR="/var/opt/gitlab/backups"
CONFIG_DIR="/etc/gitlab"
BACKUP_TAR="$1"
if [ -z "$BACKUP_TAR" ]; then
echo "Usage: sudo $0 <备份文件名.tar>"
exit 1
fi
BACKUP_PATH="${BACKUP_DIR}/${BACKUP_TAR}"
if [ ! -f "$BACKUP_PATH" ]; then
echo "❌ 未找到备份文件: ${BACKUP_PATH}"
exit 1
fi
# 文档要求版本一致、已安装 GitLab、并 secrets 匹配 :contentReference[oaicite:2]{index=2}
echo "开始恢复备份 ${BACKUP_TAR} …"
# 恢复 secrets / 配置
sudo cp "${BACKUP_DIR}/gitlab-secrets.json" "${CONFIG_DIR}/gitlab-secrets.json"
sudo cp "${BACKUP_DIR}/gitlab.rb" "${CONFIG_DIR}/gitlab.rb"
sudo gitlab-ctl reconfigure
echo "停止部分 GitLab 服务 (puma, sidekiq) …"
sudo gitlab-ctl stop puma
sudo gitlab-ctl stop sidekiq
sudo cp "${BACKUP_DIR}/gitlab-secrets.json" "${CONFIG_DIR}/gitlab-secrets.json"
sudo cp "${BACKUP_DIR}/gitlab.rb" "${CONFIG_DIR}/gitlab.rb"
sudo gitlab-ctl reconfigure
# 执行恢复;去掉 .tar 部分传 BACKUP 参数
BASE_NAME=$(basename "${BACKUP_TAR}" _gitlab_backup.tar)
sudo gitlab-backup restore BACKUP=${BASE_NAME} force=yes
echo "重新加载配置 & 重启 GitLab"
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
# sudo gitlab-rake gitlab:check SANITIZE=true
echo "恢复完成。建议手动执行以下命令验证数据:
sudo gitlab-rake gitlab:artifacts:check
sudo gitlab-rake gitlab:lfs:check
sudo gitlab-rake gitlab:uploads:check"一些命令
bash
# 查看备份情况
ls -lh /var/opt/gitlab/backups/
# 查看备份日志
sudo tail -f /var/log/gitlab_backup.log
sudo tail -n 20 /var/log/gitlab_backup.log
# 同步
sudo rsync -avh --delete /var/opt/gitlab/backups/ /mnt/gitlab_smb/gitlab/
sudo mount -t cifs //192.168.30.152/GitLab /mnt/gitlab_smb \
-o credentials=/etc/samba/backup_cred,iocharset=utf8,file_mode=0777,dir_mode=0777
# GitLab 备份 SMB 挂载
//192.168.30.152/backup /mnt/gitlab_smb cifs credentials=/etc/samba/backup_cred,iocharset=utf8,file_mode=0777,dir_mode=0777,nofail 0 0
sudo mount -t cifs //192.168.30.152/backup /mnt/smb/gitlab -o username=admin,password=123456,iocharset=utf8