在 Hetzner Cloud 上自托管 n8n:完整的 Docker 部署教程
工作流自动化已成为现代企业的必备工具,但随着团队规模的增长,SaaS 解决方案的成本可能会越来越高。我们将向您展示如何在 Hetzner Cloud 上以每月不到 5 欧元的成本搭建您自己的 n8n 实例,让您拥有无限工作流和对自动化平台的完全控制权。
您将构建的内容
完成本教程后,您将拥有:
- ✅ 支持 HTTPS 的完整 n8n 安装
- ✅ 通过 Let’s Encrypt 自动签发 SSL 证书
- ✅ 用于用户账户的邮件集成
- ✅ 服务器重启后自动启动
- ✅ 可用于生产环境的专业级配置
每月费用:€4.51(CX11 服务器)+ 域名费用
前置条件
- 已解析到服务器 IP 的域名
- 基本的命令行知识
- Hetzner Cloud 账户
第一步:服务器搭建
创建 Hetzner Cloud 服务器
- 登录 Hetzner Cloud 控制台
- 创建新项目
- 按以下规格添加服务器:
- 镜像: 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,您需要:
- 启用两步验证
- 生成应用专用密码
- 使用应用专用密码(而非普通密码)
第五步:配置 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 配置
将您的域名指向服务器:
- 前往您的域名注册商/DNS 服务提供商
- 创建一条 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 了解更多关于我们服务的信息。