将 n8n 从旧 VPS 迁移到新 VPS 听起来很简单,但实际上如果缺少一些重要步骤,您可能会遇到严重错误,如丢失凭据、webhook 不工作,甚至整个工作流消失。.
本文基于在生产环境中迁移 n8n 的实际经验撰写,确保最安全和最完整的流程。.

迁移过程的目标
迁移完成后,新 VPS 必须确保:
- 正常登录 n8n
- 所有工作流保持完整
- 凭据无错误(不显示红色)
- Webhook 和 Cron 稳定运行
- 执行历史保持不变
需要迁移的组件(非常重要)
完整的 n8n 堆栈包括 4 个必备部分:
1. 数据库
- PostgreSQL / MySQL / SQLite
2. n8n 数据目录
- Workflows
- 凭证
- Executions
3. 环境变量
- 特别是
N8N_ENCRYPTION_KEY
4. 域名 & webhook 配置
注意事项: 缺少这些四个部分中的任何一个都可能导致整个系统出现严重错误。.
步骤 1:在旧 VPS 上准备(源 VPS)
1.1. 检查 n8n 是否正在运行
首先,检查 n8n 当前的运行情况:
bash
docker ps
docker compose ps
确定以下信息:
- 正在使用的数据库类型
- 卷挂载的位置(
~/.n8n或 Docker volume)
1.2. 备份数据库
对于 PostgreSQL:
bash
docker exec -t postgres \
pg_dump -U n8n n8n > n8n.sql
对于 MySQL:
bash
docker exec -t mysql \
mysqldump -u n8n -p n8n > n8n.sql
对于 SQLite:
bash
cp ~/.n8n/database.sqlite n8n.sqlite
1.3. 备份 n8n 数据
如果使用 bind mount:
bash
tar -czvf n8n-data.tar.gz ~/.n8n
如果使用 Docker volume:
bash
docker run --rm \
-v n8n_data:/data \
-v $(pwd):/backup \
alpine tar czvf /backup/n8n-data.tar.gz /data
重要提示: 此目录包含所有已加密的凭据。.
1.4. 保存环境变量(.env)
文件 .env 必须具有以下变量:
env
N8N_ENCRYPTION_KEY=
DB_TYPE=
DB_POSTGRESDB_DATABASE=
DB_POSTGRESDB_USER=
DB_POSTGRESDB_PASSWORD=
N8N_HOST=
WEBHOOK_URL=
⚠️ 警告: 丢失 N8N_ENCRYPTION_KEY 意味着丢失所有凭据!
步骤 2:在新 VPS 上准备(目标 VPS)
2.1. 安装 Docker & Docker Compose
bash
apt update && apt upgrade -y
apt install docker.io docker-compose-plugin -y
systemctl enable docker --now
2.2. 创建项目目录
bash
mkdir -p /opt/n8n
cd /opt/n8n
将以下文件复制到此目录:
docker-compose.yml.env- 备份文件(
n8n.sql,n8n-data.tar.gz)
步骤 3:在新 VPS 上恢复数据
3.1. 恢复 n8n 数据
使用 bind mount:
bash
tar -xzvf n8n-data.tar.gz -C /
使用 Docker volume:
bash
docker volume create n8n_data
docker run --rm \
-v n8n_data:/data \
-v $(pwd):/backup \
alpine tar xzvf /backup/n8n-data.tar.gz -C /
3.2. 恢复数据库
PostgreSQL:
bash
docker compose up -d postgres
docker exec -i postgres \
psql -U n8n n8n < n8n.sql
MySQL:
bash
docker compose up -d mysql
docker exec -i mysql \
mysql -u n8n -p n8n < n8n.sql
步骤 4:启动 n8n
启动 n8n:
bash
docker compose up -d
查看日志以检查:
bash
docker compose logs -f n8n
当看到以下日志行时,n8n 已成功运行:
编辑器现在可以通过以下方式访问:
步骤 5:修复域名 & webhook(最容易忘记的步骤)
5.1. 更新 .env 文件
env
N8N_HOST=n8n.domainmoi.com
N8N_PROTOCOL=https
WEBHOOK_URL=https://n8n.domainmoi.com/
然后重启 n8n:
bash
docker compose restart n8n
5.2. 测试 webhook
- 打开有 webhook 的 workflow
- 点击 测试 URL
- 用浏览器或 curl 测试调用
如果 webhook 出错,几乎可以肯定原因是 WEBHOOK_URL 尚未正确配置。.
步骤 6:迁移后检查清单
- ✅ 成功登录 n8n
- ✅ Workflow 还足够
- ✅ Credentials 不显示红色
- ✅ Webhook 正常工作
- ✅ Cron workflow 按时运行
- ✅ 执行历史完整无缺
迁移 n8n 时常见错误
| 错误 | 原因 | 处理方式 |
|---|---|---|
| 凭证错误 | 丢失加密密钥 | 使用旧密钥 |
| Webhook 返回 404 | 错误 WEBHOOK_URL | 设置正确的域名 |
| 未找到 workflow | 尚未恢复 DB | 重新导入 SQL |
| n8n 持续重启 | DB 环境错误 | 重新检查 .env |
| OAuth 错误 | 更改域名 | 重新授权 |
实际经验
始终在备份前停止 n8n:
bash
docker compose stop n8n
其他一些注意事项:
- 生产环境应使用 PostgreSQL 而非 SQLite
- 保存文件
.env到密码管理器以避免丢失 - 迁移前对 VPS 进行快照,以便需要时回滚
- 如果使用队列模式,记得迁移 Redis
总结
将 n8n 迁移到新 VPS 将完全安全,如果您确保以下 4 个支柱齐全:
- 数据库 – 包含所有 workflows 和 executions
- n8n 数据 – 凭证和配置
- 加密密钥 – 用于解码凭证
- Webhook – 确保域名和 URL 准确
如果您在迁移过程中遇到困难或需要更多支持,请随时在下方留言。请告诉我:
- 您使用 PostgreSQL 还是 MySQL?
- 单 n8n 还是队列模式?
- 是否使用反向代理 (Nginx / Traefik / Cloudflare)?
我会提供支持并给出适合您技术栈的具体命令!
