目录
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_URL | Webhook 的外部 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日