#!/bin/bash set -eo pipefail # Configuration CONTAINER_NAME="${DB_CONTAINER_NAME:-canino_db_prod}" DB_USER="${POSTGRES_USER:-canino_prod}" DB_NAME="${POSTGRES_DB:-caninodb_prod}" BACKUP_DIR="${BACKUP_DIR:-/var/backups/canina_db}" RETENTION_DAYS=7 TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_FILE="${BACKUP_DIR}/canina_db_${TIMESTAMP}.sql.gz" echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] Starting automated PostgreSQL backup..." echo "Target Container: ${CONTAINER_NAME}" echo "Database: ${DB_NAME}" echo "Backup Output: ${BACKUP_FILE}" # Ensure backup directory exists mkdir -p "${BACKUP_DIR}" # Execute compressed database dump if docker exec "${CONTAINER_NAME}" pg_dump -U "${DB_USER}" -d "${DB_NAME}" | gzip > "${BACKUP_FILE}"; then BACKUP_SIZE=$(du -h "${BACKUP_FILE}" | cut -f1) echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] Backup completed successfully! File size: ${BACKUP_SIZE}" else echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] ERROR: Backup failed!" >&2 rm -f "${BACKUP_FILE}" exit 1 fi # Purge backups older than RETENTION_DAYS (7 days) echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] Purging backups older than ${RETENTION_DAYS} days from ${BACKUP_DIR}..." find "${BACKUP_DIR}" -type f -name "canina_db_*.sql.gz" -mtime +"${RETENTION_DAYS}" -exec rm -f {} \; -verbose || true echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] Backup process completed."