#!/bin/bash # backup.sh — ежедневный бэкап: pg_dump + файлы → локально + Яндекс.Диск set -euo pipefail BACKUP_DIR="/backups/$(date +%Y-%m-%d)" RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-7}" DB_NAMES="${DB_NAMES:-mydb}" TIMESTAMP=$(date +%H%M%S) mkdir -p "$BACKUP_DIR/db" "$BACKUP_DIR/files" echo "=== Backup $TIMESTAMP ===" # 1. Дампы всех БД IFS=',' read -ra databases <<< "$DB_NAMES" for db in "${databases[@]}"; do db=$(echo "$db" | xargs) # trim echo "→ Dumping database: $db" PGPASSWORD="$DB_PASSWORD" pg_dump -h "$DB_HOST" -p "${DB_PORT:-5432}" \ -U "$DB_USER" -d "$db" --format=custom \ -f "$BACKUP_DIR/db/${db}-${TIMESTAMP}.dump" done # 2. Архив файлов echo "→ Archiving files..." tar -czf "$BACKUP_DIR/files/certbot-${TIMESTAMP}.tar.gz" -C /data/certbot . 2>/dev/null || true tar -czf "$BACKUP_DIR/files/uploads-${TIMESTAMP}.tar.gz" -C /data/uploads . 2>/dev/null || true tar -czf "$BACKUP_DIR/files/analytics-${TIMESTAMP}.tar.gz" -C /data/analytics . 2>/dev/null || true # 3. Создаём symlink latest rm -f /backups/latest ln -sf "$BACKUP_DIR" /backups/latest # 4. Ротация — удаляем старше RETENTION_DAYS find /backups -maxdepth 1 -type d -name '2*' -mtime "+$RETENTION_DAYS" -exec rm -rf {} \; 2>/dev/null || true echo "✓ Local backup saved to $BACKUP_DIR" # 5. Синхронизация с Яндекс.Диск if command -v rclone > /dev/null 2>&1 && [ -n "${RCLONE_REMOTE:-}" ]; then echo "→ Syncing to cloud: $RCLONE_REMOTE" rclone sync /backups "$RCLONE_REMOTE" --progress 2>&1 || \ echo " ⚠ Cloud sync failed (check rclone config)" echo "✓ Cloud sync complete" fi echo "=== Backup finished ==="