开发机迁移的目标不是“把文件复制过去”,而是证明新机能构建、启动、访问、备份和恢复。旧机在验收完成前保留运行,迁移过程才有可靠回退点。
先确定迁移策略和回退窗口
可重建
系统、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、定时任务、备份和从备份恢复。
切换入口并保留回退
- 切换前降低 DNS TTL,并记录旧值。
- 使用临时域名或本地 hosts 验证新机 HTTPS 和核心流程。
- 切换 DNS、反向代理或隧道入口,观察错误日志和资源占用。
- 旧机保持只读或低流量运行,避免两边同时写入。
- 完成一个工作周期和一次恢复演练后,再取消旧机。
常见问题
可以直接复制整个系统盘吗?⌄
可以做块级镜像,但跨厂商和跨虚拟化环境更容易遇到引导、网卡和磁盘布局问题。开发机通常更适合重装系统后恢复项目、容器数据和配置。
.env 和 SSH 私钥怎么迁移?⌄
单独加密传输,并在新机恢复后轮换高价值密钥。不要把它们打进普通项目压缩包或提交到 Git。
什么时候可以关闭旧机?⌄
新机完成构建、健康检查、外部访问、备份恢复和至少一个完整工作周期后,再降低旧机流量并保留短期回退窗口。