n8n 迁移到新 VPS 指南 (Docker) – 完整 & 安全
作者: DPS.MEDIA

n8n 迁移到新 VPS 指南 (Docker) – 完整 & 安全

将 n8n 从旧 VPS 迁移到新 VPS 听起来很简单,但实际上如果缺少一些重要步骤,您可能会遇到严重错误,如丢失凭据、webhook 不工作,甚至整个工作流消失。.

本文基于在生产环境中迁移 n8n 的实际经验撰写,确保最安全和最完整的流程。.

n8n 迁移到新 VPS 指南 (Docker) – 完整 & 安全
n8n 迁移到新 VPS 指南 (Docker) – 完整 & 安全

迁移过程的目标

迁移完成后,新 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

  1. 打开有 webhook 的 workflow
  2. 点击 测试 URL
  3. 用浏览器或 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 个支柱齐全:

  1. 数据库 – 包含所有 workflows 和 executions
  2. n8n 数据 – 凭证和配置
  3. 加密密钥 – 用于解码凭证
  4. Webhook – 确保域名和 URL 准确

如果您在迁移过程中遇到困难或需要更多支持,请随时在下方留言。请告诉我:

  • 您使用 PostgreSQL 还是 MySQL?
  • 单 n8n 还是队列模式?
  • 是否使用反向代理 (Nginx / Traefik / Cloudflare)?

我会提供支持并给出适合您技术栈的具体命令!

DPS.MEDIA