435 字
2 分钟
一种备份本地Postgres和Redis数据库到Neon和Upstash的方法

Postgress#

从Neon拉取到本地#

  1. 使用本地的postgres从neon dump
Terminal window
sudo docker compose exec -T memos-postgres pg_dump "You_PG_URL" > ./backup/memos_backup.sql
  1. 恢复到本地postgres数据库
Terminal window
cat ./backup/memos_backup.sql | sudo docker compose exec -T memos-postgres psql -U memos -d memos

备份到云端#

  1. 创建脚本 sync_to_cloud_backup.sh

    #!/bin/bash
    set -euo pipefail
    # === Configuration ===
    # 1. Your Compose project network's full name
    # Verify with: sudo docker network ls | grep caddy_network
    COMPOSE_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 file
    LOG_FILE="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).log"
    exec > >(tee -a "$LOG_FILE") 2>&1
    echo "===== 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.dump
    echo "✅ 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 temporarily
    docker 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) ====="
  2. 下载upstash-redis-dump到backup目录 https://github.com/upstash/upstash-redis-dump

  3. 给予执行权限

    Terminal window
    chmod +x /home/yukki/docker/sync_to_cloud_backup.sh
    chmod +x /home/yukki/docker/backup/upstash-redis-dump
  4. 执行脚本

    Terminal window
    sudo /home/yukki/docker/sync_to_cloud_backup.sh
  5. 定时备份

    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/
作者
MuYukki
发布于
2025-10-29
许可协议
CC BY-NC-SA 4.0