#!/bin/bash # Forgejo Backup — nightly cron # Runs pg_dump + tar of /data, retention 14 days. # Schedule: 0 3 * * * /opt/ai-apps/forgejo/backup.sh >> /opt/ai-apps/forgejo/backup.log 2>&1 set -euo pipefail TS=$(date +%Y%m%d-%H%M%S) DEST=/opt/backups/forgejo mkdir -p "$DEST" echo "[$(date -Iseconds)] backup start" # Postgres dump docker exec forgejo-db pg_dump -U forgejo forgejo | gzip > "$DEST/forgejo-db-$TS.sql.gz" echo " db dump: $(ls -lh $DEST/forgejo-db-$TS.sql.gz | awk '{print $5}')" # Data volume tar docker run --rm \ -v forgejo_forgejo-data:/data:ro \ -v "$DEST":/backup \ alpine \ tar -czf "/backup/forgejo-data-$TS.tar.gz" -C /data . echo " data tar: $(ls -lh $DEST/forgejo-data-$TS.tar.gz | awk '{print $5}')" # Retention: 14 days find "$DEST" -type f -mtime +14 -delete echo "[$(date -Iseconds)] backup complete"