Ubuntu 22.04 上用 Docker Compose 部署 n8n 2.43.7

Ubuntu 22.04 实测:Docker Compose 部署 n8n 2.43.7 全流程——compose 模板、启动验证、Owner 初始化、Secure Cookie、数据持久化、加密密钥与 PostgreSQL 切换。

n8nn8nDocker容器化部署2026/10/17

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_ENABLED2.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":"<强密码>"}'

实测对比:默认配置下登录响应的 Cookie 为

Set-Cookie: n8n-auth=...; Max-Age=604800; Path=/; HttpOnly; Secure; SameSite=Lax

Secure 标志意味着浏览器只会在 HTTPS 下回传 Cookie——你用 http://IP:5679 能打开页面、能完成 setup,但登录态无法保持。两种解法:

  1. 上反向代理 + TLS(推荐):Nginx/Caddy 终结 HTTPS 后反代到 5679,Cookie 正常。
  2. 纯内网 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。

下一步推荐阅读:

相关文档