#!/usr/bin/env bash set -euo pipefail # ============================================ # Gitea 备份脚本 (MySQL 版) # 备份内容:MySQL 数据库 + Gitea 数据(含 LFS) + 配置 # 定时执行: crontab -e → 0 3 * * * /opt/gitea/backup.sh # ============================================ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # 加载配置 if [ ! -f .env ]; then echo "[ERROR] .env 文件不存在" >&2 exit 1 fi set -a source .env set +a BACKUP_DIR="${BACKUP_DIR:-/var/backups/gitea}" GITEA_DATA_DIR="${GITEA_DATA_DIR:-/var/lib/gitea}" DATE=$(date +%Y%m%d_%H%M%S) KEEP_DAYS=30 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; } mkdir -p "$BACKUP_DIR" # 1. 备份 MySQL 数据库 log "正在备份 MySQL 数据库..." docker compose exec -T db mysqldump \ -u root -p"${DB_ROOT_PASSWORD}" \ --single-transaction \ --routines \ --triggers \ --databases gitea \ | gzip > "${BACKUP_DIR}/db_${DATE}.sql.gz" log "数据库备份完成: db_${DATE}.sql.gz ($(du -h "${BACKUP_DIR}/db_${DATE}.sql.gz" | cut -f1))" # 2. 备份 Gitea 数据(仓库、LFS、附件、头像等) log "正在备份 Gitea 数据目录(含 LFS)..." tar czf "${BACKUP_DIR}/gitea_data_${DATE}.tar.gz" \ -C "$(dirname "$GITEA_DATA_DIR")" \ "$(basename "$GITEA_DATA_DIR")" log "数据目录备份完成: gitea_data_${DATE}.tar.gz ($(du -h "${BACKUP_DIR}/gitea_data_${DATE}.tar.gz" | cut -f1))" # 3. 备份配置文件 log "正在备份配置文件..." tar czf "${BACKUP_DIR}/config_${DATE}.tar.gz" \ -C "$SCRIPT_DIR" \ .env docker-compose.yml nginx/ log "配置备份完成: config_${DATE}.tar.gz" # 4. 清理过期备份 log "清理 ${KEEP_DAYS} 天前的备份..." deleted=$(find "$BACKUP_DIR" -type f -mtime +${KEEP_DAYS} -print -delete | wc -l) log "已清理 ${deleted} 个过期文件" # 5. 输出备份摘要 echo "" log "===== 备份完成 =====" log "备份目录: ${BACKUP_DIR}/" ls -lh "${BACKUP_DIR}/"*"${DATE}"* 2>/dev/null || true echo "" log "总备份空间占用: $(du -sh "${BACKUP_DIR}" | cut -f1)"