返回首页

将 n8n 迁移到 Traefik 3.3 和 Postgres 16:技术指南

从 Traefik 1.x 和 Postgres 11 迁移 n8n 到当前版本的指南。加密密钥问题、Docker API 不兼容性和 Postgres 16 权限的详细解决方案。无停机时间保存数据和账户。

如何将 n8n 无数据丢失迁移到 Traefik 3.3 和 Postgres 16
Advertisement 728x90

# 安全迁移 n8n:无数据丢失升级 Traefik 到 3.3 和 Postgres 到 16

将 n8n 从过时的 Traefik 和 Postgres 版本迁移到现代技术栈,需要解决关键的兼容性问题。本文提供技术指南,在从 Traefik 1.x 和 Postgres 11 升级到最新版本时,保留数据和凭据。

准备阶段:备份和加密密钥

迁移的关键阶段是正确导出数据并保留加密密钥。没有它,迁移后凭据将无法访问。对于 n8n,这一点至关重要:系统使用对称加密来存储令牌和密码。

执行以下两个必不可少的操作:

Google AdInline article slot
  • custom 格式创建数据库备份,以便正确恢复:
docker exec -t postgres_db pg_dump -U root -d n8n -Fc > /tmp/n8n_backup.dump
docker cp postgres_db:/tmp/n8n_backup.dump ./n8n_backup.dump
  • 从配置中提取当前的加密密钥。来源可能在两个地方:

- docker-compose.yml 中的变量 N8N_ENCRYPTION_KEY

- 文件 ~/.n8n/config 中的参数 encryptionKey

忽略此步骤将在启动后导致 Needs first setup 错误。系统将识别数据库,但无法解密存储的凭据。

Google AdInline article slot

部署技术栈:Traefik 3.3 的陷阱

部署 Traefik 3.3 时,会出现与 Docker API 的关键不兼容问题。路由器默认使用过时的 API 版本(1.24),而现代 Docker 守护进程需要 1.41 或更高版本。这会导致在发现容器时出现 404 错误。

解决方案——在环境变量中强制指定 API 版本:

environment:
  - DOCKER_API_VERSION=1.41

此更改使 Traefik 正确与 Docker Engine 交互。没有它,路由器无法看到 n8n 和 Postgres 容器,从而无法通过 Docker Provider 自动设置路由。

Google AdInline article slot

注意网络隔离:所有服务必须位于相同的自定义网络(n8n_net)中。这确保容器之间稳定交互,而不会出现路由冲突。正确配置示例:

networks:
  n8n_net:
    name: n8n_net

services:
  traefik:
    networks:
      - n8n_net
  n8n:
    networks:
      - n8n_net
  postgres_db:
    networks:
      - n8n_net

在 Postgres 16 中恢复数据库:修复权限问题

Postgres 16 引入了默认安全策略的变更。public 架构现在权限受限,导致启动 n8n 时出现 permission denied for schema public 错误。

恢复备份后,运行:

docker cp n8n_backup.dump postgres_db:/tmp/
docker exec -i postgres_db pg_restore -U root -d n8n -1 /tmp/n8n_backup.dump

然后向数据库所有者授予架构的全部权限:

docker exec -it postgres_db psql -U root -d n8n -c "GRANT ALL ON SCHEMA public TO root;"

这是必要的,因为 n8n 会积极使用 public 架构存储元数据。跳过此步骤将导致 n8n 容器反复崩溃。

修复凭据:避免“Needs first setup”错误

即使正确通过环境变量传递 N8N_ENCRYPTION_KEY,n8n 也可能忽略它。原因是环境变量与本地配置文件之间的冲突。在首次启动时,系统会生成新的 ~/.n8n/config 文件,从而覆盖变量中的密钥。

解决方案:

  • 删除容器内的配置文件:
docker exec -it n8n rm /home/node/.n8n/config
  • 重启服务:
docker compose restart n8n

这会强制 n8n 使用环境变量中的密钥,而不是本地文件。请确保在 docker-compose.yml 中指定了原始的 N8N_ENCRYPTION_KEY 变量。

其他注意事项:后台进程和 SQLite

迁移过程中,可能出现使用 SQLite 的后台任务问题(例如基于 Telethon 的 Telegram 解析器)。迁移后,你会看到 sqlite3.OperationalError: database is locked

原因——残留的日志文件(.session-journal.session-wal)锁定了数据库。解决方案:

  • 安装 psmisc 工具:
apt install psmisc -y
  • 强制终止持有锁的进程:
fuser -k -v /root/parser_folder/session_name.session
  • 删除临时文件:
rm -f /root/parser_folder/session_name.session-journal
rm -f /root/parser_folder/session_name.session-wal
  • 重启服务:
systemctl restart service_name.service

重要提示:删除日志文件不会影响主会话文件。Telegram 授权保持完整。

关键要点

  • 加密密钥必不可少——没有原始的 N8N_ENCRYPTION_KEY,所有凭据将无法访问。
  • Traefik 需要显式指定 API——DOCKER_API_VERSION=1.41 参数对容器发现至关重要。
  • Postgres 16 限制权限——手动执行 GRANT ALL ON SCHEMA public
  • n8n 本地配置冲突——删除 ~/.n8n/config 即可解决加密密钥问题。
  • SQLite 锁需要清理——移除 .journal.wal 文件即可恢复后台进程。

完成所有步骤后,n8n 将启动并保留所有工作流、网络钩子和凭据。主要软件版本之间的迁移总是存在风险,但遵循这些步骤可将停机时间和数据丢失降到最低。

— Editorial Team

Advertisement 728x90

继续阅读