apiVersion: batch/v1 kind: Job metadata: name: postgres-backup-manual namespace: infra spec: template: spec: containers: - name: postgres-backup image: postgres:15-alpine command: ["/bin/bash", "-c"] args: - | set -eo pipefail echo "=========================================" echo "PostgreSQL Backup Script (Internal)" echo "=========================================" echo "Started at: $(date '+%Y-%m-%d %H:%M:%S')" echo "" # Check if mc client is available (should be in this image) if command -v mc &> /dev/null; then echo "[1/4] MinIO client already available" else echo "[1/4] Installing MinIO client..." apk add --no-cache curl curl -sSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc chmod +x /usr/local/bin/mc echo " ✓ MinIO client installed" fi echo "" # Environment variables BACKUP_DATE=$(date +%Y-%m-%d-%H%M%S) BACKUP_FILE="postgres-backup-${BACKUP_DATE}.sql.gz" S3_PATH="s3://${MINIO_BUCKET}/postgres/${BACKUP_FILE}" echo "Configuration:" echo " PostgreSQL Host: ${POSTGRES_HOST}:${POSTGRES_PORT}" echo " MinIO Endpoint: ${MINIO_ENDPOINT}" echo " Backup File: ${BACKUP_FILE}" echo " S3 Path: ${S3_PATH}" echo "" # Configure MinIO Client (without proxy) echo "[2/4] Configuring MinIO client..." mc alias set minio "${MINIO_ENDPOINT}" "${MINIO_ACCESS_KEY}" "${MINIO_SECRET_KEY}" echo " ✓ MinIO configured" # Test PostgreSQL connection echo "" echo "[3/4] Testing PostgreSQL connection..." export PGPASSWORD="${POSTGRES_PASSWORD}" if psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -c "SELECT 1" &>/dev/null; then echo " ✓ PostgreSQL connection successful" else echo " ✗ PostgreSQL connection failed" exit 1 fi # Execute backup echo "" echo "[4/4] Creating PostgreSQL backup..." echo " Dumping all databases..." # Use pg_dumpall to backup all databases, roles, and permissions pg_dumpall \ -h "${POSTGRES_HOST}" \ -p "${POSTGRES_PORT}" \ -U "${POSTGRES_USER}" \ --clean \ --if-exists \ --verbose \ 2>&1 | gzip > "/tmp/${BACKUP_FILE}" BACKUP_SIZE=$(du -h "/tmp/${BACKUP_FILE}" | cut -f1) echo " ✓ Backup created: ${BACKUP_SIZE}" # Upload to MinIO echo "" echo "Uploading backup to MinIO..." mc cp "/tmp/${BACKUP_FILE}" "${S3_PATH}" # Verify upload if mc stat "${S3_PATH}" &>/dev/null; then echo " ✓ Upload successful" else echo " ✗ Upload failed" exit 1 fi # Clean up local file rm -f "/tmp/${BACKUP_FILE}" echo " ✓ Local file cleaned" # List recent backups echo "" echo "Recent backups:" mc ls "minio/${MINIO_BUCKET}/postgres/" | tail -n 5 # Complete echo "" echo "=========================================" echo "✅ Backup completed successfully" echo "Finished at: $(date '+%Y-%m-%d %H:%M:%S')" echo "=========================================" env: - name: POSTGRES_HOST value: "postgres-infra-postgresql.infra.svc.cluster.local" - name: POSTGRES_PORT value: "5432" - name: POSTGRES_USER value: "postgres" - name: POSTGRES_PASSWORD value: "postgres-root-password-123" - name: MINIO_ENDPOINT value: "http://minio.infra.svc.cluster.local:9000" - name: MINIO_ACCESS_KEY value: "backup-user" - name: MINIO_SECRET_KEY value: "backup-secret-key-123" - name: MINIO_BUCKET value: "backups" volumeMounts: - name: scripts mountPath: /scripts restartPolicy: OnFailure volumes: - name: scripts configMap: name: postgres-backup-script