docker部署n8n最稳定,应避免npm全局安装;必须挂载数据卷、启用https反向代理、使用postgresql替代sqlite,并通过docker-compose管理生产环境配置。

直接用 Docker 跑最稳,别碰 npm 全局安装
Linux 上装 n8n,优先选 Docker。npm 全局安装(npm install -g n8n)在生产环境容易出问题:Node.js 版本冲突、权限混乱、升级后配置丢失、无法优雅重启。Docker 镜像自带运行时和依赖,版本锁定,数据卷隔离,重启不丢工作流。
关键点:
-
docker.n8n.io/n8nio/n8n是官方镜像,别用第三方或老旧的n8n/n8n - 必须挂载数据卷(如
-v n8n_data:/home/node/.n8n),否则容器一删,所有工作流、凭证全没了 - 默认端口
5678仅限本地访问,外网要用nginx反向代理 + HTTPS,不能直接暴露 - 启动前先创建数据卷:
docker volume create n8n_data
用 docker-compose.yml 管理才像生产环境
单条 docker run 命令适合试水,但真要长期跑,必须写 docker-compose.yml。它能固化环境变量、网络配置、健康检查、重启策略,还能和数据库、Nginx 联动部署。
一个最小可用的 docker-compose.yml 示例(含基础安全):
version: '3.8'
services:
n8n:
image: docker.n8n.io/n8nio/n8n
restart: unless-stopped
ports:
- "127.0.0.1:5678:5678"
volumes:
- n8n_data:/home/node/.n8n
environment:
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=your_strong_password
- N8N_DEFAULT_LOCALE=zh-CN
- DB_TYPE=postgres
- DB_POSTGRES_HOST=postgres
- DB_POSTGRES_PORT=5432
- DB_POSTGRES_DATABASE=n8n
- DB_POSTGRES_USER=n8n
- DB_POSTGRES_PASSWORD=postgres_password
volumes:
n8n_data:
注意:
-
ports绑定到127.0.0.1,防止端口被扫到 -
N8N_BASIC_AUTH_*必须设,否则 Web UI 没登录页,裸奔风险极高 - 生产环境务必换掉
DB_TYPE=sqlite,SQLite 并发写入会锁死,postgres或mysql才撑得住多用户+定时任务
配 HTTPS 和反向代理是上线前最后一关
直接用 http://your-server:5678 访问,浏览器会标“不安全”,部分节点(如 Google OAuth、Webhook 回调)会拒绝连接。必须走 https://n8n.yourdomain.com。
推荐组合:nginx(反代) + certbot(自动续签):
- nginx 配置里,
proxy_pass http://127.0.0.1:5678,且必须加proxy_set_header X-Forwarded-Proto $scheme,否则 n8n 生成的 Webhook URL 仍是 http -
certbot --nginx -d n8n.yourdomain.com会自动改 nginx 配置并加 HTTPS 重定向 - 证书每月自动续期命令:
sudo certbot renew --quiet --post-hook "systemctl reload nginx" - 别漏开防火墙:
sudo ufw allow 80,443,5678 端口不用对外开
数据库选型别踩 SQLite 这个坑
默认 SQLite 看似省事,但只要满足以下任一条件,就必须换数据库:
- 有 2 个以上用户同时编辑工作流
- 启用了定时触发器(
Cron节点)或 Webhook,QPS > 1 - 工作流执行日志要保留超过 7 天
PostgreSQL 是首选:
- 用
DB_TYPE=postgres启动时,n8n 会自动建表,无需手动初始化 - JSONB 字段天然适配 n8n 的执行数据结构,查询快、压缩好
- 备份简单:
pg_dump -U n8n n8n_db > backup.sql - 避免用 root 或 postgres 用户连,单独建用户并只赋
CONNECT和USAGE权限
MySQL 也行,但要注意:sql_mode 不能含 STRICT_TRANS_TABLES,否则插入失败;字符集必须是 utf8mb4。











