Ubuntu 22.04 上用 Docker Compose 部署 n8n 2.43.7
Ubuntu 22.04 实测:Docker Compose 部署 n8n 2.43.7 全流程——compose 模板、启动验证、Owner 初始化、Secure Cookie、数据持久化、加密密钥与 PostgreSQL 切换。
Ubuntu 22.04 上用 Docker Compose 部署 n8n 2.43.7
> 目标:在 Ubuntu 22.04 服务器上用 Docker Compose 把 n8n 2.43.7 从零跑到生产可用:安装编排工具 → 编写 compose 文件 → 启动验证 → Owner 初始化 → 数据持久化与加密密钥管理 → 可选切 PostgreSQL。全部命令与回显均在实测环境采集(2026-10-17)。
一、前置条件
实测环境版本:
$ docker --version
Docker version 29.8.1, build 4a63305
$ docker compose version
Docker Compose version v5.5.1
Ubuntu 22.04 若尚未安装 Docker,用官方 apt 仓库安装(摘要):
sudo apt-get update && sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
镜像体积提示:n8nio/n8n:2.43.7 解压后 1.8 GB(docker images 实测),首次 pull 需要几分钟。
二、最小可用:一条 docker run(验证用)
快速验证网络与镜像可用性(数据落在容器内,不要用于生产):
docker run -d --name n8n-test -p 5678:5678 -v /opt/n8n-data:/home/node/.n8n n8nio/n8n:2.43.7
curl -s http://localhost:5678/healthz # → {"status":"ok"}
实测启动日志关键行:
No encryption key found - Auto-generating and saving to: /home/node/.n8n/config
Initializing n8n process
n8n ready on ::, port 5678
生产部署请继续用下面的 Compose 方式。
三、生产推荐:docker-compose.yml(实测文件)
services:
n8n:
image: n8nio/n8n:2.43.7 # 固定版本号,不用 latest
container_name: n8n-compose-lab
restart: unless-stopped
ports:
- "5679:5678" # 宿主端口按需改,容器内固定 5678
environment:
- GENERIC_TIMEZONE=Asia/Shanghai
- TZ=Asia/Shanghai
- N8N_RUNNERS_ENABLED=true # 任务运行器(2.x 默认趋势为开启,显式声明)
# - N8N_SECURE_COOKIE=false # 仅纯 HTTP 内网访问时需要,见第五节
# - N8N_ENCRYPTION_KEY=<自定义密钥> # 见第七节
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
字段说明:
| 字段 | 为什么 |
|---|---|
image: n8nio/n8n:2.43.7 | 固定小版本,升级可控(升级流程见《n8n 2.43.7 运维手册:备份、升级、日志与监控》) |
restart: unless-stopped | 宿主重启后自动拉起,手动 stop 不被拉起 |
n8n_data 命名卷 | 实测 down/up 后用户、工作流全部保留(见第六节) |
GENERIC_TIMEZONE | 定时触发器与执行计划使用的时区,实测改它后接口回显 timezone 随之变化 |
N8N_RUNNERS_ENABLED | 2.x 的任务运行器(Code 节点在独立 runner 执行),实测启动日志会出现 n8n Task Broker ready on 127.0.0.1, port 5679 |
启动与验证(实测回显):
$ docker compose up -d
Container n8n-compose-lab Created
Container n8n-compose-lab Started
$ docker compose ps
NAME IMAGE STATUS
n8n-compose-lab n8nio/n8n:2.43.7 Up ...
$ curl -s http://localhost:5679/healthz
{"status":"ok"}
$ docker compose logs --tail 5 n8n
n8n ready on ::, port 5678
n8n Task Broker ready on 127.0.0.1, port 5679
Editor is now accessible via:
...
⚠️ 首次启动会完整跑一遍数据库迁移(日志中几十条
Starting migration ... / Finished migration ...),迁移过程中不要停容器。
四、首次初始化(Owner 账户)
浏览器打开 http://<服务器IP>:5679,按引导设置 Owner 邮箱与密码。等价的底层接口(实测可直接调用):
curl -s -X POST http://localhost:5679/rest/owner/setup \
-H 'Content-Type: application/json' \
-d '{"email":"admin@example.com","password":"<强密码>","firstName":"Admin","lastName":"User"}'
# → HTTP 200,返回用户对象
登录接口(实测):
curl -s -i -X POST http://localhost:5679/rest/login \
-H 'Content-Type: application/json' \
-d '{"emailOrLdapLoginId":"admin@example.com","password":"<强密码>"}'
五、HTTP 访问必读:N8N_SECURE_COOKIE
实测对比:默认配置下登录响应的 Cookie 为
Set-Cookie: n8n-auth=...; Max-Age=604800; Path=/; HttpOnly; Secure; SameSite=Lax
Secure 标志意味着浏览器只会在 HTTPS 下回传 Cookie——你用 http://IP:5679 能打开页面、能完成 setup,但登录态无法保持。两种解法:
- 上反向代理 + TLS(推荐):Nginx/Caddy 终结 HTTPS 后反代到 5679,Cookie 正常。
- 纯内网 HTTP 临时用:环境变量加
N8N_SECURE_COOKIE=false,实测 Cookie 变为HttpOnly; SameSite=Lax(无 Secure),HTTP 登录正常。生产环境不要长期关闭。
六、数据持久化实测
# 1) 初始化 Owner(HTTP 200)
# 2) 销毁容器
$ docker compose down
Network n8n-doc-lab_default Removed
# 3) 重建
$ docker compose up -d
Container n8n-compose-lab Started
# 4) 用同一账号登录
$ curl -s -o /dev/null -w '%{http_code}\n' -X POST http://localhost:5679/rest/login \
-H 'Content-Type: application/json' -d '{"emailOrLdapLoginId":"...","password":"..."}'
200
登录返回 200,证明用户数据完整保留。数据实际落在命名卷:
$ docker volume ls | grep n8n
n8n-doc-lab_n8n_data
$ docker exec n8n-compose-lab ls -la /home/node/.n8n/
-rw------- config # 加密密钥(务必额外备份!)
-rw-r----- database.sqlite # 主库(SQLite)
-rw-r----- database.sqlite-shm / -wal
drwxr-xr-x nodes/ # 社区节点
drwxr-xr-x storage/
若想直接绑定宿主目录(方便备份),把卷换成 - /opt/n8n-data:/home/node/.n8n 即可。
七、加密密钥(丢了凭证就解不开了)
- 不设置
N8N_ENCRYPTION_KEY时,首启自动生成并写入数据目录config文件(日志原文:No encryption key found - Auto-generating and saving to: ...)。 - 凭证(Credentials)用该密钥 AES 加密入库。
config文件必须纳入备份;多实例共享同一数据目录时必须显式设置相同的N8N_ENCRYPTION_KEY。 - 密钥丢失 = 所有已存凭证作废,工作流本身(JSON)不受影响。
八、可选:切换 PostgreSQL
执行量大或将来要多实例时,直接在 Compose 里加 PostgreSQL(实测切换成功):
services:
n8n:
# ...其余同上,去掉 n8n_data 卷中的数据库依赖不需要改
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=换强密码
depends_on:
- postgres
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=n8n
- POSTGRES_PASSWORD=换强密码
- POSTGRES_DB=n8n
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
pg_data:
实测:n8n 启动时在空库自动完成全部迁移,\dt 统计 157 张表,/healthz 正常。SQLite → PostgreSQL 的历史数据迁移官方不走自动转换,建议初始就定好。
九、防火墙与收尾
sudo ufw allow 5679/tcp # 或只放行反向代理来源
建议生产拓扑:客户端 → Nginx/Caddy(TLS + 域名)→ 127.0.0.1:5679。
下一步推荐阅读:
- 环境变量逐条含义与实测回显 →《n8n 2.43.7 配置参数详解(环境变量实测)》
- 备份、升级、日志与监控 →《n8n 2.43.7 运维手册:备份、升级、日志与监控》
- 不装编排工具的裸机部署(npm + systemd)→《n8n 2.43.7 运维手册:备份、升级、日志与监控》第四节