兄弟们,作为 N8N大学 的老学长,我见过太多新手在部署 n8n 自动化流水线时,犯下了一个低级但致命的错误:直接把 n8n 裸奔在默认的 SQLite 数据库上。

“明明跑得好好的,为什么要换?” 你可能会问。等到你半夜被报警吵醒,发现工作流全挂、数据丢失、或者并发一高系统直接卡死的时候,你就明白 SQLite 在生产环境是多么脆弱的“纸老虎”了。
今天,笔者就带你彻底搞懂:为什么生产环境必须拥抱 PostgreSQL,以及如何给你的 n8n 换上这颗“工业级心脏”。
SQLite vs PostgreSQL:别拿“玩具”当“武器”
SQLite 就像是你办公桌上的便签本,轻量、随用随取,单机单线程操作非常舒服。但一旦你的 n8n 接入了真实业务,情况就变了:
- 并发瓶颈:SQLite 是文件级锁,一旦两个工作流同时尝试写入数据库,就会发生锁死。并发一高,你的 n8n 就会频繁报错
SQLITE_BUSY,直接卡死。 - 数据丢失风险:SQLite 的数据都在一个文件里。如果服务器突然断电或崩溃,那个正在写入的文件很可能直接损坏,数据恢复?基本没戏。
- 性能上限:当你的执行历史(Execution Log)积累到几十万条时,SQLite 的查询速度会让你怀疑人生,导致 Dashboard 卡顿。
而 PostgreSQL(简称 PG)是真正的客户端/服务器架构,支持行级锁,拥有强大的 MVCC(多版本并发控制),能轻松处理高并发读写,具备完善的 WAL(预写式日志)机制保证数据安全。它是企业级应用的标准,也是 n8n 官方推荐的生产环境首选。
准备工作:磨刀不误砍柴工
在动手之前,你需要准备好以下环境。笔者建议尽量使用 Docker 部署,这是最标准、最不容易出错的方式。
- 一台已经安装好 Docker 和 Docker Compose 的服务器(VPS 或内网服务器均可)。
- 一个空的 PostgreSQL 数据库实例(如果没有,我们马上在下文教你怎么用 Docker 一键起一个)。
- 你现有的 n8n 部署环境(我们将演示如何平滑迁移)。
核心实操:手把手配置 PostgreSQL 连接
我们将分为两种情况:一种是全新安装(推荐),一种是现有 SQLite 数据迁移到 PG。
步骤 1:启动 PostgreSQL 容器(如果还没有)
如果你服务器上还没有 PG,直接用 Docker 运行一个。在你的 docker-compose.yml 中加入以下服务:
services:
postgres:
image: postgres:15
restart: always
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: n8n_password
POSTGRES_DB: n8n
volumes:
- ./postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
执行 docker-compose up -d 启动。记住你的用户名、密码和数据库名,等下要用。
步骤 2:配置 n8n 连接环境变量
这是最关键的一步。找到你的 n8n 服务配置(也就是 docker-compose.yml 中的 n8n 服务),修改 environment 部分。
你需要添加或修改以下两个核心变量:
DB_TYPE: 必须设置为postgresdb。DB_POSTGRESDB_HOST: 填写 postgres 容器的地址。如果在同一个 docker-compose 文件里,直接填postgres(即容器名)。DB_POSTGRESDB_DATABASE,DB_POSTGRESDB_USER,DB_POSTGRESDB_PASSWORD: 对应刚才在 PG 里设置的值。
修改后的 n8n 配置看起来像这样:
n8n:
image: docker.n8n.io/n8nio/n8n
restart: always
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=password
# --- 数据库配置开始 ---
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=n8n_password
# --- 数据库配置结束 ---
ports:
- "5678:5678"
volumes:
- ./n8n_data:/home/node/.n8n
depends_on:
- postgres
步骤 3:执行迁移与重启
保存配置后,执行以下命令:
docker-compose down
docker-compose up -d
注意: 当 n8n 启动时,它会自动检测数据库类型。如果发现是从 SQLite 切换过来的,它会自动执行数据库迁移脚本(Migration),将表结构和数据同步到 PostgreSQL 中(注意:数据迁移通常只迁移工作流和凭证,执行历史可能会清空以保持性能,具体取决于 n8n 版本策略)。
避坑指南:老学长的碎碎念
每次帮群友处理数据库切换,总有几个坑是反复出现的。这里笔者必须提醒你:
1. 网络连接失败(Error: getaddrinfo ENOTFOUND)
如果你看到 n8n 日志里报这个错,说明 n8n 找不到你的 PG 数据库。在 Docker 环境下,DB_POSTGRESDB_HOST 必须填容器名称(比如上面的 postgres),而不是 localhost 或者 127.0.0.1。除非你把 PG 端口映射出来并在 n8n 容器外连接,否则千万别用 localhost。
2. 认证失败(password authentication failed)
这是最常见的配置错误。仔细检查 DB_POSTGRESDB_USER 和 DB_POSTGRESDB_PASSWORD 是否和 PG 容器里的 POSTGRES_USER 和 POSTGRES_PASSWORD 完全一致。PostgreSQL 对密码验证非常严格。
3. 千万不要手动修改 PG 数据
n8n 在 PG 中创建的表结构非常复杂,关联很多外键。除非你是数据库专家,否则绝对不要手动去 PG 里删数据或改表结构,这会导致 n8n 无法启动且极难修复。
FAQ:你可能还想问
Q1: 我已经在用 SQLite 跑了很久了,数据怎么迁移过去?
A: 按照上面的步骤配置好 PG 环境变量并重启 n8n 即可。n8n 启动时会自动检测并执行迁移。为了安全起见,强烈建议在操作前先备份 n8n_data 文件夹。
Q2: PostgreSQL 配置太麻烦了,有没有折中方案?
A: 如果你的业务量真的非常小,且不在乎执行历史丢失,SQLite 勉强能用。但只要是涉及生产环境、重要业务流,或者团队协作,请务必使用 PostgreSQL。这是对数据负责。
Q3: 我可以使用云数据库(如 AWS RDS 或阿里云 RDS)吗?
A: 完全可以!这是更专业的做法。你只需要将 DB_POSTGRESDB_HOST 改为云数据库的公网/内网地址,并确保 n8n 服务器能访问该数据库的端口(通常是 5432)。
总结与资源
从 SQLite 切换到 PostgreSQL,是 n8n 用户从“玩票”走向“工程化”的必经之路。虽然配置上多写了几个环境变量,但它换来的是系统的稳定性、数据的安全性以及未来的扩展能力。
我是 N8N大学 的老学长,希望这篇硬核教程能帮你避开我曾经踩过的坑。如果你在配置过程中遇到任何报错,欢迎在评论区留言,我会尽力解答。