目录

n8n 自托管部署教程:使用 Docker Compose、PostgreSQL 和 HTTPS

在自己的电脑上测试无误后,如果要让工作流 24 小时运行,并让 Webhook、Telegram 等外部服务能够访问,就需要将 n8n 部署到一台有固定网址的服务器上。

准备事项

  • 一台 Linux 云主机(VPS)。轻度使用时,1~2 核心、2 GB 内存就够了;工作流较多或要运行本地 AI 模型,则需要更高配置。
  • 一个域名,并将子域名(例如 n8n.example.com)的 DNS A 记录指向主机 IP。
  • 主机上已安装 Docker 和 Docker Compose(参见 Docker 教程:安装)。
  • 防火墙已开放 80、443 端口。

架构

互联网 ──HTTPS──▶ Caddy(自动获取证书) ──▶ n8n:5678 ──▶ PostgreSQL
  • Caddy:反向代理,自动申请和更新 Let's Encrypt 证书
  • PostgreSQL:正式使用时推荐的数据库(默认的 SQLite 适合个人或测试用途)
  • n8n 和数据库都不会直接对外开放

从 n8n 2.x 起,不再支持使用 MySQL / MariaDB 作为 n8n 数据库,请使用 PostgreSQL 或 SQLite。

文件

在主机上创建文件夹 /opt/n8n:

/opt/n8n/
├── compose.yaml
├── .env
└── Caddyfile

.env

DOMAIN=n8n.example.com
POSTGRES_PASSWORD=请换成一组很长的随机密码
N8N_ENCRYPTION_KEY=请换成另一组很长的随机字符串

生成随机字符串:

openssl rand -hex 32

N8N_ENCRYPTION_KEY 用于加密所有凭据。请另外妥善备份,密钥丢失后,所有凭据都将无法使用。

Caddyfile

{$DOMAIN} {
    reverse_proxy n8n:5678
}

compose.yaml

services:
  caddy:
    image: caddy:2
    ports:
      - "80:80"
      - "443:443"
    environment:
      DOMAIN: ${DOMAIN}
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
    restart: unless-stopped

  postgres:
    image: postgres:17
    environment:
      POSTGRES_USER: n8n
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: n8n
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U n8n -d n8n"]
      interval: 5s
      retries: 10
    restart: unless-stopped

  n8n:
    image: n8nio/n8n:2.42.7   # 请改成你要使用的固定版本
    environment:
      DB_TYPE: postgresdb
      DB_POSTGRESDB_HOST: postgres
      DB_POSTGRESDB_PORT: 5432
      DB_POSTGRESDB_DATABASE: n8n
      DB_POSTGRESDB_USER: n8n
      DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
      N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
      N8N_HOST: ${DOMAIN}
      N8N_PORT: 5678
      N8N_PROTOCOL: https
      N8N_WEBHOOK_URL: https://${DOMAIN}/
      N8N_PROXY_HOPS: 1
      NODE_ENV: production
      GENERIC_TIMEZONE: Asia/Taipei
      TZ: Asia/Taipei
      N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
      EXECUTIONS_DATA_PRUNE: "true"
      EXECUTIONS_DATA_MAX_AGE: 336
    volumes:
      - n8n_data:/home/node/.n8n
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

volumes:
  caddy_data:
  pg_data:
  n8n_data:

重要环境变量说明

变量说明
N8N_HOST、N8N_PROTOCOL对外使用的域名和协议,会影响 OAuth 回调 URL 等
N8N_WEBHOOK_URLWebhook 的外部 URL。未设置时,Webhook 节点会显示 http://localhost:5678/...。对于 n8n 2.30 之前的版本,请改用 WEBHOOK_URL
N8N_PROXY_HOPS位于反向代理后方时设为 1,这样 n8n 才能获取用户的真实 IP
N8N_ENCRYPTION_KEY凭据加密密钥
GENERIC_TIMEZONE定时任务使用的时区
EXECUTIONS_DATA_PRUNE、EXECUTIONS_DATA_MAX_AGE自动删除超过指定小时数(336 小时 = 14 天)的执行记录,避免数据库无限增长

启动

cd /opt/n8n
docker compose up -d
docker compose logs -f n8n

几分钟内,Caddy 会自动获取证书。打开 https://n8n.example.com,创建所有者账号。

请立即创建账号。 在设置好所有者账号之前,任何访问这个网址的人都可以抢先创建账号。

安全建议

  • 使用固定版本的镜像标签,不要使用 latest;升级前先阅读版本说明。
  • 主机只开放 22、80、443 端口,SSH 只允许使用密钥登录。
  • 为账号启用两步验证(在个人设置中)。
  • 不需要的危险节点(例如用于执行系统命令的节点)在 2.x 中默认已停用,请勿随意启用。
  • 定期备份(参见 备份与更新)。

搭配本地 AI 模型

如果要让 n8n 使用本地 Ollama 模型,可以在同一个 compose.yaml 中加入 ollama 服务,参见 n8n 接入 Ollama。注意,AI 模型需要更多内存和计算资源,普通的小型 VPS 无法运行。

大量执行:Queue mode

工作流数量很多、运行频繁时,可以启用 queue mode:由主进程接收触发,再交给多个 worker 通过 Redis 队列并行执行。这属于进阶部署,请参阅官方文档中关于 queue mode 的说明。

更新于 2026年10月12日