#!/bin/bash set -euo pipefail # Where this script lives (Forgejo project root) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" BACKUP_DIR="$SCRIPT_DIR/backup" TIMESTAMP="$(date +%Y-%m-%d_%H-%M-%S)" BACKUP_FILE="$BACKUP_DIR/forgejo-backup-${TIMESTAMP}.tar.gz" echo "=== Forgejo backup ===" echo "Project dir : $SCRIPT_DIR" echo "Backup dir : $BACKUP_DIR" echo "Backup file : $BACKUP_FILE" echo # 1) Ensure backup dir exists mkdir -p "$BACKUP_DIR" # 2) Stop Forgejo (short downtime, but consistent backup) echo "[1/3] Stopping Forgejo containers..." docker compose down # 3) Create archive of data + config # Adjust the list if you add more config files echo "[2/3] Creating backup archive..." tar -czf "$BACKUP_FILE" \ forgejo \ docker-compose.yml \ .gitignore \ README.md \ .git 2>/dev/null || true # ignore .git if it causes trouble echo "[OK] Backup created: $BACKUP_FILE" # 4) Start Forgejo again echo "[3/3] Starting Forgejo containers..." docker compose up -d echo "=== Done ===" # 5) Optional: keep only last 7 backups, delete older ones echo "Cleaning up old backups (keep last 7)..." ls -1t "$BACKUP_DIR"/forgejo-backup-*.tar.gz 2>/dev/null | tail -n +8 | xargs -r rm -f echo "Backup finished successfully."