N8N中文教程
部署托管/Installation/Server_setups

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:尝试 快速入门。