tva
← Insights

在 Hetzner Cloud 上自托管 n8n:完整的 Docker 部署教程

工作流自动化已成为现代企业的必备工具,但随着团队规模的增长,SaaS 解决方案的成本可能会越来越高。我们将向您展示如何在 Hetzner Cloud 上以每月不到 5 欧元的成本搭建您自己的 n8n 实例,让您拥有无限工作流和对自动化平台的完全控制权。

您将构建的内容

完成本教程后,您将拥有:

  • ✅ 支持 HTTPS 的完整 n8n 安装
  • ✅ 通过 Let’s Encrypt 自动签发 SSL 证书
  • ✅ 用于用户账户的邮件集成
  • ✅ 服务器重启后自动启动
  • ✅ 可用于生产环境的专业级配置

每月费用:€4.51(CX11 服务器)+ 域名费用

前置条件

  • 已解析到服务器 IP 的域名
  • 基本的命令行知识
  • Hetzner Cloud 账户

第一步:服务器搭建

创建 Hetzner Cloud 服务器

  1. 登录 Hetzner Cloud 控制台
  2. 创建新项目
  3. 按以下规格添加服务器:
    • 镜像: Ubuntu 24.04 LTS
    • 类型: CX11(1 vCPU、4 GB 内存、20 GB 磁盘)
    • 位置:选择离您用户最近的位置
    • SSH 密钥:添加您的公钥

服务器初始配置

连接到您的服务器:

ssh root@YOUR_SERVER_IP

更新系统:

apt update && apt upgrade -y

第二步:安装 Docker

安装 Docker 和 Docker Compose:

# Install dependencies
apt install apt-transport-https ca-certificates curl software-properties-common gnupg -y

# Add Docker GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add Docker repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

# Create Docker network for our services
docker network create proxy

验证 Docker 安装:

docker --version
docker compose version

第三步:配置 Traefik 反向代理

创建目录结构:

mkdir -p /opt/traefik/data
cd /opt/traefik

创建 Traefik 配置文件:

nano /opt/traefik/data/traefik.yml

添加以下配置:

api:
  dashboard: false

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  letsencrypt:
    acme:
      email: your-email@example.com  # Change this!
      storage: acme.json
      httpChallenge:
        entryPoint: http

创建用于存储 SSL 证书的 acme.json 文件:

touch /opt/traefik/data/acme.json
chmod 600 /opt/traefik/data/acme.json

创建 Traefik 的 Docker Compose 文件:

nano /opt/traefik/docker-compose.yml

添加以下配置:

version: '3'

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: always
    ports:
      - "80:80"
      - "443:443"
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/etc/traefik/traefik.yml
      - ./data/acme.json:/acme.json
    labels:
      - "traefik.enable=true"

networks:
  proxy:
    external: true

第四步:设置 SMTP 邮件中继(可选但建议配置)

创建邮件服务器目录:

mkdir -p /opt/mailserver
cd /opt/mailserver

创建 Docker Compose 文件:

nano /opt/mailserver/docker-compose.yml

添加以下配置:

version: '3'

services:
  mailserver:
    image: bytemark/smtp
    restart: always
    networks:
      - proxy
    environment:
      - RELAY_HOST=smtp.gmail.com  # Change to your SMTP provider
      - RELAY_PORT=587
      - RELAY_USERNAME=your-email@gmail.com  # Change this
      - RELAY_PASSWORD=your-app-password     # Change this
      - MAIL_DOMAIN=yourdomain.com           # Change this
    ports:
      - "25:25"

networks:
  proxy:
    external: true

注意: 如果使用 Gmail,您需要:

  1. 启用两步验证
  2. 生成应用专用密码
  3. 使用应用专用密码(而非普通密码)

第五步:配置 n8n

创建 n8n 目录:

mkdir -p /opt/n8n
cd /opt/n8n

创建 Docker Compose 文件:

nano /opt/n8n/docker-compose.yml

