#!/bin/bash # PostgreSQL Backup Script for Proxmox LXC Container # Load environment variables if [ -f ../.env ]; then source ../.env else echo "Error: .env file not found!" exit 1 fi # Set default values if not provided in .env BACKUP_DIR=${BACKUP_DIR:-"../backups"} POSTGRES_USER=${POSTGRES_USER:-"postgres"} POSTGRES_DB=${POSTGRES_DB:-"postgres"} BACKUP_RETENTION_DAYS=${BACKUP_RETENTION_DAYS:-7} # Create backup directory if it doesn't exist mkdir -p ${BACKUP_DIR} # Generate timestamp for backup file TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_FILE="${BACKUP_DIR}/postgres_backup_${TIMESTAMP}.sql.gz" echo "Starting PostgreSQL backup..." echo "Database: ${POSTGRES_DB}" echo "Backup file: ${BACKUP_FILE}" # Perform the backup docker exec -t postgres pg_dump -U ${POSTGRES_USER} -d ${POSTGRES_DB} | gzip > ${BACKUP_FILE} # Check if backup was successful if [ $? -eq 0 ]; then echo "Backup completed successfully: ${BACKUP_FILE}" # Remove backups older than retention period find ${BACKUP_DIR} -name "postgres_backup_*.sql.gz" -type f -mtime +${BACKUP_RETENTION_DAYS} -delete echo "Cleaned up old backups (older than ${BACKUP_RETENTION_DAYS} days)" else echo "Error: Backup failed!" exit 1 fi # Print backup information echo "Backup size: $(du -h ${BACKUP_FILE} | cut -f1)" echo "Available backups:" ls -lh ${BACKUP_DIR} # Create a full volume backup as well (for disaster recovery) echo "Creating volume backup..." VOLUME_BACKUP_FILE="${BACKUP_DIR}/postgres_volume_backup_${TIMESTAMP}.tar.gz" docker run --rm -v postgres_data:/data -v $(pwd)/${BACKUP_DIR}:/backup alpine tar -czf /backup/$(basename ${VOLUME_BACKUP_FILE}) /data if [ $? -eq 0 ]; then echo "Volume backup completed successfully: ${VOLUME_BACKUP_FILE}" else echo "Warning: Volume backup failed!" fi exit 0