#!/usr/bin/env bash set -euo pipefail # -------------------------------------------------- # Config # -------------------------------------------------- BACKUP_DATE="$(date +%Y-%m-%d)" TMP_DIR="/tmp/backup-${BACKUP_DATE}" K8S_STORAGE="/k8s_storage" S3_BASE="s3://mist-backups/${BACKUP_DATE}" POSTGRES_NAMESPACE="default" POSTGRES_POD_LABEL="app=postgres" POSTGRES_USER="postgres" POSTGRES_DB="stripe_invoice" mkdir -p "$TMP_DIR/postgres" echo "=== Backup date: $BACKUP_DATE ===" # -------------------------------------------------- # 1. Discover schemas (for documentation) # -------------------------------------------------- echo "=== Discovering Postgres schemas ===" POSTGRES_POD="$(kubectl get pods -n "$POSTGRES_NAMESPACE" \ -l "$POSTGRES_POD_LABEL" \ -o jsonpath='{.items[0].metadata.name}')" SCHEMAS="$(kubectl exec -n "$POSTGRES_NAMESPACE" "$POSTGRES_POD" -- \ psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Atc \ "SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'information_schema') ORDER BY schema_name;")" # Write README { echo "Database: ${POSTGRES_DB}" echo "Schemas:" for s in $SCHEMAS; do echo "- $s" done echo echo "Backup date: ${BACKUP_DATE}" echo "Host: mist" } > "$TMP_DIR/postgres/README.txt" echo "✓ Schemas documented" # -------------------------------------------------- # 2. Postgres logical backup (FULL DB) # -------------------------------------------------- echo "=== Dumping Postgres database ===" kubectl exec -n "$POSTGRES_NAMESPACE" "$POSTGRES_POD" -- \ pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" \ | gzip > "$TMP_DIR/postgres/stripe_invoice.sql.gz" echo "✓ Postgres dump complete" # -------------------------------------------------- # 3. Filesystem backup (best-effort) # -------------------------------------------------- echo "=== Archiving /k8s_storage ===" tar \ --ignore-failed-read \ --warning=no-file-changed \ -czf "$TMP_DIR/k8s_storage.tar.gz" \ -C "$K8S_STORAGE" . echo "✓ Filesystem archive complete" # -------------------------------------------------- # 4. Upload to S3 # -------------------------------------------------- echo "=== Uploading to S3 ===" aws s3 cp "$TMP_DIR/k8s_storage.tar.gz" \ "${S3_BASE}/k8s_storage.tar.gz" aws s3 cp "$TMP_DIR/postgres/stripe_invoice.sql.gz" \ "${S3_BASE}/postgres/stripe_invoice.sql.gz" aws s3 cp "$TMP_DIR/postgres/README.txt" \ "${S3_BASE}/postgres/README.txt" echo "✓ Upload complete" # -------------------------------------------------- # 5. Cleanup # -------------------------------------------------- rm -rf "$TMP_DIR" echo "=== Backup finished successfully ==="