Forgejo数据备份及恢复
备份 假设用户为:xxxx Forgejo容器为:forgejo PostgreSQL容器为:forgejo-db 1.创建备份目录 sudo mkdir -p /home/xxxx/backup/forgejo sudo chown xxxx:xxxx /home/xxxx/backup/forgejo 2.创建脚本目录以及脚本文件 mkdir -p /home/xxxx/script mkdir -p /home/xxxx/log vim /home/xxxx/script/forgejo-backup.sh 脚本: #!/bin/bash set -Eeuo pipefail # ===================== # Forgejo Backup Config # ===================== DATE=$(date +%F-%H%M) # 备份用户 BACKUP_USER="xxxx" # 备份目录 BACKUP_DIR="/home/xxxx/backup/forgejo" # 日志目录 LOG_DIR="/home/xxxx/log" LOG_FILE="$LOG_DIR/forgejo-backup.log" # Forgejo 数据目录 FORGEJO_DATA="/opt/docker/forgejo/data" # Docker 容器 FORGEJO_CONTAINER="forgejo" POSTGRES_CONTAINER="forgejo-db" # PostgreSQL DB_USER="forgejo" DB_NAME="forgejo" # 最低剩余空间 GB MIN_FREE_GB=5 # 保留最近备份数量 RETENTION_COUNT=7 # ===================== # Logging # ===================== mkdir -p "$LOG_DIR" touch "$LOG_FILE" chown "$BACKUP_USER:$BACKUP_USER" "$LOG_FILE" exec > >(tee -a "$LOG_FILE") 2>&1 echo echo "================================================" echo "Forgejo backup start: $(date '+%F %T')" echo "================================================" # ===================== # Variables # ===================== DATA_BACKUP="$BACKUP_DIR/forgejo-data-$DATE.tar.gz" DB_BACKUP="$BACKUP_DIR/forgejo-db-$DATE.sql" # ===================== # Check backup directory # ===================== if [[ ! -d "$BACKUP_DIR" ]]; then echo "ERROR: Backup directory not found:" echo "$BACKUP_DIR" exit 1 fi # ===================== # Check disk space # ===================== FREE_KB=$(df -Pk "$BACKUP_DIR" | awk 'NR==2 {print $4}') FREE_GB=$((FREE_KB / 1024 / 1024)) echo "Available disk space: ${FREE_GB}GB" if (( FREE_GB < MIN_FREE_GB )); then echo "ERROR: Need at least ${MIN_FREE_GB}GB free space." exit 1 fi # ===================== # Check containers # ===================== if ! docker ps --format '{{.Names}}' | grep -qx "$FORGEJO_CONTAINER"; then echo "ERROR: Forgejo container is not running." exit 1 fi if ! docker ps --format '{{.Names}}' | grep -qx "$POSTGRES_CONTAINER"; then echo "ERROR: PostgreSQL container is not running." exit 1 fi # ===================== # Stop Forgejo # ===================== echo "[1/6] Stop Forgejo..." docker stop "$FORGEJO_CONTAINER" # 无论成功失败,都启动 Forgejo cleanup() { echo "Restart Forgejo..." docker start "$FORGEJO_CONTAINER" >/dev/null 2>&1 || true } trap cleanup EXIT # ===================== # Backup Forgejo data # ===================== echo "[2/6] Backup Forgejo data..." tar czf \ "$DATA_BACKUP" \ -C "$(dirname "$FORGEJO_DATA")" \ "$(basename "$FORGEJO_DATA")" # ===================== # Backup PostgreSQL # ===================== echo "[3/6] Backup PostgreSQL..." docker exec "$POSTGRES_CONTAINER" \ pg_dump -U "$DB_USER" "$DB_NAME" \ > "$DB_BACKUP" # ===================== # Verify backups # ===================== echo "[4/6] Verify backup files..." if [[ ! -s "$DATA_BACKUP" ]]; then echo "ERROR: Forgejo data backup failed." exit 1 fi if [[ ! -s "$DB_BACKUP" ]]; then echo "ERROR: PostgreSQL backup failed." exit 1 fi echo "Backup verified." # ===================== # Remove old backups # ===================== echo "[5/6] Remove old backups..." echo "Removing old Forgejo data backups..." ls -1t "$BACKUP_DIR"/forgejo-data-*.tar.gz 2>/dev/null \ | tail -n +$((RETENTION_COUNT + 1)) \ | xargs -r rm -f echo "Removing old database backups..." ls -1t "$BACKUP_DIR"/forgejo-db-*.sql 2>/dev/null \ | tail -n +$((RETENTION_COUNT + 1)) \ | xargs -r rm -f # ===================== # Fix ownership # ===================== echo "[6/6] Fix ownership..." chown "$BACKUP_USER:$BACKUP_USER" \ "$DATA_BACKUP" \ "$DB_BACKUP" # ===================== # Summary # ===================== echo echo "Backup files:" ls -lh "$DATA_BACKUP" ls -lh "$DB_BACKUP" echo echo "Current backups:" ls -lh "$BACKUP_DIR" echo echo "================================================" echo "Forgejo backup finished: $(date '+%F %T')" echo "================================================" echo 3.添加执行权限 chmod +x /home/xxxx/script/forgejo-backup.sh 4.测试 sudo /home/xxxx/script/forgejo-backup.sh # 查看备份数据 ls /home/xxxx/backup/forgejo 5.定时执行(每天凌晨) 编辑: ...