juntekim.com/mist_infra/scripts/backup_k8s_storage_to_s3.sh
2025-12-14 00:57:19 +00:00

96 lines
2.6 KiB
Bash

#!/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 ==="