# 安全迁移 n8n:无数据丢失升级 Traefik 到 3.3 和 Postgres 到 16
将 n8n 从过时的 Traefik 和 Postgres 版本迁移到现代技术栈,需要解决关键的兼容性问题。本文提供技术指南,在从 Traefik 1.x 和 Postgres 11 升级到最新版本时,保留数据和凭据。
准备阶段:备份和加密密钥
迁移的关键阶段是正确导出数据并保留加密密钥。没有它,迁移后凭据将无法访问。对于 n8n,这一点至关重要:系统使用对称加密来存储令牌和密码。
执行以下两个必不可少的操作:
- 以
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 错误。系统将识别数据库,但无法解密存储的凭据。
部署技术栈: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 自动设置路由。
注意网络隔离:所有服务必须位于相同的自定义网络(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
暂无评论。