添加以下配置:

version: '3'

services:
  n8n:
    image: n8nio/n8n:latest
    restart: always
    environment:
      - N8N_HOST=n8n.yourdomain.com          # Change this!
      - NODE_ENV=production
      - N8N_PROTOCOL=https
      - N8N_PORT=5678
      - N8N_EDITOR_BASE_URL=https://n8n.yourdomain.com  # Change this!
      
      # Email configuration
      - N8N_EMAIL_MODE=smtp
      - N8N_SMTP_HOST=mailserver
      - N8N_SMTP_PORT=25
      - N8N_SMTP_SSL=false
      - N8N_SMTP_USER=
      - N8N_SMTP_PASS=
      - N8N_SMTP_SENDER=noreply@yourdomain.com  # Change this!
      
      # Important fixes for proxy setup
      - N8N_TRUST_PROXY_HEADER=true
      - N8N_RUNNERS_ENABLED=true
      
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n.rule=Host(`n8n.yourdomain.com`)"  # Change this!
      - "traefik.http.routers.n8n.entrypoints=https"
      - "traefik.http.routers.n8n.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

第六步:创建 Systemd 服务实现自动启动

Traefik 服务

nano /etc/systemd/system/traefik-docker.service

添加以下配置:

[Unit]
Description=Traefik Docker Compose
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/traefik
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

邮件服务器服务

nano /etc/systemd/system/mailserver-docker.service

添加以下配置:

[Unit]
Description=Mailserver Docker Compose
Requires=docker.service
After=docker.service
Before=n8n-docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/mailserver
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down

[Install]
WantedBy=multi-user.target

n8n 服务

nano /etc/systemd/system/n8n-docker.service

添加以下配置:

[Unit]
Description=n8n Docker Compose
Requires=docker.service
After=docker.service traefik-docker.service mailserver-docker.service
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/n8n
ExecStartPre=/bin/bash -c 'until docker container inspect traefik > /dev/null 2>&1; do sleep 2; done'
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
Restart=on-failure
RestartSec=30
TimeoutStartSec=180

[Install]
WantedBy=multi-user.target

启用并启动服务

# Reload systemd daemon
systemctl daemon-reload

# Enable services to start on boot
systemctl enable traefik-docker.service
systemctl enable mailserver-docker.service
systemctl enable n8n-docker.service

# Start services
systemctl start traefik-docker.service
sleep 10
systemctl start mailserver-docker.service
sleep 10
systemctl start n8n-docker.service

第七步:DNS 配置

将您的域名指向服务器:

  1. 前往您的域名注册商/DNS 服务提供商
  2. 创建一条 A 记录:
    • 名称: n8n
    • 类型: A
    • 值: YOUR_SERVER_IP
    • TTL: 300(或允许的最小值)

等待 DNS 解析生效(可能需要最长 24 小时,通常会快得多)。

第八步:测试安装

检查服务是否正在运行:

docker ps

您应该能看到三个正在运行的容器:traefik、mailserver 和 n8n。

访问您的 n8n 实例:

https://n8n.yourdomain.com

您应该能看到 n8n 的设置页面,并显示绿色锁头图标(表示 HTTPS 已正常工作)。

常见问题排查

SSL 证书无法正常工作

检查 Traefik 日志:

docker logs traefik

常见原因:

  • DNS 未指向服务器
  • 防火墙阻止了 80/443 端口
  • 配置中的域名有误

n8n 无法访问

检查 n8n 日志:

docker logs n8n-n8n-1

常见解决方法:

  • 确认所有文件中的域名配置一致
  • 检查所有容器是否在同一网络中

邮件无法发送

检查邮件服务器日志:

docker logs mailserver-mailserver-1

验证 SMTP 凭据和设置。

重启后服务未自动启动

检查服务状态:

systemctl status traefik-docker.service
systemctl status n8n-docker.service

如需重启:

