前言:为什么你需要属于自己的 n8n?

在 AI 自动化领域,Coze(扣子)和 Zapier 确实好用,但它们的"致命伤"也很明显:

受制于人: 平台策略一变,免费额度缩水(Zapier 免费版仅 100 tasks/月),或者 API 接口被封,你辛苦搭建的工作流瞬间瘫痪。

数据隐私: 你的所有数据都要经过大厂服务器,敏感业务始终难以放心。

这时候,n8n 就成了最佳替代方案。它开源、免费、可自部署。你可以把它理解为"可视化编程的工作流引擎"拥有了 n8n,你就相当于拥有了一个 24 小时待命的数字员工,而且任务数量完全无限制,完全由你掌控。

n8n 能做什么? 给你几个实用场景:

  • 每天自动抓取 RSS 订阅 + AI 总结推送到微信
  • 监控 GitHub 仓库 Star 数,自动发送感谢邮件
  • 定时备份重要数据到多个网盘
  • 监控加密货币价格,触发条件时自动通知
  • 爬取招聘网站新职位,筛选后推送

而我们要用的基础设施,正是之前推荐的那台 $6.45/年(1核2GB内存)的 KVM VPS。

为什么 2GB 内存很重要? n8n 官方推荐最低 512MB 内存,但实际运行复杂工作流(尤其是涉及数据处理、AI 调用)时,1GB 内存会比较吃紧。2GB 是真正流畅运行的"黄金配置",能同时处理多个工作流而不卡顿。

成本对比:

  • Zapier 付费版:$19.99/月(约 ¥145/月)
  • n8n 自托管:$6.45/年(约 ¥3.75/月)+ 无限任务

一、既然 n8n 有桌面版,为什么要部署在 VPS 上?

很多新手会问:"我在自己电脑上装个 n8n 不行吗?" 可以,但那是"玩具",不是"工具"。VPS 部署有两大不可替代的优势:

1. 24/7 全天候待命

自动化任务(如:每小时监控加密货币价格、每天早上抓取新闻推送到微信)需要系统永不休眠。你的笔记本会关机、会断网,但 VPS 永远在线,还不会占用你的本地电脑的资源。

2. Webhook(网络钩子)接收能力

这是 n8n 的灵魂功能。举个例子:

你想实现"当有人给我的 GitHub 仓库点 Star 时,自动发通知给我"。GitHub 需要向你发送一个 HTTP 请求(就像按门铃一样),这需要你有公网 IP 和开放的端口。
  • 本地电脑在内网,需要复杂的内网穿透(frp、ngrok),配置麻烦且不稳定
  • VPS 天生拥有独立公网 IP,是接收 Webhook 的绝佳载体

二、为什么选择 Podman Rootless?

通常大家习惯用 Docker,但今天我们要用更先进的 Podman,而且是 Rootless(无根模式)

优势一:安全性更高

  • 容器以普通用户权限运行,不需要 root 权限
  • 即使 n8n 容器被黑客攻破,他也拿不到你服务器的 Root 权限,无法破坏系统
  • 这对于长期暴露在公网的服务来说至关重要

优势二:更轻量

  • Podman 没有守护进程(daemon-less),比 Docker 更省资源
  • 这对 2GB 内存的小机器来说,能节省宝贵的几十 MB 内存

优势三:兼容性好

  • Podman 命令与 Docker 几乎完全一致,你甚至可以 alias docker=podman
  • 支持 Docker 镜像,无缝迁移

三、部署实操(保姆级教程)

前提条件:

本教程假设你已经有了一台 VPS,并且:

  1. 系统是 Debian 11/12+ 或 Ubuntu 20.04+
  2. 你当前以 root 用户 登录(后面我们会创建普通用户)

⚠️ 为什么要用普通用户? Rootless Podman 的核心理念就是不用 root 运行容器,这样更安全。我们先用 root 安装 Podman,然后切换到普通用户来运行 n8n。


第零步:创建普通用户(如果你已有普通用户可跳过)

如果你当前是 root 用户,先创建一个普通用户:

# 创建用户(用户名可以自定义,这里用 n8nuser 举例)
adduser n8nuser

