Skip to content

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