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:
Executable
+69
@@ -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}"
|
||||
Reference in New Issue
Block a user