135 lines
4.5 KiB
YAML
135 lines
4.5 KiB
YAML
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 |