Files
ljwx-k8s/postgres-backup-job.yaml
2026-02-20 22:50:45 +08:00

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