feat: add database and Redis backup/restore scripts

- scripts/backup-db.sh: pg_dump compressed backup with table count
  verification, optional MinIO upload, auto-prune keeping last 7
- scripts/restore-db.sh: restore from backup with safety confirmation,
  scales down services during restore, re-grants permissions, scales
  back up with correct replica counts
- scripts/backup-redis.sh: triggers BGSAVE, copies RDB dump locally,
  shows key stats
This commit is contained in:
Celes Renata
2026-04-16 00:10:27 +00:00
parent 4634f1f3fc
commit 357e68a764
3 changed files with 272 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
#!/usr/bin/env bash
set -euo pipefail
# Stonks Oracle — Redis State Backup
# Triggers a Redis BGSAVE and copies the RDB dump file locally.
# Useful before major deployments or database resets.
#
# Usage:
# ./scripts/backup-redis.sh
#
# Requires: kubectl access to the cluster
NAMESPACE_REDIS="redis-service"
REDIS_POD="redis-master-0"
REDIS_PASSWORD="${REDIS_PASSWORD:-PSCh4ng3me!}"
BACKUP_DIR="${BACKUP_DIR:-$HOME/backups/stonks-oracle}"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="redis-${TIMESTAMP}.rdb"
BACKUP_PATH="${BACKUP_DIR}/${BACKUP_FILE}"
echo "=== Stonks Oracle Redis Backup ==="
echo "Timestamp: ${TIMESTAMP}"
mkdir -p "${BACKUP_DIR}"
# Trigger BGSAVE
echo "[1/3] Triggering Redis BGSAVE..."
kubectl exec -n "${NAMESPACE_REDIS}" "${REDIS_POD}" -- \
redis-cli -a "${REDIS_PASSWORD}" BGSAVE 2>/dev/null
# Wait for save to complete
echo " Waiting for background save..."
sleep 5
LAST_SAVE=$(kubectl exec -n "${NAMESPACE_REDIS}" "${REDIS_POD}" -- \
redis-cli -a "${REDIS_PASSWORD}" LASTSAVE 2>/dev/null)
echo " Last save timestamp: ${LAST_SAVE}"
# Copy the RDB file
echo "[2/3] Copying RDB dump..."
kubectl cp "${NAMESPACE_REDIS}/${REDIS_POD}:/data/dump.rdb" "${BACKUP_PATH}" 2>/dev/null || \
echo "WARNING: Could not copy RDB file (path may differ)"
if [ -f "${BACKUP_PATH}" ]; then
BACKUP_SIZE=$(du -h "${BACKUP_PATH}" | cut -f1)
echo " Size: ${BACKUP_SIZE}"
else
echo " RDB copy failed — checking alternative paths..."
# Try common Redis data paths
for path in /data/dump.rdb /var/lib/redis/dump.rdb /bitnami/redis/data/dump.rdb; do
kubectl cp "${NAMESPACE_REDIS}/${REDIS_POD}:${path}" "${BACKUP_PATH}" 2>/dev/null && break
done
if [ -f "${BACKUP_PATH}" ]; then
BACKUP_SIZE=$(du -h "${BACKUP_PATH}" | cut -f1)
echo " Size: ${BACKUP_SIZE}"
else
echo "WARNING: Could not locate RDB dump file"
fi
fi
# Show key stats
echo "[3/3] Redis key stats..."
kubectl exec -n "${NAMESPACE_REDIS}" "${REDIS_POD}" -- \
redis-cli -a "${REDIS_PASSWORD}" INFO keyspace 2>/dev/null | grep "^db"
echo ""
echo "=== Redis backup complete ==="
echo "File: ${BACKUP_PATH}"