n8n 部署
2026 年 n8n VPS 自托管部署指南:Docker Compose、PostgreSQL、HTTPS 与备份
从零把 n8n 部署到 VPS:服务器规格、Docker Compose、PostgreSQL、Caddy HTTPS、Webhook URL、加密密钥、备份和安全检查。
如果你只是想快速做自动化,并且没有 Linux 运维经验,优先考虑 n8n Cloud 或 Make。自托管 n8n 的优势是数据和成本可控,但你也要负责更新、备份、证书、数据库和安全。
下面这套方案适合小团队、个人自动化、内部工具原型:一台 VPS + Docker Compose + PostgreSQL + Caddy 自动 HTTPS。它比单容器 SQLite 更接近生产环境,也方便以后迁移。
你应该先准备什么
- 一台 Ubuntu 22.04 或 24.04 VPS。
- 一个域名或子域名,例如
n8n.example.com。 - DNS A 记录指向 VPS 公网 IP。
- 2GB RAM 起步,建议 2 vCPU / 4GB RAM 作为更稳的基础规格。
- 会使用 SSH 和编辑服务器文件。
如果你还没有 VPS,可以先比较几家支持 Docker、快照、固定公网 IP 的服务商。本文默认不做性能承诺,选择标准放在可维护性和风险控制上。
查看 Vultr 官方站点 查看 Hostinger VPS 官方站点
第一步:安装 Docker
登录服务器后,先更新系统并安装 Docker。不同发行版的安装方式会变化,最终只要确认两个命令可用:
docker --version
docker compose version
n8n 官方 Docker Compose 文档也强调,自托管需要你理解服务器、容器、安全和配置。没有这些经验时,云服务通常更省心。
第二步:创建目录和环境变量
mkdir -p ~/n8n-stack
cd ~/n8n-stack
openssl rand -hex 32
把生成的随机字符串保存为 N8N_ENCRYPTION_KEY。这个密钥用于加密凭据,丢失后会影响已保存凭据的读取。不要把它提交到 Git。
创建 .env:
DOMAIN_NAME=example.com
SUBDOMAIN=n8n
GENERIC_TIMEZONE=Asia/Shanghai
SSL_EMAIL=you@example.com
POSTGRES_USER=n8n
POSTGRES_PASSWORD=change-this-long-password
POSTGRES_DB=n8n
N8N_ENCRYPTION_KEY=paste-your-random-key
N8N_HOST=n8n.example.com
WEBHOOK_URL=https://n8n.example.com/
N8N_PROTOCOL=https
N8N_PROXY_HOPS=1
WEBHOOK_URL 很重要。n8n 在反向代理后面运行时,内部端口通常不是公网 HTTPS 地址。手动设置后,Slack、飞书、Stripe、Webhook 等外部服务才能拿到正确回调地址。
第三步:写 Docker Compose
创建 compose.yaml:
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
n8n:
image: docker.n8n.io/n8nio/n8n:stable
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
GENERIC_TIMEZONE: ${GENERIC_TIMEZONE}
N8N_HOST: ${N8N_HOST}
N8N_PROTOCOL: ${N8N_PROTOCOL}
WEBHOOK_URL: ${WEBHOOK_URL}
N8N_PROXY_HOPS: ${N8N_PROXY_HOPS}
N8N_BLOCK_ENV_ACCESS_IN_NODE: "true"
volumes:
- n8n_data:/home/node/.n8n
- ./local-files:/files
expose:
- "5678"
caddy:
image: caddy:2-alpine
restart: unless-stopped
depends_on:
- n8n
ports:
- "80:80"
- "443:443"
environment:
N8N_HOST: ${N8N_HOST}
SSL_EMAIL: ${SSL_EMAIL}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
volumes:
postgres_data:
n8n_data:
caddy_data:
caddy_config:
创建 Caddyfile:
{$N8N_HOST} {
encode gzip zstd
reverse_proxy n8n:5678
tls {$SSL_EMAIL}
}
启动:
mkdir -p local-files
docker compose up -d
docker compose logs -f n8n
浏览器打开 https://n8n.example.com,完成第一个 owner 账号创建。
第四步:上线前安全检查
- 确认只开放
80、443、22,SSH 最好限制密钥登录。 - 立即开启 n8n 账号的 2FA。
- 不要把
.env、数据库备份、N8N_ENCRYPTION_KEY放到公开仓库。 - 如果不需要公开 API,就关闭或限制相关能力。
- 将
N8N_BLOCK_ENV_ACCESS_IN_NODE设为true,降低工作流读取环境变量的风险。 - 定期更新 n8n,因为自动化工具经常连接大量外部服务,安全更新不能拖。
n8n 官方安全文档建议从 SSL、SSO、2FA、执行数据脱敏、公共 API、节点限制、SSRF 防护等方面做安全加固。个人 VPS 至少要做到 HTTPS、强密码、2FA、备份和及时更新。
第五步:备份和恢复
最低限度备份两类数据:
- PostgreSQL 数据库。
n8n_data卷和.env中的加密密钥。
手动备份示例:
cd ~/n8n-stack
mkdir -p backups
docker compose exec -T postgres pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" > "backups/n8n-$(date +%F).sql"
docker run --rm -v n8n-stack_n8n_data:/data -v "$PWD/backups:/backup" alpine tar czf "/backup/n8n-data-$(date +%F).tar.gz" -C /data .
恢复前先停服务,并确认 N8N_ENCRYPTION_KEY 是原来的值。
docker compose stop n8n
docker compose exec -T postgres psql -U "$POSTGRES_USER" "$POSTGRES_DB" < backups/n8n-2026-05-01.sql
docker compose up -d
第六步:什么时候需要升级架构
单机 Compose 足够跑很多个人和小团队自动化。出现下面情况,再考虑队列模式:
- 工作流执行时间长,经常阻塞。
- Webhook 请求量明显增加。
- 多人同时编辑和运行流程。
- 大文件处理导致内存压力。
n8n 的队列模式需要 Redis、PostgreSQL 和 worker。官方文档也提醒,队列模式下 SQLite 不适合,worker 需要共享同一个加密密钥。
常见问题
n8n 自托管比云端便宜吗?
小流量通常便宜,但你的时间、更新、备份和安全都要算成本。如果你不想维护服务器,n8n Cloud 或 Make 更合适。
没有域名可以部署吗?
可以本地或内网使用,但公开 Webhook、OAuth 回调和 HTTPS 会变麻烦。长期使用建议绑定域名。
为什么不用 SQLite?
SQLite 适合快速体验。只要进入长期使用、多人协作、重要凭据和稳定任务,PostgreSQL 更容易维护和迁移。
可以把 n8n 暴露在公网吗?
可以,但要认真做 HTTPS、账号保护、更新、备份和访问控制。不要把未更新的公开实例长期裸奔。
参考资料
- n8n Docker Compose 官方文档:https://docs.n8n.io/hosting/installation/server-setups/docker-compose/
- n8n Webhook URL 反向代理配置:https://docs.n8n.io/hosting/configuration/configuration-examples/webhook-url/
- n8n 加密密钥配置:https://docs.n8n.io/hosting/configuration/configuration-examples/encryption-key/
- n8n 安全文档:https://docs.n8n.io/hosting/securing/overview/
- n8n 队列模式:https://docs.n8n.io/hosting/scaling/queue-mode/