# 为了方便后续操作,把这个用户加入 sudo 组
usermod -aG sudo n8nuser

# 切换到这个用户
su - n8nuser

💡 后续所有操作都在这个普通用户下进行(除非特别说明需要 sudo)


第一步:安装 Podman

首先,更新系统并安装 Podman。这一步需要管理员权限,所以要加 sudo

sudo apt update
sudo apt install -y podman

安装完成后,验证一下版本:

podman --version

如果显示类似 podman version 3.x.x 或更高版本,说明安装成功。


第二步:设置"驻留"模式(关键!)

默认情况下,普通用户退出 SSH 后,系统会杀掉该用户的所有进程(包括容器)。我们需要告诉系统:

"即使我断开 SSH 连接,这个用户的容器也要继续运行。"

使用该普通用户执行以下命令:

sudo loginctl enable-linger $USER

💡 这一步的作用: 让你的普通用户拥有"持久会话",容器可以在后台一直运行,不受 SSH 登录状态影响。


第三步:准备数据目录

为了防止重启服务器后工作流丢失,我们需要把数据保存在本地硬盘上。

这里有个技术坑

  • n8n 容器内部默认使用 node 用户(UID 1000)运行
  • Rootless Podman 使用 User Namespace 技术,会将容器内的 UID 映射到宿主机的另一个 UID
  • 如果直接挂载目录,容器内的 node 用户无法写入,会报 Permission denied 错误

解决方案: 使用 podman unshare 命令在容器的 user namespace 内调整权限。

# 1. 创建数据目录
mkdir -p ~/n8n_data

# 2. 使用 podman unshare 调整权限
# 这一步非常关键,不做容器会启动失败!
podman unshare chown 1000:1000 ~/n8n_data

💡 为什么需要 podman unshare chown

  • n8n 容器内以 node 用户(UID 1000)运行
  • Rootless Podman 会将这个 UID 映射到宿主机的另一个 UID(比如 100999)
  • podman unshare 命令进入容器的 user namespace,将目录所有者设置为容器内的 UID 1000
  • 这样 n8n 才能正常写入数据

第四步:启动 n8n 容器

请直接复制并运行下面这段命令:

podman run -d \
  --name n8n \
  -p 34567:5678 \
  -e N8N_LISTEN_ADDRESS=0.0.0.0 \
  -e N8N_SECURE_COOKIE=false \
  -v ~/n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

参数详解:

  • -d:后台静默运行
  • --name n8n:给容器命名为 n8n,方便管理
  • -p 34567:5678:将容器的 5678 端口映射到宿主机的 34567 端口
  • -e N8N_LISTEN_ADDRESS=0.0.0.0非常重要! n8n 默认只监听 localhost,必须改成 0.0.0.0 才能从外部访问
  • -e N8N_SECURE_COOKIE=false:新手必加。因为我们暂时没配域名和 HTTPS,如果不加这个,n8n 可能会因为 Cookie 安全策略导致无法登录
  • -v ~/n8n_data:/home/node/.n8n:把刚才创建的目录挂载进去,实现数据持久化

第五步:检查容器是否启动成功

等待十几秒钟后,检查容器状态:

podman ps

你应该看到类似这样的输出:

CONTAINER ID  IMAGE                              COMMAND  CREATED        STATUS        PORTS                   NAMES
abc123def456  docker.n8n.io/n8nio/n8n:latest     n8n      2 minutes ago  Up 2 minutes  0.0.0.0:34567->5678/tcp  n8n

关键点:

  • STATUS 列显示 Up(运行中)
  • PORTS 列显示 0.0.0.0:34567->5678/tcp

如果没看到容器,或者 STATUS 显示 Exited,说明启动失败。查看日志排查问题:

podman logs n8n

常见错误:

  • Permission denied:说明第三步的 podman unshare chown 没执行成功
  • Address already in use:说明 34567 端口被占用,需要换个端口或关闭占用的程序

第六步:配置开机自启动(强烈推荐)

虽然容器现在运行了,但如果 VPS 重启,容器不会自动启动。我们需要配置 systemd 用户服务。

# 创建 systemd 用户服务目录
mkdir -p ~/.config/systemd/user

