所有凭证突然全部解密失败
数据卷被重建了,n8n 因此生成了一把全新的加密密钥。没有任何办法能找回旧的凭证。请始终显式设置 N8N_ENCRYPTION_KEY,并在服务器之外另存一份副本。

六个步骤,从一台裸的 Nordic VPS,到您自己域名下、由 TLS 终结的 n8n——Docker Compose、Caddy、PostgreSQL,真正能触发的 webhook。执行次数只受您的 CPU 限制,而非套餐等级,而这台机器每月只需 $3.90。已在 Debian 12 与 n8n 2.x 上测试通过。
配置
VPS + 一条 A 记录
安装
get.docker.com
Compose
n8n + Caddy + Postgres
首次启动
所有者账户 + 2FA
Webhook
WEBHOOK_URL
安全加固
清理、静默、备份
n8n 是一个工作流自动化引擎:一块可视化画布,您在其中把一个触发器——webhook、计划任务、数据库中的一条新记录、队列中的一条消息——接入一串节点,这些节点调用 API、转换数据、按条件分支、运行任意的 JavaScript 或 Python,并把结果交给流程中的下一环。软件本身内置了几百个集成节点,再加上一个能覆盖其余一切场景的通用 HTTP Request 节点。从 1.x 系列开始,它还带有 AI Agent 和 LLM 节点,这也是为什么 2026 年安装它的人中,有相当大一部分是在搭建智能体,而不是传统的 ETL 管道。
在您输入第一行命令之前,真正重要的是许可证问题,因为 n8n 并不是 OSI 意义上的开源软件,这个区别不只是学术上的。核心部分以 Sustainable Use License 发布:一份非独占、免版税、面向全球的授权,允许您出于内部业务目的,以及个人或非商业用途,使用、复制、修改和分发该软件。它所保留的,是向他人就 n8n 或其衍生品收费的权利——正是这一条款,排除了在此基础上搭建一款付费“托管 n8n”产品的可能。另外,文件名中带 .ee.,或路径中带 .ee 的任何文件,完全被排除在该许可证之外,需要付费的 n8n Enterprise License。
说得明白一点:在 VPS 上运行 n8n,用来自动化您自己的公司、您以服务形式为客户交付的工作,或者您自己的个人生活,一直都在免费授权范围之内。把 n8n 作为托管产品出售则不在此列。网上几乎每一场“n8n 到底是不是免费的”争论,说到底都是两个人隔着这条界线各说各话。
成本这一面。 n8n Cloud 按执行次数计价:Starter 套餐按年计费,每月 €20,包含 2,500 次执行;Pro 套餐每月 €50,包含 10,000 次;Business 套餐每月 €667,包含 40,000 次。自托管的话,执行次数根本不是一项计费条目——它只受这台机器有多少 CPU 和内存的限制。一个每五分钟轮询一次 API 的工作流,单独就会消耗每月 8,640 次执行;在 Cloud 上,光是这一个工作流就已经迫使您升级到 Pro 档位,而在一台 $3.90 的 VPS 上,这不过是空闲 CPU 里一个微不足道的零头。
| 选项 | 按月 | 包含的执行次数 | 由谁来运行它 |
|---|---|---|---|
| n8n Cloud · Starter | €20 | 2 500 | n8n GmbH |
| n8n Cloud · Pro | €50 | 10 000 | n8n GmbH |
| n8n Cloud · Business | €667 | 40 000 | n8n GmbH |
| 自托管 · Sentinel VPS | $3.90 | 受 CPU 限制,而非按量计费 | 您 |
云端价格为 n8n.io 于 2026 年 8 月公布的按年计费价格;按月计费更贵。这笔权衡不只是钱的问题——自托管会把升级、备份、TLS 续期和正常运行时间的责任都转移到您这一边。
n8n 官方的 Docker Compose 文档给出的最低配置是 2 vCPU 和 4 GB 内存。这不是一个营销数字:低于这个配置,编辑器前端和一个分支适中的工作流会互相争抢内存,而第一个体积较大的 JSON 负载就会以内存溢出(out-of-memory)的方式把容器直接干掉。
Sentinel · 2 vCPU、4 GB、120 GB NVMe,$3.90/月。 正确的默认选择。同时运行 n8n、PostgreSQL 和 Caddy,对于每天执行几百次的个人或小团队实例还留有余量。三个容器加起来,空闲内存占用大约在 700 MB 左右。
Garrison · 4 vCPU、8 GB、240 GB NVMe,$7.90/月。 当您加入带 Redis 的队列模式和一两个 worker 容器时,当工作流经常在内存中持有数兆字节的负载时,或者当您希望为分出多个并行分支的 AI 智能体工作流留出充裕余量时,就该升级到这一档。
Ravelin · 8 vCPU、16 GB、480 GB NVMe,$16.90/月。 适用于每天数千次执行、且以二进制处理为主的团队实例——PDF 生成、图像处理、音频转录。这里独立核心很重要,因为这些负载受 CPU 限制,而非受 API 限制。
磁盘是人们容易忘记的那一部分。 n8n 会保存每一次执行中每一个节点的完整输入和输出。一个每分钟运行一次、数据量又大的工作流,每周会写入数百兆字节的数据。默认设置确实会做清理——EXECUTIONS_DATA_PRUNE 为 true,EXECUTIONS_DATA_MAX_AGE 为 336 小时(十四天),EXECUTIONS_DATA_PRUNE_MAX_COUNT 为 10 000——但对一个繁忙的实例来说,十四天的数据仍然会占用相当可观的 NVMe 空间。步骤 06 会进一步收紧这些设置。
在控制面板中:Order → VPS → Sentinel,镜像选 Debian 12。开户无需邮箱地址,全程不要求任何身份证件,账单可用 Monero、Bitcoin、Lightning 或其他任一支持的资产结算。选择节点位置时,应以到您所自动化的服务的延迟为准,而不是到您自己的延迟——一台自动化服务器与 API 对话的频率,远高于与您对话的频率。
在您动手配置服务器之前,先创建 DNS 记录:为 n8n.example.com 添加一条指向该 VPS IPv4 的 A 记录,如果使用 IPv6,再添加一条 AAAA 记录。这一步必须先做,因为 Caddy 一旦启动就会立刻向 Let's Encrypt 申请证书,而针对一个尚未解析的域名申请证书会失败——然后进入退避等待,您就会白白花上二十分钟纳闷网站为什么打不开。
给 DNS 一分钟时间生效,并在继续之前,从您自己的机器上确认一下:
dig +short n8n.example.com
# → the IPv4 of your VPS, and nothing else
在任何服务监听公网端口之前,先执行首小时加固清单——仅密钥 SSH、只放行 22、80、443 端口且不留其他缺口的防火墙,以及无人值守的安全更新。自动化服务器就是一个凭证保险柜,值得花这整整一个小时。
通过 SSH 登录,安装带有 Compose v2 插件的 Docker Engine:
apt update && apt install -y ca-certificates curl
curl -fsSL https://get.docker.com | sh
docker compose version
这个便捷脚本会从 Docker 官方仓库安装 Engine、CLI、containerd 和 Compose 插件。最后一行应打印出 v2 或更高版本的 Docker Compose;如果打印的是“docker: 'compose' is not a docker command”,说明您装的是发行版自带的旧版 docker.io 软件包,应先将其卸载。
确实存在一行命令就能完成这一切的 n8n 安装脚本,而且它也能用。但本指南选择手写 Compose 文件,因为您日后需要修改的一切——加密密钥、数据库、webhook 地址、保留策略、worker 数量——都存在于这个文件之中,而一个您读不懂的技术栈,也是您在凌晨三点没法修好的技术栈。
先创建目录,并生成两个密钥。请现在按此顺序生成,并随生成随粘贴进 .env——尤其是加密密钥,必须在 n8n 首次启动之前就已存在,而不是之后。
mkdir -p /opt/n8n && cd /opt/n8n
openssl rand -hex 32 # → N8N_ENCRYPTION_KEY
openssl rand -hex 24 # → POSTGRES_PASSWORD
/opt/n8n/.env
DOMAIN=n8n.example.com
LETSENCRYPT_EMAIL=you@example.com
GENERIC_TIMEZONE=Europe/Stockholm
N8N_ENCRYPTION_KEY=paste_the_32_byte_hex_here
POSTGRES_DB=n8n
POSTGRES_USER=n8n
POSTGRES_PASSWORD=paste_the_24_byte_hex_here
立即锁定该文件——它保管着这个实例日后将存储的每一项凭证所依赖的密钥:
chmod 600 /opt/n8n/.env
/opt/n8n/docker-compose.yml
services:
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- DOMAIN=${DOMAIN}
- LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
volumes:
- pg_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
- N8N_HOST=${DOMAIN}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- N8N_EDITOR_BASE_URL=https://${DOMAIN}
- WEBHOOK_URL=https://${DOMAIN}/
- N8N_PROXY_HOPS=1
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${GENERIC_TIMEZONE}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_BLOCK_ENV_ACCESS_IN_NODE=true
- N8N_DIAGNOSTICS_ENABLED=false
- N8N_VERSION_NOTIFICATIONS_ENABLED=false
- N8N_PERSONALIZATION_ENABLED=false
volumes:
- n8n_data:/home/node/.n8n
volumes:
caddy_data:
caddy_config:
pg_data:
n8n_data:
/opt/n8n/Caddyfile
{$DOMAIN} {
encode zstd gzip
tls {$LETSENCRYPT_EMAIL}
reverse_proxy n8n:5678
}
两个值得说明的设计决定。 第一,n8n 不对外发布端口。只有 Caddy 绑定 80 和 443;n8n 在 Compose 网络内部监听 5678 端口,主机外部完全无法触及。令人意外的是,相当数量的自托管 n8n 实例直接以 5678 端口暴露在公网上、前面没有任何 TLS,而扫描暴露服务的搜索引擎会把它们收录进去。第二,即便现在工作流数据已经保存在 PostgreSQL 中,n8n 数据卷仍然保持挂载——那个目录里仍然存放着实例设置、日志文件和源码控制相关的资源。
启动它:
cd /opt/n8n
docker compose up -d
docker compose logs -f caddy # watch the certificate being issued
打开 https://n8n.example.com。第一个界面是所有者账户设置——邮箱、密码、姓名。已经不再需要配置任何 HTTP 基本认证的环境变量了;从 1.x 系列开始,用户管理就已内置于 n8n 中,您在这里创建的账户就是该实例的所有者。使用密码管理器生成的密码,然后直接前往 Settings → Personal → Two-factor authentication 并开启它。这次登录,就是您日后粘贴进任何节点的每一个 API 密钥的大门。
n8n 用 N8N_ENCRYPTION_KEY 加密每一项存储的凭证。如果您不设置它,n8n 会在首次启动时自动生成一个,并写入数据卷内部。一旦重建这个卷——一次 docker compose down -v、一次向新服务器的迁移、一次不小心的恢复操作——新实例就会生成一把不同的密钥,数据库中的每一项凭证都会变得无法解密,而且完全没有任何恢复途径。您只能手动重新输入每一个 API 密钥、OAuth 令牌和密码。请像本指南这样,显式设置这把密钥,并在服务器之外另存一份副本。
存放那份副本的合适位置,是一个同样由您掌控的密码管理器——自托管 Vaultwarden 指南介绍了其中一种,其中刻意强调的一点是:它不应该和它所解锁的那台机器放在一起。
确认数据库确实是 PostgreSQL,而不是回退到了 SQLite——如果 DB_ 相关变量写错了,n8n 会悄悄地以 SQLite 启动,而您可能要到三个月后才会发现:
docker compose exec postgres psql -U n8n -d n8n -c '\dt' | head
# → a list of n8n tables (workflow_entity, credentials_entity, execution_entity…)
一个能启动、显示编辑器并跑通手动测试的 n8n,还算不上真正可用的 n8n。悄无声息出问题的那一半是入站 webhook,而且它出错的方式常常看起来像是第三方服务的责任。
WEBHOOK_URL. 没有它,n8n 会根据 N8N_HOST 和 N8N_PORT 来构建 webhook 地址,给您的可能是类似 http://localhost:5678/webhook/abc 这样的地址——而当您把它粘贴进 Stripe 或 GitHub 时,那里永远无法访问到它。上面的 Compose 文件把 WEBHOOK_URL 设为公网 HTTPS 根地址,这才是编辑器会显示、外部世界也真正能够调用的地址。
N8N_EDITOR_BASE_URL. 这是 n8n 在它发送的邮件——密码重置、用户邀请——中所使用链接的公网地址。这里配错了,意味着一条指向 localhost 的邀请链接,招来的是同事的求助工单,而不是某个集成出了故障。
N8N_PROXY_HOPS. n8n 从 X-Forwarded-For 中读取客户端 IP,而它只信任这个数字所指定的跳数。前面只有一层反向代理时——也就是本方案中的 Caddy——这个值应为 1。如果再在 Caddy 前面加一层 Cloudflare,就变成 2。如果保持默认的 0,每个请求看起来都会像是来自代理本身,这会悄悄破坏限速以及您工作流中任何基于 IP 的逻辑。
N8N_SECURE_COOKIE. 它默认是 true,意味着会话 cookie 只会通过 HTTPS 发送。这是正确的设置,本方案也满足这一点。了解这一点很有必要,因为它解释了首次尝试用普通 http 访问时的经典症状:登录表单接受了密码,随后又把您带回登录表单,如此循环往复。正确的解决办法是配好 TLS,而不是把这个开关关掉。
认真测试一下。创建一个带 Webhook 节点的工作流,激活它,复制生产地址(Production URL),然后从一台不是服务器本身的机器上调用它:
curl -i https://n8n.example.com/webhook/<path>
# → HTTP/2 200, and a new execution visible in the editor
这个区别几乎每个人都曾踩过一次坑:测试地址(Test URL)只在您打开编辑器、并启用了“Listen for test event”时才会监听。生产地址(Production URL)只有在工作流被切换为 Active 状态时才存在。一个在编辑器里能用、在生产环境却返回 404 的 webhook,几乎总是因为工作流没有被激活。
保留期。 默认设置会保留十四天或 10 000 次执行的数据,以先到者为准,且每个节点的完整输入输出数据都会保存下来。在容量较小的 NVMe 上,配合一个繁忙的计划触发器,这正是把磁盘填满的元凶。请把以下内容加入 n8n 的环境变量块,然后重启:
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=168 # hours — one week
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=5000
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=none # keep failures, drop the noise
在高频实例上,EXECUTIONS_DATA_SAVE_ON_SUCCESS=none 是收益最大的单一设置:它会停止写入成功运行的负载数据,同时仍完整保存每一次失败的运行,方便您调试。在仍处于搭建工作流阶段时,保持“all”;一旦工作流变得平淡无奇、稳定运行,再切换过来。
静默。 Compose 文件已经关闭了诊断、版本通知和个性化调查。剩下还在对外发起请求的,是从 api.n8n.io 拉取内容的模板库;如果您希望完全不发起任何第三方请求,就设置 N8N_TEMPLATES_ENABLED=false。如果您确实关闭了版本通知,请在日历上设一个每月提醒,去阅读发布说明——一个没人更新的自托管实例,比一个会检查版本的实例结果要糟糕得多。
Code 节点。 文件中已经写好的 N8N_BLOCK_ENV_ACCESS_IN_NODE=true,会阻止表达式和 Code 节点读取进程的环境变量——在这台机器上,这意味着 PostgreSQL 密码和加密密钥。如果您不使用公开的 REST API,再加上 N8N_PUBLIC_API_DISABLED=true,把这个面也一并关闭。
备份——三部分缺一不可。 没有加密密钥,单独的数据库备份毫无价值;单独的密钥同样什么都恢复不了。请将 PostgreSQL 转储、n8n 数据卷和 .env 一并备份,并至少保留一份异地副本:
cd /opt/n8n
docker compose exec -T postgres pg_dump -U n8n n8n | gzip > backup-db-$(date +%F).sql.gz
docker run --rm -v n8n_n8n_data:/data -v "$PWD":/backup alpine \
tar czf /backup/backup-vol-$(date +%F).tar.gz -C /data .
cp .env backup-env-$(date +%F)
卷名是 Compose 项目名加上卷名本身;如果您的目录不叫 n8n,请运行 docker volume ls,以实际看到的名称为准。把这三行放进一个 cron 任务里,把归档文件发送到别处,并至少实测恢复一次——一份从未测试过的备份,只是一种信念,不是备份。
更新。 先执行 docker compose pull,再执行 docker compose up -d。先做一次快照:n8n 会在启动时执行数据库迁移,而迁移在设计上并不支持回滚。跨主版本升级时——比如从 1.x 跳到 2.x——请在拉取镜像之前而不是之后阅读发布说明,并考虑固定一个明确的镜像标签,而不是用 :latest,这样一次无人值守的重启就永远不会在您不知情的情况下把您升级掉。
n8n 默认运行在常规模式下:为编辑器提供服务、接收 webhook 的进程,同时也执行工作流。这种方式简单且没有问题,直到某个耗时长的工作流开始让其他工作流排队等待。症状很明显——执行长时间停留在“运行中”状态,编辑器变得迟钝,本该 200 毫秒内响应的 webhook 变成了八秒才响应。
队列模式把工作拆开来做。主实例保留编辑器、触发器和 webhook 端点,把执行 ID 推送到 Redis 中;独立的 worker 进程从中取出,从 PostgreSQL 加载工作流,执行它,再通过 Redis 回报结果。这种架构衍生出三条规则,忽视其中任何一条都会吃苦头:所有实例必须共享同一个 PostgreSQL 数据库,所有实例必须携带相同的 N8N_ENCRYPTION_KEY,而且完全不支持 SQLite。
对 Compose 文件的新增内容是一个 Redis 服务和一个 worker 服务,后者其实是同一个 n8n 镜像,只是以 worker 命令运行:
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--save", "60", "1", "--appendonly", "no"]
volumes:
- redis_data:/data
n8n-worker:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
command: worker --concurrency=5
depends_on:
- redis
- postgres
environment:
# the SAME encryption key and the SAME database as the main instance
- EXECUTIONS_MODE=queue
- QUEUE_BULL_REDIS_HOST=redis
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_DATABASE=${POSTGRES_DB}
- DB_POSTGRESDB_USER=${POSTGRES_USER}
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${GENERIC_TIMEZONE}
同时也要在主 n8n 服务中加入 EXECUTIONS_MODE=queue 和 QUEUE_BULL_REDIS_HOST=redis——两端必须在模式上保持一致。有两个选项值得从第一天起就设置好:OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true,这样在编辑器中点击“测试工作流”就不会占用主进程;以及 N8N_GRACEFUL_SHUTDOWN_TIMEOUT,它默认为 30 秒,决定了重新部署时 worker 有多长时间完成当前任务。如果您的工作流通常运行超过半分钟,就调高这个值,否则每次部署都会中断正在进行的工作。
不要从这里开始。队列模式增加了两个活动部件,也带来了一整类常规模式根本不存在的故障。请留在常规模式下,直到您能亲眼看到队列在增长,或某个工作流阻塞了另一个,再在同一台机器上加入单个 worker,然后才考虑增加第二台机器。这一演进路径——Sentinel 跑常规模式、Garrison 配一个 worker、Ravelin 配三个——覆盖了除真正大规模部署之外的所有情形。
大多数自托管指南都把主机的选择当作一个性能问题来看待。对自动化引擎而言,这并不是重点。一个 n8n 实例同时保存着两样东西,这是您自托管的几乎其他任何东西都不会同时具备的:一张加密表,装着您所自动化的每项服务的 API 密钥、OAuth 令牌和邮箱密码;紧挨着它的,是一张精确描述您的组织如何运作的图——用哪个 CRM、走哪条银行流水、找哪家供应商、哪些客户在哪个触发条件下收到哪种邮件。读完一家公司的工作流列表,也就读懂了这家公司。
第一层——主机认为您是谁。 应用层这一环做得确实不错:凭证以静态加密方式存储,编辑器位于 TLS 和 2FA 之后。泄露发生在它下面那一层。托管方案知道您的法律实体、账单地址和银行卡信息。大型云厂商同样知道这些,并且会保留多年。这不是一种假设性的风险敞口,而是把“存在一个加密保险柜”和“它属于这家具名公司”这两件事连接起来的关联密钥。一次不留邮箱、不要求任何身份证件、以 Monero 结算的注册,去掉的正是这把关联密钥,而不是保险柜本身。
第二层——磁盘。 静态加密只能防住没有密钥的人,而在默认安装中,密钥恰恰和数据库放在同一个文件系统上。请把 .env 权限保持在 600,在机器之外另存一份密钥副本,并优先选择这样一家服务商:其司法管辖区不会让数据中心成为送达法律文件的便利地点——这正是 Nordic 司法管辖区指南的核心论点。
第三层——出口 IP。 每一个 HTTP Request 节点都从这台 VPS 的地址发出请求,而这个地址是带有“信誉”的。大型云厂商的 IP 段是互联网上限速和 CAPTCHA 拦截最严厉的地带,因为爬虫大多藏身于此;一个做抓取或轮询的工作流,在 AWS 或 DigitalOcean 的 IP 上会比在更安静的 Nordic IP 段上早得多地开始失败。n8n 也遵循标准的 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY 和 NO_PROXY 变量,因此少数需要不同出口的工作流,可以通过本地 SOCKS 代理或 Tor 路由,其余的则直接出网。
还有一扇门,是 2.x 系列中新增的:n8n 可以暴露一个实例级别的 MCP 服务器,让 AI 智能体把您的工作流当作工具来调用。它确实很有用,但它同样也是通向您自动化层的一个公开端点,理应得到和其他任何端点一样的对待——TLS、OAuth 以及暴露面的考量,请参见远程 MCP 服务器指南。
数据卷被重建了,n8n 因此生成了一把全新的加密密钥。没有任何办法能找回旧的凭证。请始终显式设置 N8N_ENCRYPTION_KEY,并在服务器之外另存一份副本。
WEBHOOK_URL 未设置,n8n 因此根据 N8N_HOST 来构建地址。请把 WEBHOOK_URL 和 N8N_EDITOR_BASE_URL 都设为公网 HTTPS 地址,然后重启容器。
您正在通过普通 http 访问编辑器,而安全会话 cookie 因此被拒绝。请把 TLS 配置完成,而不是在一个公网实例上把 N8N_SECURE_COOKIE 设为 false。
一个逐分钟触发的工作流,积累了十四天的完整执行数据。请收紧 EXECUTIONS_DATA_MAX_AGE 和 PRUNE_MAX_COUNT,并停止保存成功运行的数据。
:latest 标签,再加上不支持回滚的数据库迁移。请固定一个明确的标签,每次拉取之前先做快照,并在跨主版本升级时阅读发布说明。
GENERIC_TIMEZONE 默认是 America/New_York,这几乎不会是任何人真正想要的时区。请把 GENERIC_TIMEZONE 和 TZ 设为同一个真实时区,然后重启。
把 n8n 实例迁移到您自己的服务器上,前后及过程中常见的十个问题。
如果只是用于您自己的自动化,是的,免费。n8n 以 Sustainable Use License 发布:您可以出于内部业务目的,以及个人或非商业用途,免费使用、复制、修改和分发它。该许可证所禁止的,是向他人收费提供 n8n 或其衍生品——实际上就是把“n8n 托管”当作产品转售。文件名中带 .ee.,或目录路径中带 .ee 的文件,被排除在该许可证之外,需要付费的 n8n Enterprise License。所以:在您自己租用的 VPS 上为自己的公司做自动化,完全属于免费授权范围之内;在此之上搭建一门托管 n8n 的生意,则不在此列。
n8n 官方的 Docker Compose 文档明确给出最低配置为 2 vCPU 和 4 GB 内存。这正好就是 Sentinel 档位($3.90/月——2 vCPU、4 GB、120 GB NVMe),它能够从容地为个人或小团队实例同时运行 n8n、PostgreSQL 和 Caddy。当您加入队列模式的 worker,或运行的工作流会在内存中持有较大负载时,升级到 Garrison(4 vCPU、8 GB,$7.90/月);而对于每天要处理成千上万次执行、且涉及二进制数据——PDF、图像、音频——的团队实例,则升级到 Ravelin(8 vCPU、16 GB,$16.90/月)。
SQLite 是默认选项,对于只有一个人、只有少数几个工作流的场景确实够用。当出现并发执行、执行历史增长到几十万行以上,或者您已经计划扩展规模时,就该切换到 PostgreSQL——而且请注意,队列模式完全不支持 SQLite。日后再迁移,意味着要导出工作流和凭证,再重新导入一个全新实例,这会是一个您不会享受的下午。只要有任何扩展的可能,就从一开始使用 PostgreSQL;本指南中的 Compose 文件已经这样做了。
数据库中的每一项凭证都会永久无法读取。n8n 用这把密钥加密所存储的凭证——OAuth 令牌、API 密钥、SMTP 密码——没有任何恢复机制,也没有任何工单能把它们找回来。您只能逐一手动重新输入每一项凭证。这是自托管 n8n 实例被“摧毁”最常见的方式:有人重建了 Docker 卷,n8n 生成了一把全新的密钥,于是所有工作流同时开始报解密错误而失败。请在首次启动之前,在 .env 中显式设置这把密钥,并把副本存放在服务器之外的地方。
四种原因,按出现频率排序。(1)WEBHOOK_URL 未设置,编辑器因此给您一个外部服务无法访问的 http://localhost:5678/webhook/… 地址——请把它设为您的公网 HTTPS 地址。(2)工作流尚未激活:测试地址只在编辑器打开时监听,生产地址只有在工作流处于激活状态时才存在。(3)DNS 或防火墙:记录未能解析,或 80/443 端口被关闭。(4)您位于额外的一层代理之后,却没有设置 N8N_PROXY_HOPS,导致 n8n 读到了错误的客户端 IP。请从一台不是服务器本身的机器上用普通的 curl 测试。
可以,而且这是很常见的做法——前面一个 Caddy,一个 Compose 网络,n8n 用一个主机名,Vaultwarden、Nextcloud 或 SearXNG 用其他主机名。有两点需要留意。内存方面:n8n 加 PostgreSQL 空闲时占用约 700 MB,而一个繁重的工作流可能会大幅超出这个数字,所以要留有余量。影响范围方面:n8n 数据库是这台机器上凭证密度最高的东西,任何与它共享同一台主机的服务,都会继承它的风险级别。在 $3.90/月这个档位上,让自动化引擎独享一台服务器也是合理的选择。
默认情况下有三个端点。匿名产品遥测(N8N_DIAGNOSTICS_ENABLED,默认 true)、面向 api.n8n.io 的新版本与安全更新检查(N8N_VERSION_NOTIFICATIONS_ENABLED,默认 true),以及从 https://api.n8n.io 拉取内容的工作流模板浏览器(N8N_TEMPLATES_ENABLED,默认 true)。这三者都不会发送您的凭证或工作流数据,但都会向外界宣告:您的 IP 上存在一个实例。如果希望这台机器保持静默,就把这三项都设为 false——代价是失去模板库和更新提示,您需要自己留意版本发布。
n8n Cloud 的 Starter 套餐是按年计费,每月 €20,包含 2,500 次执行;Pro 套餐每月 €50,包含 10,000 次。一台 Sentinel VPS 每月 $3.90,执行次数只受 CPU 和内存限制,对于典型的 webhook 与 API 工作流而言,这意味着数万次都不在话下。金钱上的收支平衡是立竿见影的;真正的成本在于运维。自托管意味着升级、备份、TLS 续期,以及凌晨三点磁盘写满的突发事件,都要由您自己承担。一条老实的判断标准:如果安全更新发布一个月内,您并不会主动去升级这个实例,那就付费用 Cloud。如果每月执行一次 docker compose pull 已经是您生活的一部分,那就自托管。
原因在于 n8n 实例所保存的内容。凭证表是一个单一的加密存储,保存着您自动化的每一项服务的 API 密钥、OAuth 令牌和邮箱密码;旁边的工作流图则是一份清晰可读的地图,展示您的业务实际是如何运转的——用哪个 CRM、走哪条银行流水、找哪家供应商、给哪些客户发哪种邮件。一个静态网站不会泄露这些信息中的任何一项。应用层对此保护得很好;泄露发生在元数据层。如果开通这台机器时提交了护照扫描件和银行卡,那么您加密了保险柜,却把自己的名字写在了门上。用 Monero 付款的无 KYC 主机能让这两层保持一致。
对于最常见的形态可以——一个 AI Agent 节点调用远程模型 API。这类负载是 I/O 密集型的,主要在等待服务商响应,一台 Sentinel 就能应付。不适合的是在本机运行模型本身:一个 7B 的本地模型大约需要 8 GB 内存,而真正可用的推理速度还需要 GPU,这些档位都不具备。让 n8n 指向一个远程的、兼容 OpenAI 的端点,让这台 VPS 保持轻量。关于全天候运行 AI 智能体的配套指南,涵盖了运行时那部分内容——重启策略、密钥管理、支出上限,以及崩溃循环陷阱。
Sentinel(2 vCPU、4 GB、120 GB NVMe,$3.90/月)满足 n8n 的最低要求,同一台机器上还留有余量运行 PostgreSQL 和 Caddy。注册无需邮箱,无需身份证件,执行次数不限。
最后审核 · 2026-08-24 · 来源 · n8n 托管文档、n8n LICENSE.md(Sustainable Use License)、n8n.io 定价页面、Docker 与 Caddy 官方文档 · 周期 · 每年
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
Deploy your own MCP server on a no-KYC VPS — TLS, streamable HTTP, OAuth.
Host an MCP server with no ID — the privacy stack, crypto-paid.
把代理从笔记本电脑搬走 — 规格选择、systemd、密钥、支出上限。
CPU 跑 Ollama,无需 GPU——4、8、16、32 GB 各能装下什么。