EP08. "自架基础:Docker 部署要点"
🔒 登录后可标记已读- EP06 讲过自架"免费"实际要花多少钱,这篇讲实际动手要准备什么、怎么部署、最容易踩的几个坑
- n8n 官方推荐的标准自架方式是 Docker,官方文档本身就是照这条路径写的,不是这里另外发明的做法
- 真正要顾的不只是「跑起来」——Webhook 要能稳定接收外部请求,几乎一定要一个域名 + HTTPS,这是新手最容易漏掉、上线后才发现的坑
- 不是从零讲 Docker 是什么(网络上通用 Docker 教程很多),这篇只讲 n8n 自架这件事本身特有的设置和坑
重点内容
开始前要准备什么
- 一台 VPS:1-2 vCPU、1-2GB RAM 起步就能跑起来,个人/小团队用量的话,$5-10/月等级的 VPS(DigitalOcean、Hetzner、Contabo 这类)通常够用,实际花费看 EP06
- Docker(和 Docker Compose):装在 VPS 上,n8n 官方镜像跑在 Docker 容器里,不需要另外装 Node.js 环境
- 一个域名(强烈建议,不是必须):Webhook Trigger 需要外部服务能打到你的 n8n 实例,用 VPS 的裸 IP 也能接,但换 IP、配 HTTPS 证书都麻烦,绑一个域名(子域名也行,比如
n8n.yourdomain.com)配合反向代理长期用更稳定
最基本的启动方式
官方镜像可以直接用 docker run 起一个测试用的实例,数据(工作流、凭据、加密密钥)会存在挂载的 volume 里:
docker volume create n8n_data
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
docker.n8n.io/n8nio/n8n
📌 -v n8n_data:/home/node/.n8n 这行不能省——n8n 默认用 SQLite 把工作流数据存在这个用户目录里,连加密密钥也在这(下面会讲为什么这个密钥很重要),容器重建但没挂载这个 volume,数据会直接消失。
这个命令跑完,浏览器打 http://VPS的IP:5678 就能看到 n8n 的编辑器界面。但这只是「跑起来了」,离能正式上线用还差几步。
几个 n8n 自架专属、容易漏掉的设置
1. WEBHOOK_URL 一定要设成你的公开域名
n8n 默认不知道自己对外的网址是什么,Webhook Trigger 生成的 URL 如果没设这个环境变量,可能会指向 localhost 或内网地址,外部服务(Shopify、Stripe 这类)打不进来。部署时要设:
WEBHOOK_URL=https://n8n.yourdomain.com/
2. N8N_ENCRYPTION_KEY 要固定住,不能每次重启都换
n8n 用这把密钥加密所有存起来的 Credentials(API Key、OAuth Token 这些)。如果不手动设置,n8n 会自动生成一把随机密钥——但这把密钥要是弄丢或者每次重启都变,之前存的所有 Credentials 会全部解不开、直接失效,得重新一个个填一次。
正确做法:自己生成一串固定的密钥(比如用 openssl rand -hex 32),设进环境变量,并且把这串密钥单独备份好(跟 VPS 数据备份分开存一份):
N8N_ENCRYPTION_KEY=你自己生成的固定字符串
3. 数据库:小量用 SQLite 没问题,正式生产环境建议换 Postgres
默认的 SQLite 对个人/小团队测试够用,但资料量变大或需要多个 n8n 实例(worker 模式)共用数据时,官方建议换成 Postgres,用环境变量指定数据库连接信息即可,不用改工作流本身。
反向代理 + HTTPS:不是可选项
n8n 编辑器和 Webhook 都不该直接裸奔在 http:// 上,标准做法是在 VPS 上加一层反向代理(Nginx、Caddy 或 Traefik 都行):
- 反向代理监听公开的 80/443 端口,n8n 容器本身只在内网监听 5678,不直接对外开放
- 反向代理配 Let's Encrypt 免费证书,处理 HTTPS,把请求转发给内部的 n8n 容器
- 域名解析指到 VPS 的 IP,反向代理按域名分流(如果同一台 VPS 还跑别的服务)
Caddy 因为能自动申请和续期 Let's Encrypt 证书,配置最省事,适合不想手动管证书的新手;Nginx/Traefik 更灵活但配置步骤更多。
基本安全设置
- 不要把 5678 端口直接暴露给公网——只开放反向代理用的 80/443,5678 只留给反向代理内网访问,外部直接打 5678 应该打不通
- 开启 Basic Auth 或 n8n 自带的用户登录,避免编辑器网址被搜到/猜到的人直接进去看你的工作流和数据
- 防火墙只开必要端口:80、443(对外),SSH 建议限制成只有自己的 IP 能连,或改用密钥登录、关掉密码登录
- 定期备份:数据库(或 SQLite 文件)+
N8N_ENCRYPTION_KEY两样都要备份,缺一样都无法完整还原
常见问题
- ❌ 部署完发现 Webhook 收不到外部服务的请求——十次有八次是没设
WEBHOOK_URL,或者域名解析/反向代理没配对,检查这两样先 - ❌ 换了台服务器或重建容器后,一堆 Credentials 突然全部要重新登录——
N8N_ENCRYPTION_KEY没有固定下来,用了自动生成的随机密钥,重建容器密钥跟着变,旧数据解不开;这条一定要在第一次部署时就设好并备份 - ❌ 直接把 5678 端口暴露在公网上,没配反向代理和 HTTPS——编辑器和 Webhook 流量都是明文/容易被扫到,正式使用前一定要补上反向代理这一层
- 💡 不想自己处理反向代理、证书、更新这些细节,可以考虑 Sliplane 这类"托管式自架"服务(一个月几欧元起),帮你顾好底层部署,但工作流数据还是跑在你自己的实例上,不是官方 n8n Cloud,费用和取舍见 EP06
- 📌 这篇只讲最基本的单机部署,n8n 多实例/Queue 模式(用 Redis + 多个 worker 处理大量并发执行)是更进阶的话题,官方文档的 Scaling 章节有专门说明,这里不展开
Sources
官方文档:
Blog / Website: