Files
nextcloud-selfhosted/scripts/backup.sh

49 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
source "$REPO_ROOT/.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 nextcloud > "$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"