Docker-Compose#
本指南介绍如何使用 Docker Compose 在 Linux 服务器上运行 n8n。
若已安装 Docker 和 Docker-Compose,可直接从步骤 3 开始操作。
各类架构的 Docker Compose 配置可在 n8n-hosting 代码库 中获取。
自托管知识前提
自托管 n8n 需要具备以下技术知识:
- 服务器与容器的设置配置
- 应用资源管理与扩展
- 服务器与应用安全防护
- n8n 配置
n8n 建议仅由专业用户进行自托管。操作失误可能导致数据丢失、安全隐患及服务中断。若缺乏服务器管理经验,推荐使用 n8n 云服务。
最新版与预览版
n8n 每周会发布新的次要版本。latest 为稳定生产版本,next 是最新发布的预览版本。请将 next 视为测试版:可能存在不稳定情况。问题反馈请至社区论坛。
当前 latest 版本:1.119.2
当前 next 版本:1.119.3
1. 安装 Docker 与 Docker Compose#
Docker 与 Docker Compose 的安装方式因 Linux 发行版而异。各组件具体安装指南请参考以下链接:
完成安装后,可通过以下命令验证 Docker 与 Docker Compose 是否可用:
docker --version docker compose version
2. 可选:非root用户访问#
您可以选择授予无需使用sudo命令即可运行Docker的权限。
要为当前登录的用户授予访问权限(假设该用户拥有sudo权限),请运行:
sudo usermod -aG docker ${USER} # Register the `docker` group membership with current session without changing your primary group exec sg docker newgrp
要授予其他用户访问权限,请键入以下命令,并将 <USER_TO_RUN_DOCKER> 替换为相应的用户名:
sudo usermod -aG docker <USER_TO_RUN_DOCKER>
您需要在该用户的任意现有会话中运行 exec sg docker newgrp 命令,才能使其获取新的组权限。
可通过输入以下命令验证当前会话是否已识别 docker 用户组:
groups
3. DNS配置#
若要在线上或网络中托管n8n,请创建一个指向您服务器的专用子域名。
添加A记录以路由该子域名:
| 记录类型 | 名称 | 目标地址 |
|---|---|---|
| A | n8n(或您所需的子域名) | <您的服务器IP地址> |
4. 创建.env文件#
创建项目目录用于存储n8n环境配置和Docker Compose文件,并进入该目录:
mkdir n8n-compose
cd n8n-compose
在 n8n-compose 目录中,创建一个 .env 文件以自定义 n8n 实例的配置信息。请根据您的实际情况修改以下内容:
# DOMAIN_NAME and SUBDOMAIN together determine where n8n will be reachable from
# The top level domain to serve from
DOMAIN_NAME=example.com
# The subdomain to serve from
SUBDOMAIN=n8n
# The above example serve n8n at: https://n8n.example.com
# Optional timezone to set which gets used by Cron and other scheduling nodes
# New York is the default value if not set
GENERIC_TIMEZONE=Europe/Berlin
# The email address to use for the TLS/SSL certificate creation
SSL_EMAIL=user@example.com
5. 创建本地文件目录#
在项目目录内创建一个名为 local-files 的目录,用于在 n8n 实例与主机系统之间共享文件(例如,使用磁盘文件读写节点):
mkdir local-files
以下Docker Compose文件可自动创建此目录,但手动操作能确保目录以正确的所有权和权限创建。
6. 创建Docker Compose文件#
创建 compose.yaml 文件,并将以下内容粘贴至文件中:
services:
traefik:
image: "traefik"
restart: always
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
- "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
- "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- traefik_data:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
n8n:
image: docker.n8n.io/n8nio/n8n
restart: always
ports:
- "127.0.0.1:5678:5678"
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
- traefik.http.routers.n8n.tls=true
- traefik.http.routers.n8n.entrypoints=web,websecure
- traefik.http.routers.n8n.tls.certresolver=mytlschallenge
- traefik.http.middlewares.n8n.headers.SSLRedirect=true
- traefik.http.middlewares.n8n.headers.STSSeconds=315360000
- traefik.http.middlewares.n8n.headers.browserXSSFilter=true
- traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
- traefik.http.middlewares.n8n.headers.forceSTSHeader=true
- traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}
- traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
- traefik.http.middlewares.n8n.headers.STSPreload=true
- traefik.http.routers.n8n.middlewares=n8n@docker
environment:
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- N8N_RUNNERS_ENABLED=true
- NODE_ENV=production
- WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
- GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
- TZ=${GENERIC_TIMEZONE}
volumes:
- n8n_data:/home/node/.n8n
- ./local-files:/files
volumes:
n8n_data:
traefik_data:
上述 Docker Compose 文件配置了两个容器:一个用于运行 n8n,另一个用于运行 traefik——一个用于管理 TLS/SSL 证书和处理路由的应用代理。
该配置还创建并挂载了两个 Docker 卷,同时挂载了先前创建的 local-files 目录:
| 名称 | 类型 | 容器挂载点 | 说明 |
|---|---|---|---|
n8n_data | 卷 | /home/node/.n8n | n8n 存储 SQLite 数据库文件和加密密钥的位置 |
traefik_data | 卷 | /letsencrypt | traefik 存储 TLS/SSL 证书数据的位置 |
./local-files | 绑定挂载 | /files | n8n 实例与宿主机共享的本地目录。在 n8n 中可通过 /files 路径读写该目录 |
7. 启动 Docker Compose#
通过以下命令启动 n8n:
sudo docker compose up -d
要停止容器,请输入:
sudo docker compose stop
8. 完成#
现在您可以通过在 .env 文件配置中定义的子域名+域名组合访问 n8n。以 上示例将生成 https://n8n.example.com 访问地址。
n8n 仅支持通过安全的 HTTPS 协议访问,不支持明文 HTTP 协议。
若访问实例时遇到问题,请检查服务器防火墙设置及 DNS 配置。