N8N 安装部署
N8N 是一个强大的开源工作流自动化工具,我将为您详细介绍如何使用 Docker 进行安装,这是生产环境中推荐的最佳实践,因为它提供了环境隔离、易于管理和可移植性等显著优势。
在开始之前,请问您是在什么环境下进行安装?比如:
- 本地开发环境 (Windows, macOS, Linux 桌面)
- 云服务器 (AWS EC2, Google Cloud Compute Engine, Azure VM 等)
- Kubernetes 集群
根据您的环境,我会提供最适合的方案。不过,无论哪种情况,使用 Docker Compose 都是一个非常便捷且推荐的方式,因为它能帮助您一键部署 N8N 及其所需的 PostgreSQL 数据库。
前提条件:
在开始之前,请确保您的系统已经安装了 Docker 和 Docker Compose。如果您还没安装,可以参考官方文档:
- Docker Desktop (Windows/macOS): https://www.com/docker-for-mac
- Docker Engine (Linux): https://docs.docker.com/engine/install/
- Docker Compose: 通常随 Docker Desktop 一并安装,Linux 用户可能需要单独安装:https://docs.docker.com/compose/install/
方案一:使用 Docker Compose (推荐)
这个方案将部署 N8N 及其独立的 PostgreSQL 数据库,确保数据持久化。
步骤 1:创建项目目录
首先,在您的系统上创建一个新的目录,用于存放 N8N 的配置和数据:
mkdir n8n-docker-stack
cd n8n-docker-stack
步骤 2:创建 docker-compose.yml 文件
在这个目录中创建一个名为 docker-compose.yml 的文件,并粘贴以下内容:
version: '3.8'
services:
n8n:
# 推荐使用官方的最新稳定版镜像
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678" # 将主机的5678端口映射到容器的5678端口 (N8N默认监听端口)
environment:
# N8N 服务的核心配置
- N8N_HOST=${N8N_HOST} # N8N 访问的域名或IP
- N8N_PORT=5678
- N8N_PROTOCOL=http # 如果您有反向代理并在前端配置了HTTPS,这里可以保持HTTP
- WEBHOOK_URL=${WEBHOOK_URL} # N8N Webhook的外部可访问URL,非常重要!
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE:-Asia/Shanghai} # 设置时区
- TZ=${TZ:-Asia/Shanghai} # 容器级别时区设置
# 数据库连接配置
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${DB_POSTGRESDB_DATABASE:-n8n}
- DB_POSTGRESDB_USER=${DB_POSTGRESDB_USER:-n8n}
- DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD:-n8n_password}
# 启用加密(非常重要!)
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} # 请务必设置一个强加密密钥!
# - N8N_BASIC_AUTH_ACTIVE=true # 如果想启用基础认证,请取消注释
# - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
# - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
volumes:
- n8n_data:/home/node/.n8n # 持久化N8N的配置和内部数据
depends_on:
- postgres # 确保N8N在PostgreSQL启动之后才启动
networks:
- n8n_network # 将N8N服务加入到自定义网络
postgres:
image: postgres:13 # 推荐使用特定版本,避免意外升级导致问题
restart: always
environment:
- POSTGRES_DB=${DB_POSTGRESDB_DATABASE:-n8n}
- POSTGRES_USER=${DB_POSTGRESDB_USER:-n8n}
- POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD:-n8n_password}
- PGDATA=/var/lib/postgresql/data/pgdata # 明确指定数据目录
volumes:
- postgres_data:/var/lib/postgresql/data/pgdata # 持久化PostgreSQL数据
networks:
- n8n_network # 将PostgreSQL服务加入到自定义网络
volumes:
n8n_data: {} # Docker管理的数据卷,用于N8N数据持久化
postgres_data: {} # Docker管理的数据卷,用于PostgreSQL数据持久化
networks:
n8n_network:
driver: bridge # Docker默认的桥接网络
步骤 3:创建 .env 文件
为了更好地管理配置,创建一个 .env 文件,并填入您的环境变量。将 n8n-docker-stack 目录下的 .env 文件内容替换为您实际的值:
# N8N 服务的主机名或 IP
# 如果是本地开发,可以是localhost或127.0.0.1
# 如果部署到云服务器,可以是您的服务器公网IP或域名
N8N_HOST=localhost
# *** 非常重要:为您的 N8N 实例设置一个外部可访问的 URL ***
# 这是 N8N 接收 Webhook 和回调的地址。
# 如果是在本地测试,可以是 http://localhost:5678/
# 如果部署到云服务器,并且没有反向代理 (例如 Nginx),可以是 http://<您的服务器IP>:5678/
# 如果有反向代理并配置了HTTPS,可以是 https://your.n8n.domain.com/
WEBHOOK_URL=http://localhost:5678/
# N8N 加密密钥 (必填!请替换为一个随机生成的强密钥)
# 可以使用 'openssl rand -base64 32' 命令生成
N8N_ENCRYPTION_KEY=your_very_strong_encryption_key_here_for_sensitive_data_in_n8n
# 数据库配置 (如果不需要更改,可以使用默认值)
DB_POSTGRESDB_DATABASE=n8n
DB_POSTGRESDB_USER=n8n
DB_POSTGRESDB_PASSWORD=n8n_password_complex
# 时区设定
GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai
# N8N 基础认证 (可选,如果您需要额外的安全层,请取消注释并设置)
# N8N_BASIC_AUTH_ACTIVE=true
# N8N_BASIC_AUTH_USER=admin
# N8N_BASIC_AUTH_PASSWORD=your_secure_password_for_basic_auth
关于 N8N_ENCRYPTION_KEY 的重要提示:
这个密钥用于加密 N8N 内部存储的敏感数据(如凭证)。务必替换为一个强度够高的随机字符串,并且妥善保管。在生产环境中,丢失这个密钥将导致 N8N 无法解密旧的凭证数据。您可以使用 openssl rand -base64 32 在 Linux/macOS 终端生成一个。
关于 WEBHOOK_URL 的重要提示:
这是 N8N 接收外部 Webhook 请求的地址。它必须是可以在外部网络中访问到的 URL。如果您的 N8N 实例位于 NAT 后面或者没有公网 IP,并且您希望使用 Webhook,则需要配置端口转发或使用类似 ngrok 的工具进行穿透。在生产环境中,通常会配置一个域名并使用 Nginx/Caddy 等反向代理来暴露 N8N 服务,并配置 HTTPS。此时 WEBHOOK_URL 应设置为 https://your.domain.com/。
步骤 4:启动 N8N 服务
在包含 docker-compose.yml 和 .env 文件的目录下,执行以下命令:
docker compose up -d
-d参数表示在后台运行服务(detached mode)。- Docker Compose 将会拉取 N8N 和 PostgreSQL 镜像(如果本地不存在),创建网络和数据卷,并启动这两个服务。
步骤 5:验证安装
服务启动后,等待几分钟让 N8N 和 PostgreSQL 完全初始化。然后,您可以通过浏览器访问 N8N 的 Web 界面:
- 如果
N8N_HOST设置为localhost或127.0.0.1: 访问http://localhost:5678 - 如果
N8N_HOST设置为服务器的公网 IP 或域名: 访问http://<您的服务器IP>:5678或http://<您的域名>:5678
您应该会看到 N8N 的欢迎界面,提示您创建第一个用户账号。
常用 Docker Compose 命令:
- 查看服务状态:
docker compose ps - 查看服务日志:
docker compose logs -f n8n(实时查看 N8N 服务的日志) - 停止所有服务:
docker compose stop - 停止并删除所有服务、网络和数据卷:
docker compose down -v(注意:-v会删除数据卷,慎用!) - 重新构建并启动服务:
docker compose up -d --build(当您修改了Dockerfile或需要重新构建镜像时使用)
方案二:单容器安装 (不包含数据库,不推荐用于生产环境)
如果您只是想快速体验 N8N 而不关心数据持久化(例如,数据丢失不重要或只用于临时测试),可以使用单个 Docker 容器。
docker run -it --rm --name n8n -p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n:latest
--rm: 容器停止时自动删除。-v ~/.n8n:/home/node/.n8n: 将主机上的~/.n8n目录映射到容器中的 N8N 数据目录,以便持久化 N8N 的配置和凭证(但工作流数据仍可能丢失,因为它默认使用 SQLite 且未明确配置)。- 警告: 这种方式默认使用 SQLite 作为数据库,数据会存储在
-v映射的卷中。虽然可以通过卷持久化,但 SQLite 在并发处理和性能上远不如 PostgreSQL 或 MySQL,不建议用于生产环境。
方案三:在 Kubernetes 上部署
如果您正在使用 Kubernetes,那么部署 N8N 将会更加复杂,涉及到 StatefulSets (用于数据库)、Deployments (用于 N8N 应用)、Services (用于内部发现和外部暴露) 以及 Ingress (用于外部访问和 HTTPS)。这超出了一个简单的安装指南范围,但核心思想是:
- 数据库 (PostgreSQL): 通常部署为一个 StatefulSet,并使用 PersistentVolumeClaim (PVC) 来持久化数据。
- N8N 应用: 部署为一个 Deployment,使用 ConfigMaps 存储配置,Secrets 存储敏感信息(如数据库凭证和加密密钥),并挂载 PVC 来持久化自身的配置和内部数据。
- 服务暴露: 创建一个 ClusterIP Service 供 N8N 内部通信,并创建一个 NodePort 或 LoadBalancer Service (或结合 Ingress Controller) 将 N8N 暴露到外部。
如果您需要 Kubernetes 部署的详细指导,请告诉我,我可以为您提供一个更详细的 YAML 示例,但这会是一个更长的讨论。
生产环境最佳实践总结:
- 使用 Docker Compose 或 Kubernetes: 提供隔离、可移植性和易管理性。
- 专用数据库: 始终使用 PostgreSQL 或 MySQL 作为 N8N 的数据库,避免在生产环境中使用 SQLite。
- 数据持久化: 确保 N8N 的数据卷和数据库的数据卷都正确配置,以防止数据丢失。
- 安全加密密钥: 为
N8N_ENCRYPTION_KEY设置一个强大的、唯一的密钥。 - Webhooks URL: 正确配置
WEBHOOK_URL,使其在外部可访问。 - HTTPS: 在生产环境中,务必在 N8N 前面配置一个反向代理(如 Nginx, Caddy)并启用 HTTPS,以保护数据传输安全。
- 备份策略: 定期备份 N8N 的数据卷和数据库数据。
- 资源限制: 在 Docker Compose 或 Kubernetes 中为 N8N 和数据库设置 CPU 和内存限制,防止资源耗尽。
- 日志管理: 考虑将容器日志集成到集中式日志管理系统(如 ELK Stack, Grafana Loki)。
请根据您的具体情况选择最合适的安装方法。如果您在任何步骤中遇到问题,或者有进一步的定制需求(例如,使用 Nginx 配置 HTTPS,或集成到 CI/CD),请随时告诉我!
云服务器安装 N8N 的详细步骤 (使用 Docker Compose)
目标: 在云服务器上部署 N8N 和 PostgreSQL,通过 http://<您的云服务器公网IP>:5678 访问 N8N。
前提条件:
- 一台云服务器: 确保您拥有 root 或具有 sudo 权限的用户账户。
- 安装 Docker 和 Docker Compose:
- 登录您的云服务器。
- 执行以下命令安装 Docker (以 Ubuntu/Debian 为例,其他发行版请参考 Docker 官方文档):
# 更新包列表
sudo apt update
# 安装必要的工具
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker APT 仓库
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" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 再次更新包列表并安装 Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 验证 Docker 是否安装成功
docker --version
```
* **安装 Docker Compose:**
```bash
# 下载最新稳定版 Docker Compose (请检查 GitHub release 页面获取最新版本号)
# 例如:https://github.com/docker/compose/releases
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建软链接 (可选,方便直接使用 docker-compose 命令)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证 Docker Compose 是否安装成功
docker-compose --version
```
* **将当前用户添加到 docker 组 (可选,避免每次都使用 sudo):**
```bash
sudo usermod -aG docker ${USER}
# 退出当前 SSH 会话并重新登录,使改动生效
```
* **重要提示:** 将用户添加到 `docker` 组会赋予其 root 权限,请谨慎操作。
3. **开放防火墙端口:**
* 在您的云服务器提供商的安全组(或防火墙)设置中,**开放 TCP 端口 `5678`**。这是 N8N 默认监听并用于 Web 界面的端口。
* 如果您的云服务器内部也运行了防火墙 (如 `ufw` 或 `firewalld`),请确保也开放了该端口:
* **UFW (Ubuntu/Debian):** `sudo ufw allow 5678/tcp`
* **Firewalld (CentOS/RHEL):** `sudo firewall-cmd --add-port=5678/tcp --permanent && sudo firewall-cmd --reload`
---
### **操作步骤:**
**步骤 1:创建项目目录**
登录到您的云服务器,创建一个目录来存放 N8N 的配置和数据:
```bash
mkdir ~/n8n-production
cd ~/n8n-production
步骤 2:创建 docker-compose.yml 文件
使用 vi、nano 或您喜欢的文本编辑器创建 docker-compose.yml 文件:
# 使用 nano 创建文件
nano docker-compose.yml
然后粘贴以下内容(与之前提供的 docker-compose.yml 保持一致):
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678" # 将主机的5678端口映射到容器的5678端口
environment:
# N8N 服务的主机名或 IP。这里可以是服务器的公网 IP 或域名,但 N8N 自身通常不需要知道
# 它的外部访问方式,除非内部某些旧版Node无法正确识别。
# 对于云服务器,通常设置为 N8N 容器内部的主机名或服务名,Docker会处理路由。
# 但为了明确表达,我们这里依然使用 N8N_HOST 变量
- N8N_HOST=${N8N_HOST} # N8N 访问的域名或IP (此处建议设置为您的公网IP或域名)
- N8N_PORT=5678
- N8N_PROTOCOL=http # 暂时保持HTTP,后续可配置反向代理实现HTTPS
# *** 极其重要:N8N Webhook 的外部可访问 URL ***
# 请务必替换为您的云服务器公网 IP 和端口,或者将来配置的域名
- WEBHOOK_URL=${WEBHOOK_URL}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE:-Asia/Shanghai}
- TZ=${TZ:-Asia/Shanghai}
# 数据库连接配置
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres # 这是 Docker Compose 内部的服务名,无需修改
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${DB_POSTGRESDB_DATABASE:-n8n}
- DB_POSTGRESDB_USER=${DB_POSTGRESDB_USER:-n8n}
- DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD:-n8n_password}
# 启用加密(非常重要!)
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} # 务必设置一个强加密密钥!
# - N8N_BASIC_AUTH_ACTIVE=true # 如果想启用基础认证,请取消注释
# - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
# - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
networks:
- n8n_network
postgres:
image: postgres:13
restart: always
environment:
- POSTGRES_DB=${DB_POSTGRESDB_DATABASE:-n8n}
- POSTGRES_USER=${DB_POSTGRESDB_USER:-n8n}
- POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD:-n8n_password}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- postgres_data:/var/lib/postgresql/data/pgdata
networks:
- n8n_network
volumes:
n8n_data: {}
postgres_data: {}
networks:
n8n_network:
driver: bridge
保存并退出文件 (Ctrl+X, Y, Enter for nano)。
步骤 3:创建 .env 文件 (核心配置)
接下来,创建或编辑 .env 文件。务必将 N8N_HOST 和 WEBHOOK_URL 替换为您的云服务器公网 IP 地址。
# 使用 nano 创建文件
nano .env
粘贴以下内容,并进行必要的修改:
# 请将 <您的云服务器公网IP> 替换为实际的 IP 地址
N8N_HOST=<您的云服务器公网IP>
# *** 极其重要:N8N Webhook 的外部可访问 URL ***
# 也请替换为您的云服务器公网 IP 和端口
WEBHOOK_URL=http://<您的云服务器公网IP>:5678/
# N8N 加密密钥 (必填!请替换为一个随机生成的强密钥)
# 推荐使用:openssl rand -base64 32 命令生成一个
# 示例:N8N_ENCRYPTION_KEY=W3iB+CjN8qL2x9y5h0gS1pM4oQ7vU6Z1T8aX3eV2cF7rD5sP0tI9wK6eG4uJ1lY
N8N_ENCRYPTION_KEY=<your_generated_strong_encryption_key_here>
# 数据库配置 (如果不需要更改,可以使用默认值,但建议更改密码以增强安全性)
DB_POSTGRESDB_DATABASE=n8n_prod
DB_POSTGRESDB_USER=n8n_user
DB_POSTGRESDB_PASSWORD=<your_strong_db_password>
# 时区设定
GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai
# N8N 基础认证 (可选,如果需要为N8N管理页面设置额外的用户名密码,请取消注释并设置)
# N8N_BASIC_AUTH_ACTIVE=true
# N8N_BASIC_AUTH_USER=admin
# N8N_BASIC_AUTH_PASSWORD=<your_admin_password>
替换占位符的重要性:
<您的云服务器公网IP>: 这是您云服务器的外部可见 IP 地址。<your_generated_strong_encryption_key_here>: 这是一个安全关键项。 在 Linux/macOS 终端上执行openssl rand -base64 32,将输出结果复制粘贴到这里。<your_strong_db_password>: 强烈建议更改 PostgreSQL 的默认密码,使用一个强密码。N8N_BASIC_AUTH_ACTIVE,N8N_BASIC_AUTH_USER,N8N_BASIC_AUTH_PASSWORD: 如果您不希望 N8N 界面任何人都可以访问,可以启用基础认证。取消注释这些行,并设置安全的用户名和密码。
保存并退出 .env 文件。
步骤 4:启动 N8N 服务
现在,在 /home/<your_user>/n8n-production 目录下,执行 Docker Compose 命令启动所有服务:
docker compose up -d
- 此命令将拉取 N8N 和 PostgreSQL 镜像(如果它们不在本地),创建并启动 N8N 和 PostgreSQL 容器,同时设置数据卷和网络。
-d参数确保服务在后台运行,即使您关闭 SSH 会话,服务也会继续运行。
步骤 5:验证安装
服务启动后,等待一两分钟让 N8N 完全启动和初始化数据库连接。
然后,打开您的本地浏览器,访问以下 URL:
http://<您的云服务器公网IP>:5678
您应该能看到 N8N 的欢迎界面,提示您创建第一个管理员用户。
可能遇到的问题及排查:
- 无法访问 N8N 界面 (****
ERR_CONNECTION_REFUSED或超时):
- 检查防火墙: 再次确认云服务器提供商的安全组和服务器内部防火墙(如
ufw或firewalld)是否已开放 TCP 端口5678。这是最常见的问题。 - 检查 N8N 容器状态: 在云服务器上运行
docker compose ps,确认n8n和postgres容器的State都是Up。 - 检查 N8N 日志: 运行
docker compose logs -f n8n查看 N8N 容器的启动日志,寻找是否有错误信息(例如数据库连接失败、配置错误等)。 - 检查进程监听: 在云服务器上,可以使用
sudo netstat -tulpn | grep 5678检查是否有进程在监听5678端口。如果 Docker 容器正确运行,应该会看到0.0.0.0:5678或:::5678被 Docker 进程监听。
WEBHOOK_URL配置错误导致 Webhook 不工作:
- 如果您尝试使用 N8N 的 Webhook 功能,但它无法触发,很可能是
WEBHOOK_URL配置不正确。请确保它确实是外部可访问的 URL。如果您的云服务器有域名,更换为域名是更好的选择。
- Docker Compose 命令找不到:
- 检查 Docker Compose 的安装路径和权限,确保它在您的
PATH环境变量中,或者使用完整路径执行 (/usr/local/bin/docker-compose)。
后续优化建议 (生产环境):
虽然您已经可以快速访问 N8N,但为了生产环境的稳定性和安全性,我强烈建议后续进行以下优化:
- 配置 HTTPS:
- 重要! HTTP 连接是不安全的。部署 Nginx 或 Caddy 等反向代理,并在其上配置 Let's Encrypt 证书,实现 HTTPS 访问。这将需要您购买域名并将 DNS 解析到您的云服务器 IP。
- 如果您配置了 HTTPS,
.env中的N8N_PROTOCOL应从http改为https,WEBHOOK_URL也应改为https://your.domain.com/。
- 安全性增强:
- Docker 镜像安全扫描: 定期使用 Trivy 或 Clair 等工具扫描 N8N 及其基础镜像中的漏洞。
- 限制资源: 在
docker-compose.yml中为 N8N 和 PostgreSQL 容器设置limits和reservations来限制 CPU 和内存使用,防止单个服务耗尽宿主机资源。 - 定期更新: 定期更新 N8N 镜像到最新稳定版本,获取新功能和安全补丁。
- 备份策略:
- 为
n8n_data和postgres_data这两个 Docker Volume 配置定期备份策略。这是避免数据丢失的关键。
- 监控与日志:
- 设置监控(例如 Prometheus + Grafana)来跟踪 N8N 和数据库的性能指标。
- 将 Docker logs 收集到集中式日志管理系统。
通过以上步骤,您应该能够在云服务器上成功部署 N8N 并通过公网 IP 访问。如果您在任何一步遇到困难,请提供详细的错误信息,我将帮助您排查。
通过宝塔面板配置域名反向代理到 N8N 的 5678 端口
这意味着我们现在可以假设以下几点:
- 域名已准备就绪:您已经有一个域名 (例如
n8n.yourdomain.com),并已将其 DNS 解析到您的云服务器公网 IP。 - HTTPS 将由宝塔处理:宝塔面板将负责
n8n.yourdomain.com的 HTTPS 证书管理和流量加密,将流量转发到宿主机的5678端口(即 N8N 容器的5678端口)。 - N8N 本身无需直接处理 HTTPS:N8N 容器内部依然可以通过
http://访问。
基于这些假设,我将为您重新确认和输出一套完整的 N8N Docker Compose 配置参数集,重点在于调整 WEBHOOK_URL 和 N8N_HOST,以完美适配宝塔反向代理场景。
云服务器安装 N8N (适配宝塔面板反向代理) 的详细步骤
目标:
- N8N 和 PostgreSQL 通过 Docker Compose 部署在云服务器上。
- 通过宝塔面板配置域名反向代理,实现通过
https://n8n.yourdomain.com访问 N8N。
前提条件:
- 云服务器已安装 Docker 和 Docker Compose。
- 宝塔面板已安装并运行。
- 您拥有一个域名,并已将其 DNS 解析到您的云服务器公网 IP。 (例如:
n8n.yourdomain.com指向您的云服务器 IP) - 云服务器提供商的安全组和服务器内部防火墙(如
ufw或firewalld)已开放 TCP 端口5678。 (因为宝塔需要访问这个端口) - 宝塔面板已配置好该域名并安装了 SSL 证书。 (这部分您说不需要考虑,我仅提醒确保最终有 HTTPS)
操作步骤:
步骤 1:登录云服务器并创建项目目录
登录到您的云服务器,创建一个目录来存放 N8N 的配置和数据:
mkdir ~/n8n-production
cd ~/n8n-production
步骤 2:创建 docker-compose.yml 文件
此文件与之前提供的版本相同,无需任何修改。端口 5678 映射到宿主机,宝塔将访问宿主机的这个端口。
# 使用 nano 创建文件
nano docker-compose.yml
粘贴以下内容:
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
restart: always
ports:
- "5678:5678" # 将主机的5678端口映射到容器的5678端口
environment:
# N8N 服务的主机名或 IP。在有反向代理的情况下,N8N_HOST 可以设置为容器内部服务名、
# 或宿主机的本地IP (172.17.0.1 for docker0 bridge) 甚至留空通常也能工作。
# 为确保兼容性,此处设置为 N8N 容器默认监听的地址 0.0.0.0。
# 由于宝塔会将Host头转发,N8N最终会识别到正确的域名。
- N8N_HOST=0.0.0.0
- N8N_PORT=5678
# 协议设置为 HTTP,因为宝塔面板会在 N8N 容器之前处理 HTTPS
- N8N_PROTOCOL=http
# *** 极其重要:N8N Webhook 的外部可访问 URL ***
# 这里必须是您通过宝塔面板反向代理后的域名,并使用 HTTPS。
- WEBHOOK_URL=${WEBHOOK_URL}
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE:-Asia/Shanghai}
- TZ=${TZ:-Asia/Shanghai}
# 数据库连接配置
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=${DB_POSTGRESDB_DATABASE:-n8n}
- DB_POSTGRESDB_USER=${DB_POSTGRESDB_USER:-n8n}
- DB_POSTGRESDB_PASSWORD=${DB_POSTGRESDB_PASSWORD:-n8n_password}
# 启用加密(非常重要!)
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY} # 务必设置一个强加密密钥!
# - N8N_BASIC_AUTH_ACTIVE=true # 如果想启用基础认证,请取消注释
# - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
# - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
- postgres
networks:
- n8n_network
postgres:
image: postgres:13
restart: always
environment:
- POSTGRES_DB=${DB_POSTGRESDB_DATABASE:-n8n}
- POSTGRES_USER=${DB_POSTGRESDB_USER:-n8n}
- POSTGRES_PASSWORD=${DB_POSTGRESDB_PASSWORD:-n8n_password}
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- postgres_data:/var/lib/postgresql/data/pgdata
networks:
- n8n_network
volumes:
n8n_data: {}
postgres_data: {}
networks:
n8n_network:
driver: bridge
保存并退出文件。
步骤 3:创建 .env 文件 (核心配置)
现在,创建或编辑 .env 文件。在这里,****N8N_HOST 设为 0.0.0.0 (表示监听所有网络接口)。****WEBHOOK_URL 必须设置为您通过宝塔面板配置的完整域名,并使用 https:// 。
# 使用 nano 创建文件
nano .env
粘贴以下内容,并进行必要的修改:
# N8N 服务的主机名或 IP。在有反向代理时,设置为0.0.0.0或不设置亦可。
# N8N_HOST=0.0.0.0
# *** 极其重要:N8N Webhook 的外部可访问 URL ***
# 请将 n8n.yourdomain.com 替换为您实际的域名,并确保使用 HTTPS!
WEBHOOK_URL=https://n8n.yourdomain.com/
# N8N 加密密钥 (必填!请替换为一个随机生成的强密钥)
# 推荐使用:openssl rand -base64 32 命令生成一个
# 示例:N8N_ENCRYPTION_KEY=W3iB+CjN8qL2x9y5h0gS1pM4oQ7vU6Z1T8aX3eV2cF7rD5sP0tI9wK6eG4uJ1lY
N8N_ENCRYPTION_KEY=<your_generated_strong_encryption_key_here>
# 数据库配置 (如果不需要更改,可以使用默认值,但建议更改密码以增强安全性)
DB_POSTGRESDB_DATABASE=n8n_prod
DB_POSTGRESDB_USER=n8n_user
DB_POSTGRESDB_PASSWORD=<your_strong_db_password>
# 时区设定
GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai
# N8N 基础认证 (可选,如果您需要为N8N管理页面设置额外的用户名密码,请取消注释并设置)
# N8N_BASIC_AUTH_ACTIVE=true
# N8N_BASIC_AUTH_USER=admin
# N8N_BASIC_AUTH_PASSWORD=<your_admin_password>
替换占位符的重要性:
n8n.yourdomain.com: 替换为您实际用于访问 N8N 的域名。<your_generated_strong_encryption_key_here>: 这是一个安全关键项。 在 Linux/macOS 终端上执行openssl rand -base64 32,将输出结果复制粘贴到这里。<your_strong_db_password>: 强烈建议更改 PostgreSQL 的默认密码,使用一个强密码。- 如果您决定启用
N8N_BASIC_AUTH_ACTIVE,请设置安全的用户密码。
保存并退出 .env 文件。
步骤 4:启动 N8N 服务
在 /home/<your_user>/n8n-production 目录下,执行 Docker Compose 命令启动所有服务:
docker compose up -d
- 此命令将拉取 N8N 和 PostgreSQL 镜像,创建并启动 N8N 和 PostgreSQL 容器,同时设置数据卷和网络。
-d参数确保服务在后台运行。
步骤 5:宝塔面板配置反向代理
- 登录宝塔面板。
- 进入 网站 菜单。
- 点击 添加站点,输入您的域名 (例如
n8n.yourdomain.com),根目录可以随意设置一个空目录。创建后,点击该域名的 设置。 - 在网站设置中,找到 反向代理 选项卡。
- 点击 添加反向代理。
- 代理名称: N8N Proxy (或其他您喜欢的名称)
- 目标 URL:
http://127.0.0.1:5678(或http://localhost:5678) - 解释: 宝塔面板部署在云服务器宿主机上,N8N 容器的
5678端口已映射到宿主机的5678端口。所以宝塔可以直接通过127.0.0.1访问宿主机上的这个端口。 - 发送域名:
n8n.yourdomain.com(填写您的实际域名) - 启用缓存: 默认关闭 (N8N 不需要缓存其管理界面)
- 点击 提交。
- (可选,但强烈推荐) 在网站设置的 SSL 选项卡中,为您的域名申请并部署 SSL 证书 (例如使用 Let's Encrypt),并打开 强制 HTTPS。这将确保您的 N8N 流量加密。
步骤 6:验证访问
服务启动并宝塔反向代理配置完成后,等待一两分钟。然后,打开您的本地浏览器,访问以下 URL:
https://n8n.yourdomain.com
您应该能看到 N8N 的欢迎界面,提示您创建第一个管理员用户。
总结确认 N8N 配置参数 ( .env 文件):
# N8N 服务的主机名或 IP。
# 在有反向代理时,N8N 容器无需知道外部完整域名,自身监听所有接口即可。
# N8N_HOST=0.0.0.0
# *** 极其重要:N8N Webhook 的外部可访问 URL ***
# 这是 N8N 用来生成 Webhook URL 和自身回调地址的。
# 必须是您的真实域名,且使用 HTTPS,因为宝塔已经为您处理了 HTTPS。
WEBHOOK_URL=https://n8n.yourdomain.com/
# N8N 加密密钥 (必填!请替换为一个随机生成的强密钥)
# 例如:openssl rand -base64 32
N8N_ENCRYPTION_KEY=<your_generated_strong_encryption_key_here>
# 数据库配置 (建议更改密码以增强安全性)
DB_POSTGRESDB_DATABASE=n8n_prod
DB_POSTGRESDB_USER=n8n_user
DB_POSTGRESDB_PASSWORD=<your_strong_db_password>
# 时区设定
GENERIC_TIMEZONE=Asia/Shanghai
TZ=Asia/Shanghai
# N8N 基础认证 (可选,如果需要额外的后台管理页面登录保护)
# N8N_BASIC_AUTH_ACTIVE=true
# N8N_BASIC_AUTH_USER=admin
# N8N_BASIC_AUTH_PASSWORD=<your_admin_password>
请按照以上步骤操作,并仔细替换所有占位符。这样可以确保 N8N 在您的云服务器上正确运行,并通过宝塔面板的域名反向代理实现 HTTPS 访问。如果遇到任何问题,例如访问不到或 Webhook 不工作,请提供宝塔面板的错误日志或 N8N 的容器日志,我将帮助您排查。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于