• 技术

如何在 Linux VPS 上自行托管 n8n(分步指南)

  • Felix Rose-Collins
  • ••
  • 14 min read

简介

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 会同时运行。

遇见Ranktracker

有效SEO的一体化平台

每个成功的企业背后都有一个强大的SEO活动。但是,有无数的优化工具和技术可供选择,很难知道从哪里开始。好了,不要再害怕了,因为我已经得到了可以帮助的东西。介绍一下Ranktracker有效的SEO一体化平台

我们终于开放了Ranktracker的注册,完全免费!

创建一个免费账户

或使用您的证书登录

对于拥有多名用户、复杂的多步骤工作流或高 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 是更合适的选择。

遇见Ranktracker

有效SEO的一体化平台

每个成功的企业背后都有一个强大的SEO活动。但是,有无数的优化工具和技术可供选择,很难知道从哪里开始。好了,不要再害怕了,因为我已经得到了可以帮助的东西。介绍一下Ranktracker有效的SEO一体化平台

我们终于开放了Ranktracker的注册,完全免费!

创建一个免费账户

或使用您的证书登录

在 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 登录端点的暴力破解攻击。

遇见Ranktracker

有效SEO的一体化平台

每个成功的企业背后都有一个强大的SEO活动。但是,有无数的优化工具和技术可供选择,很难知道从哪里开始。好了,不要再害怕了,因为我已经得到了可以帮助的东西。介绍一下Ranktracker有效的SEO一体化平台

我们终于开放了Ranktracker的注册,完全免费!

创建一个免费账户

或使用您的证书登录

**重要提示:**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 能在您的域名下通过互联网访问。请验证:

  1. 您的域名 DNS A 记录指向您的 VPS IP:dig n8n.yourdomain.com
  2. Nginx 正在运行:sudo systemctl status nginx
  3. 443 端口已开放:sudo ufw status
  4. 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 的自托管社区论坛也是获取工作流创意、节点故障排除和部署技巧的绝佳资源。

Felix Rose-Collins

Felix Rose-Collins

Ranktracker's CEO/CMO & Co-founder

Felix Rose-Collins is the Co-founder and CEO/CMO of Ranktracker. With over 15 years of SEO experience, he has single-handedly scaled the Ranktracker site to over 500,000 monthly visits, with 390,000 of these stemming from organic searches each month.

开始使用Ranktracker...免费的!

找出阻碍你的网站排名的原因。

创建一个免费账户

或使用您的证书登录

Different views of Ranktracker app