# 生成 systemd 服务文件
podman generate systemd --new --name n8n > ~/.config/systemd/user/container-n8n.service

# 启用自启动
systemctl --user enable container-n8n.service

# 启动服务(如果容器已经在运行,这步可以跳过)
systemctl --user start container-n8n.service

💡 验证自启动是否生效:

systemctl --user status container-n8n.service

应该看到 Active: active (running)Enabled: enabled


第七步:放行防火墙

不要忘了在 VPS 的防火墙里把 34567 端口打开。

方法一:使用 UFW(Debian/Ubuntu 常用)

sudo ufw allow 34567/tcp
sudo ufw status  # 查看规则是否生效

方法二:使用 firewalld(CentOS/Fedora 常用)

sudo firewall-cmd --permanent --add-port=34567/tcp
sudo firewall-cmd --reload

⚠️ 重要提醒: 如果你的 VPS 商家有外部安全组/防火墙面板(如阿里云、腾讯云),记得去网页后台也放行 34567 端口!


第八步:验证端口是否真的在监听

ss -tlnp | grep 34567

应该看到类似这样的输出:

LISTEN  0  4096  0.0.0.0:34567  0.0.0.0:*

四、访问与初始化

现在,打开浏览器,访问 http://你的VPS_IP:34567

你应该能看到 n8n 的紫色启动画面。

首次注册说明:

