VPSKnow

海外 VPS 开发机迁移与恢复:项目、Docker、密钥和备份实操

中级
28分钟

开发机迁移的目标不是“把文件复制过去”,而是证明新机能构建、启动、访问、备份和恢复。旧机在验收完成前保留运行,迁移过程才有可靠回退点。

先确定迁移策略和回退窗口

可重建

系统、Node、Git、Docker 由安装清单重建,不复制旧系统垃圾。

必须备份

项目源码外的数据库、上传文件、Volume、配置和未推送提交。

单独处理

.env、SSH 私钥、API Key 和部署 Secret 加密迁移并安排轮换。

盘点旧机环境

先记录系统、磁盘、内存、容器、常驻服务和主要运行时版本。输出中如有主机名、IP、仓库地址或容器环境变量,公开分享前需要脱敏。

set -euo pipefail

uname -a
df -hT
free -h
docker ps --format 'table {{.Names}}	{{.Image}}	{{.Status}}'
systemctl --type=service --state=running --no-pager
git --version
node --version
docker --version

分别备份代码、数据与密钥

Git 仓库先推送已确认的提交;未跟踪文件、数据库和 Docker Volume 另行备份。下面示例只归档项目文件,并主动排除依赖、构建产物和 `.env`。

set -euo pipefail

project_dir="${PROJECT_DIR:-/srv/projects}"
backup_dir="${BACKUP_DIR:-/srv/backups/dev-machine}"
backup_name="dev-machine-$(date -u +%Y%m%dT%H%M%SZ).tar.gz"

mkdir -p "${backup_dir}"
tar   --exclude='.git'   --exclude='node_modules'   --exclude='dist'   --exclude='.env'   -czf "${backup_dir}/${backup_name}"   -C "${project_dir}" .

sha256sum "${backup_dir}/${backup_name}" > "${backup_dir}/${backup_name}.sha256"
sha256sum --check "${backup_dir}/${backup_name}.sha256"
  • 数据库使用对应的逻辑备份工具,并在新机实际执行一次恢复。
  • Docker Volume 先停止写入或使用应用支持的一致性备份方式。
  • 备份文件复制到另一台机器或对象存储,不能只留在待下线旧机。
  • Secret 使用密码管理器、部署平台 Secret 或加密文件传输。

在新机恢复项目

新机先完成普通用户、SSH、防火墙和运行时安装,再以新目录解压。校验和不通过时立即停止,不继续启动不完整的数据。

set -euo pipefail

archive_path="${ARCHIVE_PATH:?请设置 ARCHIVE_PATH}"
restore_dir="${RESTORE_DIR:-/srv/projects-restored}"

sha256sum --check "${archive_path}.sha256"
mkdir -p "${restore_dir}"
tar -xzf "${archive_path}" -C "${restore_dir}"
find "${restore_dir}" -maxdepth 2 -type f | sort | head -n 50

启动服务并完成验收

恢复后先检查配置,再拉取镜像和启动服务。健康检查地址应使用项目自己的本地端口;没有 `/health` 时,至少验证主页、核心 API 和数据库读写。

set -euo pipefail

cd "${PROJECT_DIR:?请设置 PROJECT_DIR}"

git status --short
docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
curl --fail --show-error --silent http://127.0.0.1:3000/health

不要把“容器显示 Up”当成迁移成功。还要验证登录、写入、后台任务、Webhook、定时任务、备份和从备份恢复。

切换入口并保留回退

  1. 切换前降低 DNS TTL,并记录旧值。
  2. 使用临时域名或本地 hosts 验证新机 HTTPS 和核心流程。
  3. 切换 DNS、反向代理或隧道入口,观察错误日志和资源占用。
  4. 旧机保持只读或低流量运行,避免两边同时写入。
  5. 完成一个工作周期和一次恢复演练后,再取消旧机。

常见问题

可以直接复制整个系统盘吗?

可以做块级镜像,但跨厂商和跨虚拟化环境更容易遇到引导、网卡和磁盘布局问题。开发机通常更适合重装系统后恢复项目、容器数据和配置。

.env 和 SSH 私钥怎么迁移?

单独加密传输,并在新机恢复后轮换高价值密钥。不要把它们打进普通项目压缩包或提交到 Git。

什么时候可以关闭旧机?

新机完成构建、健康检查、外部访问、备份恢复和至少一个完整工作周期后,再降低旧机流量并保留短期回退窗口。