简介
n8n 是当今功能最强大的开源工作流自动化工具之一。与 Zapier 或 Make 等 SaaS 替代方案不同,n8n 让你能够完全掌控自己的数据和自动化流程——但前提是你必须自行托管。Linux VPS 是实现这一目标的理想环境:始终在线、价格实惠,且完全由你掌控。
本指南将带您逐步完成在 Linux VPS 上搭建一个生产就绪的、自主托管的 n8n 实例的完整过程。您将从一台空白的服务器开始,最终部署出一个完全 安全、支持 SSL 的 n8n 环境,其中包含 Docker、Nginx、PostgreSQL、自动备份以及经过强化安全配置的系统。
关键要点
- 在 VPS 上运行 n8n 可为您提供无限的工作流、无使用上限以及完全的数据所有权
- Docker 是推荐的安装方式,便于更新和隔离
- PostgreSQL 是生产环境工作负载的推荐数据库(而非 SQLite)
- 生产环境必须使用配备 Let’s Encrypt SSL 的反向代理(Nginx)
- 为确保 n8n 与 PostgreSQL 配合使用时运行流畅,您的 VPS 应至少配备 1 个 vCPU 和 2 GB 内存
- 定期自动备份可保护您的工作流数据和凭据
什么是 n8n?
n8n(发音为“n-eight-n”)是一个开源的工作流自动化平台,允许您使用可视化的节点式编辑器连接应用程序、API 和服务。它开箱即用支持 400 多种集成,并允许您在工作流中运行自定义的 JavaScript 或 Python 代码。
n8n 与其竞争对手的关键区别在于三点:所有权、成本和灵活性。
**所有权:**当您自建 n8n 服务器时,您的工作流数据、凭据和执行日志绝不会离开您的服务器。对于处理敏感客户数据、财务记录或专有业务逻辑的团队而言,这一点至关重要。云平台会将其基础设施上存储您的自动化逻辑,从而受其数据保留政策和安全态势的约束。
**成本:**n8n 云套餐按工作流执行次数收费,对于高频自动化任务而言,费用会迅速累积。一个每天运行数千次执行的中型团队,每月可能花费数百美元。而在您自己的 VPS 上,一旦支付了服务器费用,执行次数即为无限,且无需额外付费。
**灵活性:**自托管的 n8n 允许您安装社区节点、在工作流中运行任意代码、连接无法通过公共互联网访问的内部服务,并根据您的喜好配置部署的各个方面。而云套餐则限制了其中许多功 能。
先决条件
开始之前,请确保您具备以下条件:
- 运行 Ubuntu 22.04 或 24.04(推荐)的 Linux VPS。请确认您的服务商在您选择的套餐规格中提供 Ubuntu 系统,因为部分入门级套餐仅提供其他发行版
- 一个具有 sudo 权限的非 root 用户
- 一个指向您的 VPS IP 地址的域名(例如:n8n.yourdomain.com)
- 可通过 SSH 访问您的服务器
- 对 Linux 命令行有基本了解
选择合适的 VPS
您选择的服务器会直接影响 n8n 的性能。至少需要 1 个 vCPU、2 GB 内存和 20 GB SSD 存储空间。与基于 SQLite 的最低配置相比,需要额外的内存,因为 PostgreSQL、Nginx 和 n8n 会同时运行。
有效SEO的一体化平台
每个成功的企业背后都有一个强大的SEO活动。但是,有无数的优化工具和技术可供选择,很难知道从哪里开始。好了,不要再害怕了,因为我已经得到了可以帮助的东西。介绍一下Ranktracker有效的SEO一体化平台
对于拥有多名用户、复杂的多步骤工作流或高 Webhook 吞吐量的团队,请升级至 2 个 vCPU 和 4 GB 内存。如果您计划保留长期的执行日志,存储空间应至少为 40 GB。
PetroSky在巴黎和蒙特利尔提供 NVMe VPS 套餐,结账时可一键安装 n8n:一个开源安装脚 本会通过 Docker Compose 部署 n8n,并借助 Caddy 和 Let’s Encrypt 自动配置 HTTPS。本指南介绍手动安装方法,该方法适用于任何服务商。
选择 VPS 服务商时,还需考虑地理位置。请将 n8n 实例托管在距离其最常连接的服务最近的区域——这可以降低工作流执行过程中的 API 延迟。
步骤 1:更新服务器
通过 SSH 连接到您的 VPS,并在安装任何软件之前运行完整的系统更新:
sudo apt update && sudo apt upgrade -y
这可确保在安装 Docker 及其他软件之前,您已拥有最新的安全补丁,且所有系统库均处于最新状态。
如果应用了内核更新,请重启系统:
sudo reboot
通过 SSH 重新连接后,为运行 n8n 创建一个专用系统用户。以 root 身份运行服务存在安全风险:
sudo adduser n8nuser
sudo usermod -aG sudo n8nuser
su - n8nuser
步骤 2:安装 Docker 和 Docker Compose
n8n 官方推荐的安装方法是使用 Docker。Docker 将 n8n 及其依赖项与系统其余部分隔离,使更新和回滚变得简单直接。
使用官方便捷脚本安装 Docker:
curl -fsSL https://get.docker.com | sudo sh
Docker 文档指出,不建议在生产环境中使用该便捷脚本,因为它会安装最新版本而无法让您选择具体版本。如果您希望锁定 Docker 版本,请改用 Docker 的 Ubuntu 安装指南(docs.docker.com/engine/install/ubuntu/)中提到的 apt 软件源方法。
将您的用户添加到 Docker 组中,以便无需 sudo 即可运行 Docker 命令:
sudo usermod -aG docker $USER
newgrp docker
验证 Docker 是否运行正常:
docker --version
docker compose version
这两条命令都应返回版本字符串且无错误。如果找不到 Docker Compose,请手动安装:
sudo apt install docker-compose-plugin -y
步骤 3:为生产环境配置 PostgreSQL
默认情况下,n8n 使用 SQLite 作为数据库。SQLite 适用于个人使用和轻量级工作流,但其并发写入处理能力较差,当多个工作流同时运行时,会导致运行速度变慢并出现“数据库被锁定”的错误。对于生产环境部署,PostgreSQL 是更合适的选择。
有效SEO的一体化平台
每个成功的企业背后都有一个强大的SEO活动。但是,有无数的优化工具和技术可供选择,很难知道从哪里开始。好了,不要再害怕了,因为我已经得到了可以帮助的东西。介绍一下Ranktracker有效的SEO一体化平台
在 Docker 中与 n8n 一起运行 PostgreSQL:
mkdir ~/n8n && cd ~/n8n
创建一个环境配置文件,用于安全地存储密钥。切勿在 Compose 文件中硬编码密码:
nano ~/n8n/.env
添加以下内容,并将占位符替换为强且唯一的密码:
POSTGRES_USER=n8n
POSTGRES_PASSWORD=此处填写您强密码
POSTGRES_DB=n8n
N8N_ENCRYPTION_KEY=此处填写您随机生成的 32 个字符的字符串
使用以下命令生成一个安全的加密密钥:
openssl rand -hex 16
将输出结果用作您的 N8N_ENCRYPTION_KEY。 该密钥用于加密存储在 n8n 中的凭据——若丢失此密钥,所有已保存的凭据将无法恢复。
步骤 4:创建 n8n Docker Compose 文件
在 n8n 目录中创建 docker-compose.yml 文件:
nano ~/n8n/docker-compose.yml
粘贴以下配置:
services:
postgres:
image: postgres:16-alpine
restart: always
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 -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
重试次数: 10
n8n:
镜像: docker.n8n.io/n8nio/n8n
重启策略: 始终重启
端口:
- "127.0.0.1:5678:5678"
环境变量:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.yourdomain.com/
- GENERIC_TIMEZONE=Europe/London
- 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}
- EXECUTIONS_MODE=regular
- N8N_LOG_LEVEL=info
卷:
- n8n_data:/home/node/.n8n
依赖项:
postgres:
条件:service_healthy
卷:
postgres_data:
n8n_data:
配置说明:
- 端口绑定 127.0.0.1:5678:5678 可确保 n8n 仅在本地可访问。Nginx 将处理所有外部流量——切勿将 5678 端口直接暴露到互联网上。
- 通过 `depends_on` 配合 `service_healthy` 条件,可确保 n8n 在启动前等待 PostgreSQL 完全就绪。若未设置此条件,当数据库尚未接受连接时,n8n 在首次启动时将失败。
- N8N_LOG_LEVEL=info 可在不像 debug 那样占用大量磁盘空间的情况下,为您提供有用的运行日志。
步骤 5:安装并配置 Nginx
Nginx 将充当反向代理,将来自 443 端口的 HTTPS 流量转发至 5678 端口的 n8n 容器。它还负责 SSL 终止,这意味着 n8n 本身无需管理证书。
sudo apt install nginx -y
删除默认站点并为 n8n 创建新的服务器块:
sudo rm /etc/nginx/sites-enabled/default
sudo nano /etc/nginx/sites-available/n8n
粘贴以下内容:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name n8n.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
chunked_transfer_encoding on;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 90s;
client_max_body_size 50m;
}
}
开头的 map 代码块正确处理了 WebSocket 升级头部。n8n 使用 WebSocket 实现编辑器中的实时更新,因此此配置至关重 要——若缺少该配置,可视化编辑器将无法正常工作。
client_max_body_size 50m 指令允许工作流接收大型 webhook 有效载荷。Nginx 的默认限制为 1 MB,对于处理文件上传或大型 JSON 响应的工作流而言,该限制过小。
启用该配置并进行测试:
sudo ln -s /etc/nginx/sites-available/n8n /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
步骤 6:使用 Let’s Encrypt 签发 SSL 证书
安装 Certbot 及其 Nginx 插件:
sudo apt install certbot python3-certbot-nginx -y
为您的域名申请证书:
sudo certbot --nginx -d n8n.yourdomain.com
按照提示操作。当被问及是否将 HTTP 流量重定向到 HTTPS 时,请选择“是”(选项 2)。Certbot 将自动更新您的 Nginx 配置以处理此重定向,并安装完整的证书链。
验证自动续期配置是否正确:
sudo certbot renew --dry-run
Certbot 会安装一个 systemd 定时器,每 12 小时自动续期证书。当证书距离过期还有 30 天以内时,系统会自动进行续期。您通常无需手动续期。
步骤 7:启动 n8n
返回您的 n8n 目录并启动所有服务:
cd ~/n8n
docker compose up -d
Docker 将拉取 PostgreSQL 和 n8n 镜像,创建卷,先启动 PostgreSQL,等待健康检查通过后,再启动 n8n。首次运行时,此过程需要 1–3 分钟。
检查两个容器是否都在运行:
docker compose ps
此时应看到 postgres 和 n8n 均列在列表中,状态为 Up。如果 n8n 显示为 Restarting,请检查日志:
docker compose logs n8n --tail=50
当两个容器均运行正常后,打开浏览器并访问 https://n8n.yourdomain.com。系统将提示您使用电子邮件地址和密码创建一个所有者账户。该账户对您的 n8n 实例拥有完全的管理权限。
步骤 8:配置 n8n 自动在系统启动时运行
docker-compose.yml 文件中的 restart: always 指令可确保所有容器在崩溃或服务器重启时自动重启。
请通过重启服务器来验证此功能:
sudo reboot
通过 SSH 重新连接后,请确认 n8n 是否已自动恢复运行:
docker compose -f ~/n8n/docker-compose.yml ps
两个容器都应显示为正在运行,且无需任何手动干预。
第 9 步:设置自动备份
您的 n8n 数据——包括工作流、凭据和执行历史记录——存储在两个位置:PostgreSQL 数据库和 n8n_data Docker 卷(其中存储加密密钥和部分配置)。请定期备份这两个位置。
创建备份脚本:
nano ~/n8n/backup.sh
粘贴以下内容:
#!/bin/bash
BACKUP_DIR="/home/n8nuser/backups"
DATE=$(date +%Y-%m-%d_%H-%M)
LOG_FILE="$BACKUP_DIR/backup.log"
# 在执行其他操作前确保备份目录已存在
mkdir -p "$BACKUP_DIR"
# 导出 PostgreSQL 数据库
DUMP_FILE="$BACKUP_DIR/n8n_db_$DATE.sql"
docker compose -f /home/n8nuser/n8n/docker-compose.yml exec -T postgres \
pg_dump -U n8n n8n > "$DUMP_FILE"
# 验证导出是否成功且文件内容不为空
if [ $? -ne 0 ] || [ ! -s "$DUMP_FILE" ]; then
echo "错误:$DATE 数据库备份失败" >> "$LOG_FILE"
rm -f "$DUMP_FILE"
exit 1
fi
# 备份加密密钥和环境变量
cp /home/n8nuser/n8n/.env "$BACKUP_DIR/n8n_env_$DATE.bak"
# 备份 n8n_data 卷(实例配置和已安装的社区节点)
docker run --rm -v n8n_n8n_data:/data -v "$BACKUP_DIR":/backup alpine \
tar czf /backup/n8n_data_$DATE.tar.gz -C /data .
# 压缩数据库转储文件
gzip "$DUMP_FILE"
# 仅保留最近 7 天的备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
find "$BACKUP_DIR" -name "*.bak" -mtime +7 -delete
find "$BACKUP_DIR" -name "n8n_data_*.tar.gz" -mtime +7 -delete
echo "备份完成:n8n_db_$DATE.sql.gz" >> "$LOG_FILE"
卷名 n8n_n8n_data 源于 Docker Compose 将项目文件夹名称(n8n)作为卷的前缀。请使用 docker volume ls 命令确认您的卷名称。
将脚本设为可执行,并通过 cron 进行定时任务:
chmod +x ~/n8n/backup.sh
crontab -e
添加以下行,使备份每天凌晨 2 点运行:
0 2 * * * /home/n8nuser/n8n/backup.sh >> /home/n8nuser/backups/backup.log 2>&1
为了实现异地冗余,建议考虑使用 rclone 或 aws s3 sync 将备份目录同步到兼容 S3 的对象存储提供商。
步骤 10:启用基本安全加固
设置防火墙
安装 UFW,并仅允许服务器所需的端口:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
验证规则是否生效:
sudo ufw status verbose
您应看到端口 22(SSH)、80(HTTP)和 443(HTTPS)已被允许。 需注意:Docker 会编写自己的防火墙规则,并绕过 UFW 处理已发布的容器端口。端口 5678 保持私有状态是因为 compose 文件将其绑定到 127.0.0.1,而非 UFW 所致,因此切勿将该绑定更改为 0.0.0.0。
禁用 SSH 的密码认证
如果您正在使用 SSH 密钥(您应该这样做),请完全禁用基于密码的 SSH 登录。首先,确保 n8nuser 账户可以使用您的密钥登录。在您的本地机器上运行:
ssh-copy-id n8nuser@你的服务器IP
然后编辑 SSH 服务器配置:
sudo nano /etc/ssh/sshd_config
设置以下值:
PasswordAuthentication no
PermitRootLogin no
sudo systemctl restart ssh
在许多 Ubuntu 云镜像中,/etc/ssh/sshd_config.d/ 目录下的某个文件(通常是 50-cloud-init.conf)会将 PasswordAuthentication 设置为 yes,并且 该设置会生效,因为 sshd 会采用读取到的第一个值。请检查实际生效的设置:
sudo sshd -T | grep -i passwordauthentication
输出应为 passwordauthentication no。如果不是,请修改覆盖文件中的值,然后重新启动 SSH。
在通过新终端窗口验证密钥登录是否正常工作之前,请勿关闭当前的 SSH 会话。
对 n8n 登录页面实施速率限制
添加速率限制以减缓针对 n8n 登录端点的暴力破解攻击。
有效SEO的一体化平台
每个成功的企业背后都有一个强大的SEO活动。但是,有无数的优化工具和技术可供选择,很难知道从哪里开始。好了,不要再害怕了,因为我已经得到了可以帮助的东西。介绍一下Ranktracker有效的SEO一体化平台
**重要提示:**limit_req_zone 指令必须位于 Nginx 主配置文件中的 http {} 代码块内,而非 server 代码块内。打开主配置文件:
sudo nano /etc/nginx/nginx.conf
在现有的 http {} 代码块内添加以下行:
http {
...
limit_req_zone $binary_remote_addr zone=n8n_login:10m rate=5r/m;
...
}
然后在您的 n8n 站点配置文件(/etc/nginx/sites-available/n8n)中,将此 location 块添加到监听 443 端口的 server 块内(Certbot 在第 6 步中创建了该块),紧邻现有的 location /。由于 Nginx 不会从 location / 传递代理头,因此此处需重复设置:
location /rest/login {
limit_req zone=n8n_login burst=5 nodelay;
proxy_pass http://127.0.0.1:5678;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
重新加载 Nginx 以应用配置:
sudo nginx -t && sudo systemctl reload nginx
这将每个 IP 地址的登录尝试次数限制在每分钟约 5 次,并允许少量突发访问。
保持 n8n 和 PostgreSQL 处于最新状态
定期拉取最新镜像并重启:
cd ~/n8n
docker compose pull
docker compose up -d
Docker 将拉取最新的 n8nio/n8n 和 postgres 镜像,并仅重启那些有更新版本可用的容器。
在生产环境中,建议将 n8n 镜像固定为特定版本标签(docker.n8n.io/n8nio/n8n:<version>,取自 n8n 的发布说明),并有计划地进行升级,这样在您阅读变更日志之前,常规拉取操作就不会跳过大版本更新。
常见问题排查
n8n 容器不断重启
在重启循环开始后立即检查容器日志:
docker compose logs n8n --tail=100
常见原因:
- 数据库连接失败:请使用 `docker compose ps` 命令确保 PostgreSQL 运行正常。检查 `.env` 文件中的 `POSTGRES_PASSWORD` 是否与数据库初始化时设置的密码一致。
- 加密密钥缺失或已更改:如果未设置 N8N_ENCRYPTION_KEY,或者在首次运行后更改了该密钥,n8n 将无法解密存储的凭据,并会导致崩溃。
- 内存不足:PostgreSQL 和 n8n 合计可能占用 1–1.5 GB 内存。请使用 `free -h` 命令检查可用内存。
Webhook 无法正常工作
Webhooks 要求 n8n 能在您的域名下通过互联网访问。请验证:
- 您的域名 DNS A 记录指向您的 VPS IP:dig n8n.yourdomain.com
- Nginx 正在运行:sudo systemctl status nginx
- 443 端口已开放:sudo ufw status
- WEBHOOK_URL 环境变量与您的公共域名完全一致,包括末尾的斜杠
n8n 编辑器无法正常加载
如果可视化编辑器已加载但工作流画布显示为空白,或者实时更新停止工作,则说明 WebSocket 连接失败。请检查 Nginx 配置中是否包含 $http_upgrade 映射块,并确保在 proxy_set_header Connection 行中使用的是 $connection_upgrade 变量——而不是字面字符串“upgrade”。
SSL 证书错误
如果 Certbot 因域名验证错误而失败,请检查端口 80 是否可从互联网访问:
curl -I http://n8n.yourdomain.com
如果请求超时,可能是您的 VPS 服务商的防火墙正在阻挡 80 端口。除了检查 UFW 之外,还请检查云控制台中的防火墙规则。
结论
在 Linux VPS 上自建 n8n,可为您提供一个生产就绪的工作流自动化平台,该平台无执行限制、数据隐私得到全面保障,并具备运行任何所需集成的灵活性。本指南介绍的配置——包括 Docker、PostgreSQL、Nginx 反向代理、Let’s Encrypt SSL、自动备份和安全加固——与生产环境中使用的技术栈完全一致,为您构建系统提供了稳定、安全的基础。
与仅使用 Docker `run` 命令进行的简易安装不同,此配置旨在确保系统能够承受服务器重启、处理并发的工作流执行,并在发生故障时实现平滑恢复。您的凭据经过加密,数据每晚都会备份,且登录端点设有速率限制以防范暴力破解。
一旦您的实例运行起来,即可探索 n8n 内置的数据库、API、Webhook 和 AI 集成节点,立即开始自动化您的工作流。位于 community.n8n.io 的自托管社区论坛也是获取工作流创意、节点故障排除和部署技巧的绝佳资源。

