#!/bin/bash # Database backup script for ciyuan_viewfinder # Usage: ./scripts/backup_db.sh # Recommended: add to crontab for daily backups # Example crontab: 0 3 * * * /path/to/server/scripts/backup_db.sh set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SERVER_DIR="$(dirname "$SCRIPT_DIR")" # Load .env if [ -f "$SERVER_DIR/.env" ]; then export $(grep -v '^#' "$SERVER_DIR/.env" | xargs) fi DB_HOST="${DB_HOST:-10.0.10.11}" DB_PORT="${DB_PORT:-5432}" DB_NAME="${DB_NAME:-ciyuan_viewfinder}" DB_USER="${DB_USER:-shiran}" BACKUP_DIR="${BACKUP_DIR:-$SERVER_DIR/backups}" RETENTION_DAYS="${RETENTION_DAYS:-30}" mkdir -p "$BACKUP_DIR" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${TIMESTAMP}.sql.gz" echo "[$(date)] Starting backup of $DB_NAME..." pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" \ --no-owner --no-acl --format=plain \ | gzip > "$BACKUP_FILE" echo "[$(date)] Backup saved to $BACKUP_FILE ($(du -sh "$BACKUP_FILE" | cut -f1))" # Cleanup old backups find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete echo "[$(date)] Cleaned up backups older than $RETENTION_DAYS days" echo "[$(date)] Backup complete."