#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" source "$REPO_ROOT/.env" source "$REPO_ROOT/nextcloud/.env" DATA_ROOT="${DATA_ROOT:-/opt/docker-data}" BACKUP_DIR="/opt/backups" DATE=$(date +%Y-%m-%d) KEEP_DAYS=7 mkdir -p "$BACKUP_DIR" echo "==> Starting backup ($DATE)..." # ------------------------------------------------------------------ # Nextcloud Postgres dump # ------------------------------------------------------------------ echo " -> Dumping Nextcloud Postgres..." docker exec nextcloud-postgres pg_dumpall -U "$POSTGRES_USER" > "$BACKUP_DIR/nextcloud-db-$DATE.sql" # ------------------------------------------------------------------ # Nextcloud data # ------------------------------------------------------------------ echo " -> Archiving Nextcloud data..." tar -czf "$BACKUP_DIR/nextcloud-data-$DATE.tar.gz" \ -C "$DATA_ROOT" nextcloud/data nextcloud/html/config # ------------------------------------------------------------------ # Gitea data # ------------------------------------------------------------------ echo " -> Archiving Gitea data..." tar -czf "$BACKUP_DIR/gitea-$DATE.tar.gz" \ -C "$DATA_ROOT" gitea/data gitea/config # ------------------------------------------------------------------ # Rotate old backups # ------------------------------------------------------------------ echo " -> Removing backups older than $KEEP_DAYS days..." find "$BACKUP_DIR" -type f -name "*.sql" -mtime +$KEEP_DAYS -delete find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +$KEEP_DAYS -delete echo "==> Backup complete. Files in $BACKUP_DIR:" ls -lh "$BACKUP_DIR"/*"$DATE"* 2>/dev/null || echo " (no files found)" echo "" echo "To schedule daily backups, add to crontab (crontab -e):" echo " 0 3 * * * $REPO_ROOT/backup.sh >> /var/log/backup.log 2>&1"