一、备份方案设计
1. 备份内容
-
SQLite数据库文件:
/home/git/gogs/data/gogs.db
-
配置和附件:
/home/git/gogs/custom
整个目录
2. 备份策略
-
每周日凌晨2点执行完整备份
-
保留最近4周的备份文件
-
备份存储在独立分区
/gogs-backup(使用永久化挂载方法挂载到独立分区)
编辑 /etc/fstab在文件末尾添加永久化
绑定挂载配置:
/embedded_sw_data/gogs-backup /home/git/gogs-backup none bind,rw,exec,suid 0 0
二、备份脚本实现
1. 初始化备份环境
#!/bin/bash
# 初始化备份目录
sudo mkdir -p /home/git/gogs-backup/gogs
sudo chown -R git:git /home/git/gogs-backup/gogs
sudo chmod 700 /home/git/gogs-backup/gogs
2. 主备份脚本 (/usr/local/bin/gogs_backup.sh
)
#!/bin/bash
# Gogs周备份脚本
BACKUP_DIR="/home/git/gogs-backup/gogs"
SOURCE_DATA=(
"/home/git/gogs/data/gogs.db"
"/home/git/gogs/custom"
"/etc/fstab"
)
DATE=$(date +%Y%m%d)
RETENTION_DAYS=28 # 保留28天备份
LOG_FILE="$BACKUP_DIR/backup.log"
# 记录开始时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始Gogs备份" >> "$LOG_FILE"
# 创建带时间戳的备份文件
BACKUP_FILE="$BACKUP_DIR/gogs_backup_$DATE.tar.gz"
# 执行备份
if ! tar -czf "$BACKUP_FILE" "${SOURCE_DATA[@]}" 2>> "$LOG_FILE"; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份失败" >> "$LOG_FILE"
echo "Gogs备份失败"
exit 1
fi
# 验证备份完整性
if ! tar -tzf "$BACKUP_FILE" >/dev/null 2>&1; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份验证失败" >> "$LOG_FILE"
echo "Gogs备份验证失败"
rm -f "$BACKUP_FILE"
exit 1
fi
# 清理旧备份
find "$BACKUP_DIR" -name "gogs_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete >> "$LOG_FILE" 2>&1
# 记录成功信息
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份成功完成: $BACKUP_FILE ($BACKUP_SIZE)" >> "$LOG_FILE"
3. 设置定时任务
/etc/crontab 必须指定用户
在 /etc/crontab 中,必须 指定运行用户,否则不会执行。
错误写法:
*/2 * * * * /usr/local/bin/gogs_backup.sh # ❌ 缺少用户
正确写法(以 git 用户运行):
*/2 * * * * git /usr/local/bin/gogs_backup.sh # ✅ 指定用户
4.检查 gogs_backup.sh
的权限
确保
1.脚本可执行:
sudo chmod +x /usr/local/bin/gogs_backup.sh
2.git 用户有权限访问备份目录:
sudo chown -R git:git /home/git/gogs-backup/gogs
3. 检查 cron 服务是否运行
sudo systemctl status cron # Ubuntu/Debian
4.如果未运行,启动它:
sudo systemctl enable --now cron
三、灾难恢复流程
1. 新系统准备
# 在新服务器上安装基础环境
sudo apt update
sudo adduser git
2. 恢复脚本 (/usr/local/bin/gogs_restore.sh
)
#!/bin/bash
# Gogs数据恢复脚本
BACKUP_DIR="/backup/gogs"
RESTORE_DIR="/home/git"
GOGS_VERSION="0.13.2" # 根据实际情况调整
LOG_FILE="/tmp/gogs_restore.log"
# 清空旧日志
> "$LOG_FILE"
# 检查备份目录
if [ ! -d "$BACKUP_DIR" ]; then
echo "错误: 备份目录 $BACKUP_DIR 不存在" | tee -a "$LOG_FILE"
exit 1
fi
# 获取最新备份文件
LATEST_BACKUP=$(ls -t "$BACKUP_DIR/gogs_backup_"*.tar.gz 2>/dev/null | head -n 1)
if [ -z "$LATEST_BACKUP" ]; then
echo "错误: 未找到备份文件" | tee -a "$LOG_FILE"
exit 1
fi
echo "准备从备份恢复: $LATEST_BACKUP" | tee -a "$LOG_FILE"
echo "恢复日志保存在: $LOG_FILE"
# 1. 创建恢复目录结构
mkdir -p "$RESTORE_DIR/gogs/data" "$RESTORE_DIR/gogs/custom" >> "$LOG_FILE" 2>&1
# 2. 恢复Gogs数据文件
echo "解压备份文件中..." | tee -a "$LOG_FILE"
if ! tar -xzf "$LATEST_BACKUP" -C / >> "$LOG_FILE" 2>&1; then
echo "错误: 解压备份文件失败" | tee -a "$LOG_FILE"
exit 1
fi
# 3. 安装Gogs二进制文件
echo "安装Gogs二进制文件..." | tee -a "$LOG_FILE"
if ! wget -q "https://dl.gogs.io/$GOGS_VERSION/gogs_${GOGS_VERSION}_linux_amd64.tar.gz" -P /tmp; then
echo "错误: 下载Gogs失败" | tee -a "$LOG_FILE"
exit 1
fi
if ! tar -xzf "/tmp/gogs_${GOGS_VERSION}_linux_amd64.tar.gz" -C "$RESTORE_DIR" >> "$LOG_FILE" 2>&1; then
echo "错误: 解压Gogs二进制文件失败" | tee -a "$LOG_FILE"
exit 1
fi
# 4. 设置权限
chown -R git:git "$RESTORE_DIR" >> "$LOG_FILE" 2>&1
# 5. 完成提示
echo "" | tee -a "$LOG_FILE"
echo "恢复完成!" | tee -a "$LOG_FILE"
echo "配置为系统服务后启动:" | tee -a "$LOG_FILE"
echo "sudo systemctl start gogs" | tee -a "$LOG_FILE"
3. 恢复操作步骤
-
挂载备份存储:
sudo mkdir -p /home/git/gogs-backup
sudo mount /dev/sdb1 /home/git/gogs-backup # 假设备份在/dev/sdb1分区
-
执行恢复:
sudo bash /usr/local/bin/gogs_restore.sh
-
启动服务:
sudo -u git /home/git/gogs/gogs web
# 或者配置为系统服务后启动
sudo systemctl start gogs
四、备份验证与维护
1. 手动验证备份
# 检查最新备份文件
ls -lt /backup/gogs/gogs_backup_*.tar.gz
# 验证备份内容
tar -tzf /backup/gogs/gogs_backup_最新日期.tar.gz
2. 日志检查
# 查看备份日志
tail -n 20 /backup/gogs/backup.log
# 查看恢复日志(如果有)
cat /tmp/gogs_restore.log
3. 定期维护
# 检查备份文件占用空间
du -sh /backup/gogs
# 检查备份文件数量
ls /backup/gogs/gogs_backup_*.tar.gz | wc -l
五、方案特点
-
极简设计:仅备份核心数据文件和配置
-
完整验证:自动验证备份完整性
-
独立存储:备份存储在非系统分区,避免系统盘故障影响
-
详细日志:所有操作均有详细日志记录
-
一键恢复:恢复脚本自动处理所有步骤
六、注意事项
-
确保
/backup
分区有足够空间(建议至少是Gogs数据大小的2-3倍) -
定期检查备份日志 (
/backup/gogs/backup.log
) -
重要更新前建议手动执行额外备份
-
建议每季度进行一次恢复演练
此方案提供了最简单直接的Gogs核心数据保护方法,特别适合不需要频繁备份的中小型Gogs实例。