新版 n8n 启动后需要创建管理员账号,填写:

  • 邮箱:可以随便填(如 admin@example.com),不需要真实邮箱
  • 密码至少 8 位,必须包含大写字母和数字(如 Admin123456

⚠️ 请务必记住这个密码! 建议使用密码管理器保存。

设置完成后,恭喜你,你已经拥有了一个完全属于自己的自动化中台!


五、安全建议

虽然用 http://你的VPS_IP:34567 能访问,但不建议长期暴露在公网

  1. 强烈建议配置域名 + HTTPS(参考下文"进阶配置")
    • 配置反代后,端口绑定会改为 -p 127.0.0.1:34567:5678,只允许本机访问
    • 外部必须通过 Caddy(HTTPS)才能访问,安全性大幅提升
  2. 或使用 VPN/隧道访问(如 WireGuard、Tailscale)
  3. n8n 的管理密码要设置复杂(至少 8 位,包含大小写+数字+特殊符号)
  4. 定期备份数据~/n8n_data 目录包含你所有的工作流,建议定期打包备份
  5. 临时测试可以直接暴露端口,但正式使用必须配置 HTTPS 反代

⚠️ 端口暴露的安全风险:

  • 使用 -p 34567:5678 时,34567 端口会绑定到 0.0.0.0(所有网络接口)
  • 任何人知道你的 IP 就能直接访问 n8n 后台
  • 建议只在初始配置和测试时使用,测试完成后立即配置 HTTPS 反代

备份命令示例:

cd ~
tar -czf n8n-backup-$(date +%Y%m%d).tar.gz n8n_data/

六、进阶配置:域名 + HTTPS(推荐)

目前的方案是用 IP+端口访问的,适合自用。如果你想更正规,或者需要使用某些强制 HTTPS 的 API(如 Google OAuth、部分 Webhook),建议升级:

步骤一:配置域名

将域名 A 记录解析到 VPS IP。比如:n8n.yourdomain.com你的VPS_IP

步骤二:安装 Caddy 反向代理

Caddy 是最简单的自动 HTTPS 方案(看参考我之前的 WordPress 建站文章)。

执行以下命令安装:

sudo apt install -y caddy

编辑 Caddyfile:

sudo nano /etc/caddy/Caddyfile

添加以下内容(替换成你的真实域名):

n8n.yourdomain.com {
    reverse_proxy 127.0.0.1:34567
}

保存后重启 Caddy:

sudo systemctl restart caddy

步骤三:修改 n8n 配置

停止并删除旧容器:

podman stop n8n
podman rm n8n

重新运行容器,去掉 N8N_SECURE_COOKIE=false,并增加 WEBHOOK_URL

podman run -d \
  --name n8n \
  -p 127.0.0.1:34567:5678 \
  -e N8N_LISTEN_ADDRESS=0.0.0.0 \
  -e WEBHOOK_URL=https://n8n.yourdomain.com \
  -v ~/n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

💡 重要配置说明:

  • -p 127.0.0.1:34567:5678:宿主机只在 localhost 监听 34567 端口,外部无法直接访问,更安全
  • -e N8N_LISTEN_ADDRESS=0.0.0.0:容器内仍需监听所有接口,这样 Caddy 才能通过宿主机的 localhost 连接到容器
  • -e WEBHOOK_URL=https://n8n.yourdomain.com:让 n8n 生成的 Webhook 地址是外网可访问的 HTTPS 地址,而不是内网 IP

🔒 为什么端口绑定要改成 127.0.0.1:34567:5678

  • 不使用反代时:-p 34567:5678 会将端口暴露给所有网络接口,任何人都能通过 IP 直接访问
  • 使用反代后:-p 127.0.0.1:34567:5678 只允许本机访问,外部必须通过 Caddy(HTTPS)才能访问,大幅提升安全性

重新生成 systemd 服务:

podman generate systemd --new --name n8n > ~/.config/systemd/user/container-n8n.service
systemctl --user daemon-reload
systemctl --user restart container-n8n.service

现在访问 https://n8n.yourdomain.com,你会看到安全的小绿锁!

⚠️ 验证安全性:

# 检查端口绑定
ss -tlnp | grep 34567
# 应该显示: 127.0.0.1:34567,而不是 0.0.0.0:34567

七、常见问题排查

Q1: 浏览器访问 IP:34567 无法打开?

排查步骤:

  1. 检查 VPS 商家安全组:
    去控制面板看看外部防火墙是否放行了 34567 端口。

检查防火墙:

sudo ufw status
ss -tlnp | grep 34567

确认 34567 端口已开放且在监听。

查看容器日志:

podman logs n8n

看看有没有报错信息。

检查容器是否运行:

podman ps

如果没看到 n8n 容器,说明容器挂了。


Q2: 提示 Permission denied 错误?

原因: 数据目录权限没设置好。

解决方案:

podman unshare chown 1000:1000 ~/n8n_data
podman restart n8n

Q3: 重启服务器后容器没自动启动?

原因: 没有配置 systemd 用户服务。

解决方案: 回到"第六步",按步骤配置开机自启。


Q4: 登录时提示"Invalid credentials"?

原因: 密码输入错误,或者密码不符合要求(至少8位,包含大写字母和数字)。

解决方案: 如果忘记密码,需要删除数据目录重新初始化:

podman stop n8n
rm -rf ~/n8n_data
mkdir -p ~/n8n_data
podman unshare chown 1000:1000 ~/n8n_data
podman start n8n

⚠️ 警告: 这会删除所有工作流数据!请提前备份。


Q5: 如何更新 n8n 到最新版本?

# 停止并删除旧容器
podman stop n8n
podman rm n8n

# 拉取最新镜像
podman pull docker.n8n.io/n8nio/n8n

# 用同样的命令重新运行(数据不会丢失,因为挂载了 ~/n8n_data)
podman run -d \
  --name n8n \
  -p 34567:5678 \
  -e N8N_LISTEN_ADDRESS=0.0.0.0 \
  -e N8N_SECURE_COOKIE=false \
  -v ~/n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

# 重新生成 systemd 服务
podman generate systemd --new --name n8n > ~/.config/systemd/user/container-n8n.service
systemctl --user daemon-reload
systemctl --user restart container-n8n.service

八、总结

通过这套方案,我们在不到 50 元/年的成本下,搭建起了一套企业级的自动化系统:

  • Podman Rootless 保证了系统的绝对安全
  • KVM + 2GB 内存 保证了 n8n 处理复杂工作流时的稳定性
  • 无限任务数量,彻底摆脱平台限制
  • 完全掌控数据,隐私不泄露

现在,你可以开始构建属于自己的自动化工作流了。一旦你体验过这种"上帝视角"指挥数据流动的快感,你绝对回不去那个手动复制粘贴的时代了。


另: 还没上车的朋友,这台 2GB 内存、KVM 架构的 VPS 目前仍有少量库存,用来跑 n8n 简直是绝配。

(完)