435 字
2 分钟
一种备份本地Postgres和Redis数据库到Neon和Upstash的方法
Postgress
从Neon拉取到本地
- 使用本地的postgres从neon dump
sudo docker compose exec -T memos-postgres pg_dump "You_PG_URL" > ./backup/memos_backup.sql- 恢复到本地postgres数据库
cat ./backup/memos_backup.sql | sudo docker compose exec -T memos-postgres psql -U memos -d memos备份到云端
-
创建脚本 sync_to_cloud_backup.sh
#!/bin/bashset -euo pipefail# === Configuration ===# 1. Your Compose project network's full name# Verify with: sudo docker network ls | grep caddy_networkCOMPOSE_NETWORK="docker_caddy_network"# 2. Backup path (using your home directory for safety)BACKUP_DIR="/home/yukki/docker/backup"mkdir -p "$BACKUP_DIR"DUMP_FILE="$BACKUP_DIR/redis.dump" # Define the dump file name# 3. PostgreSQL (Neon connection string)NEON_DB_URL="You_PG_URL"# 4. Redis (Upstash connection string)UPSTASH_URL="You_Upstash_URL"# 5. Log fileLOG_FILE="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).log"exec > >(tee -a "$LOG_FILE") 2>&1echo "===== Backup started at $(date) ====="# === PostgreSQL Part (Memos Backup) ===# ... (This part was correct, keep it) ...echo "[1/2] Dumping PostgreSQL from 'memos-postgres'..."docker compose exec -T memos-postgres \pg_dump -U memos -d memos --format=custom \> "$BACKUP_DIR/memos.dump"echo "[1/2] Restoring PostgreSQL dump to Neon..."docker run --rm -v "$BACKUP_DIR/memos.dump:/backup/memos.dump" postgres:17 \pg_restore --clean --no-acl --no-owner -d "$NEON_DB_URL" /backup/memos.dumpecho "✅ PostgreSQL (Memos) backup to Neon successful."# === Redis Part (LunaTV Backup) ===# !!! Using the Go binary to DUMP and redis-cli to PIPE from file !!!echo "[2/2] Dumping Redis from 'lunatv-redis' (using Go tool)..."# !!! Prerequisite: Ensure lunatv-redis exposes port 6379 to host's localhost:# ports:# - "127.0.0.1:6379:6379"# (Restart lunatv-redis if you just added this)# Execute the Go binary to dump to the file# Using the correct flags based on its help output./backup/upstash-redis-dump \-host localhost \-port 6379 \--output resp \> "$DUMP_FILE"echo "[2/2] Piping Redis dump file to Upstash (using redis-cli)..."# Execute redis-cli inside the lunatv-redis container# Use --tls and --pipe, reading (<) from the dump file# Note: We mount the backup dir into the container temporarilydocker run --rm \--network="$COMPOSE_NETWORK" \-v "$BACKUP_DIR:/backup" \redis:alpine \sh -c "redis-cli --tls -u '$UPSTASH_URL' --pipe < /backup/redis.dump"echo "✅ Redis (LunaTV) backup to Upstash successful."# Cleanup the temporary dump file (optional)# rm -f "$DUMP_FILE"echo "===== Backup finished successfully at $(date) =====" -
下载upstash-redis-dump到backup目录 https://github.com/upstash/upstash-redis-dump
-
给予执行权限
Terminal window chmod +x /home/yukki/docker/sync_to_cloud_backup.shchmod +x /home/yukki/docker/backup/upstash-redis-dump -
执行脚本
Terminal window sudo /home/yukki/docker/sync_to_cloud_backup.sh -
定时备份
Terminal window sudo crontab -e# 每天凌晨 3:00 执行备份脚本0 3 * * * /usr/bin/bash /home/yukki/docker/sync_to_cloud_backup.sh >> /home/yukki/docker/backup/cron_$(date +\%Y\%m\%d).log 2>&1
一种备份本地Postgres和Redis数据库到Neon和Upstash的方法
https://yukkihome.netlify.app/posts/docker/redis-and-postgres-backup/