systemctl restart traefik-docker.service
systemctl restart n8n-docker.service

维护与更新

日常维护

每周检查:

# Check container status
docker ps

# Check disk space
df -h

# Check logs for errors
docker logs n8n-n8n-1 | grep -i error

每月更新:

# Update container images
cd /opt/n8n && docker compose pull && docker compose up -d
cd /opt/traefik && docker compose pull && docker compose up -d
cd /opt/mailserver && docker compose pull && docker compose up -d

# Clean up old images
docker system prune -f

数据备份

创建备份脚本:

nano /opt/backup-n8n.sh

添加以下内容:

#!/bin/bash
mkdir -p /opt/backups
tar -czf /opt/backups/n8n-backup-$(date +%Y%m%d).tar.gz /opt/n8n/data
find /opt/backups -name "n8n-backup-*.tar.gz" -mtime +30 -delete

设置执行权限并添加到定时任务:

chmod +x /opt/backup-n8n.sh

# Add to crontab (daily backup at 2 AM)
crontab -e
# Add this line:
0 2 * * * /opt/backup-n8n.sh

安全加固

配置防火墙

# Install UFW
apt install ufw

# Set defaults
ufw default deny incoming
ufw default allow outgoing

# Allow SSH
ufw allow 22

# Allow HTTP/HTTPS
ufw allow 80
ufw allow 443

# Enable firewall
ufw enable

加固 SSH 安全

编辑 SSH 配置文件:

nano /etc/ssh/sshd_config

进行以下修改:

PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes

重启 SSH:

systemctl restart ssh

设置 Fail2Ban

apt install fail2ban

# Copy default configuration
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Enable and start
systemctl enable fail2ban
systemctl start fail2ban

费用明细

每月费用:

  • Hetzner CX11 服务器:€4.51
  • 域名(按年计,价格不等):约 €10-15/年
  • 总计:约 €5-6/月

与 n8n Cloud 对比:

  • n8n Starter 版:$20/月
  • n8n Pro 版:$50/月
  • 节省:$180-540/年

扩展您的部署

多个 n8n 实例

您可以为不同团队运行多个独立的 n8n 实例:

创建 /opt/n8n-team2/docker-compose.yml

version: '3'
services:
  n8n-team2:
    image: n8nio/n8n:latest
    restart: always
    environment:
      - N8N_HOST=team2.yourdomain.com
      # ... rest of configuration
    volumes:
      - ./data:/home/node/.n8n
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.n8n-team2.rule=Host(`team2.yourdomain.com`)"
      - "traefik.http.routers.n8n-team2.entrypoints=https"
      - "traefik.http.routers.n8n-team2.tls.certresolver=letsencrypt"
      - "traefik.http.services.n8n-team2.loadbalancer.server.port=5678"

networks:
  proxy:
    external: true

升级服务器资源

如果需要更强的性能,可以升级您的 Hetzner 服务器:

  • CX21:2 vCPU、8 GB 内存(€8.46/月)
  • CX31:2 vCPU、16 GB 内存(€16.07/月)

总结

现在您已拥有一个可用于生产环境的 n8n 安装,其成本仅为托管解决方案的一小部分,同时您拥有完全的控制权。该配置包含自动 HTTPS、邮件功能和健壮的服务管理。

这种方案的主要优势:

  • 成本效益高:每年可节省数百美元
  • 完全控制:没有使用限制或功能限制
  • 数据隐私:您的数据始终保留在自己的基础设施上
  • 可定制:可根据需要修改和扩展

该配置已在生产环境中经过测试,能够以极低的成本提供企业级的可靠性。

关于 tva

tva 提供数据库系统、云环境和全球供应链的全面基础设施管理服务。我们的系统化方法将严格的安全协议与性能优化相结合,同时战略咨询服务能够实现数字能力和实体资产的精准协调——在所有业务中始终保持最高标准的运营卓越性和合规性。

访问 tva.sg 了解更多关于我们服务的信息。