Docker-Compose#
这些说明介绍了如何在 Linux 服务器上使用 Docker Compose 运行 n8n。 如果你已经安装了 Docker 和 Docker Compose,可以直接从第 3 步开始。 你可以在 n8n-hosting 仓库中找到适用于不同架构的 Docker Compose 配置。
自托管知识前提
自托管 n8n 需要一定的技术知识,包括:
- 设置和配置服务器与容器
- 管理应用程序资源和扩展
- 保护服务器和应用程序安全
- 配置 n8n
n8n 建议仅由高级用户进行自托管。操作失误可能导致数据丢失、安全问题或服务中断。如果你没有管理服务器的经验,n8n 推荐使用 n8n Cloud。
最新版本(Latest)与开发版本(Next)
n8n 每周通常会发布一个新的次要版本。latest 版本适用于生产环境。next 是最新的开发版本,应视为测试版(beta):它可能不稳定。如需报告问题,请使用 论坛。
当前 latest 版本:1.115.2
当前 next 版本:1.116.1
1. 安装 Docker 和 Docker Compose#
安装 Docker 和 Docker Compose 的方式取决于你使用的 Linux 发行版。你可以通过以下链接查看每个组件的具体安装说明:
- Docker Engine
- Docker Compose
完成安装后,输入以下命令验证 Docker 和 Docker Compose 是否已正确安装并可用:
1
2| ``` docker --version && docker compose version
---|---
## 2. 可选:非 root 用户访问权限#
你可以选择性地授予某个用户无需使用 `sudo` 命令即可运行 Docker 的权限。
要为当前登录的用户(假设该用户具有 `sudo` 权限)授予权限,请运行:1 2 3
| ```
sudo groupadd docker 2>/dev/null || true
sudo usermod -aG docker ${USER}
# 将 `docker` 组成员身份注册到当前会话,而不更改主组
exec sg docker newgrp $(id -gn)---|---
若要为其他用户授予权限,请将 <USER_TO_RUN_DOCKER> 替换为对应用户名后执行以下命令:
1| ``` sudo usermod -aG docker <USER_TO_RUN_DOCKER>
---|---
你需要在该用户的任意现有会话中运行 `exec sg docker newgrp`,以便其获得新的组权限。
你可以通过输入以下命令来验证当前会话是否识别到了 `docker` 组:1
| ```
groups
---|---
## 3. DNS 设置 #
要将 n8n 部署在公网或局域网中,需创建一个指向你服务器的专用子域名。
添加一条 A 记录以正确路由该子域名:
记录类型 | 名称 | 目标
---|---|---
A | `n8n`(或你希望使用的子域名) | `<your_server_IP_address>`
## 4. 创建 `.env` 文件 #
创建一个项目目录,用于存储 n8n 的环境配置和 Docker Compose 文件,并进入该目录:1 2
| ```
mkdir n8n-compose && cd n8n-compose---|---
在 n8n-compose 目录中,创建一个 .env 文件,用于自定义 n8n 实例的相关信息。请根据你的实际情况修改以下内容:
.env 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15| ```
DOMAIN_NAME 和 SUBDOMAIN 共同决定 n8n 的访问地址
要服务的顶级域名
DOMAIN_NAME=example.com
要服务的子域名
SUBDOMAIN=n8n
上面的例子将使 n8n 可通过 https://n8n.example.com 访问
可选的时区设置,Cron 和其他调度节点会使用该时区
若不设置,默认为纽约时间
GENERIC_TIMEZONE=Europe/Berlin
用于 TLS/SSL 证书申请的电子邮件地址
SSL_EMAIL=user@example.com
5. 创建本地文件目录#
在你的项目目录中,创建一个名为 local-files 的目录,用于在 n8n 实例和宿主系统之间共享文件(例如,使用 Read/Write Files from Disk 节点):
1| ``` mkdir
---|---
下面的 Docker Compose 文件可以自动创建此目录,但手动创建可确保其具有正确的所有权和权限。
## 6. 创建 Docker Compose 文件#
创建一个 `compose.yaml` 文件,并将以下内容粘贴进去:
compose.yaml 文件
---1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| ```
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 Volume,并挂载了你之前创建的 `local-files` 目录:
名称 | 类型 | 容器挂载点 | 描述
---|---|---|---
`n8n_data` | Volume | `/home/node/.n8n` | n8n 保存其 SQLite 数据库文件和加密密钥的位置。
`traefik_data` | Volume | `/letsencrypt` | traefik 保存 TLS/SSL 证书数据的位置。
`./local-files` | Bind | `/files` | 在 n8n 实例与主机之间共享的本地目录。在 n8n 中,使用 `/files` 路径来读取和写入该目录。
## 7. 启动 Docker Compose#
通过输入以下命令启动 n8n:1
| ```
sudo---|--- 要停止容器,请输入:
1| ``` sudo
---|---
## 8. 完成#
现在你可以通过在 `.env` 文件中定义的子域名 + 域名组合访问 n8n。以上示例将生成 `https://n8n.example.com`。
n8n 仅可通过安全的 HTTPS 访问,不支持明文 HTTP。
如果你无法访问你的实例,请检查服务器的防火墙设置以及 DNS 配置。
## 下一步#
* 进一步了解 配置 和 扩展 n8n。
* 或者开始探索使用 n8n:尝试 快速入门。