Skip to content

Docker-Compose#

这些说明涵盖了如何使用Docker Compose在Linux服务器上运行n8n。

如果您已经安装了Docker和Docker-Compose,那么您可以从步骤3开始。

您可以在n8n-hosting存储库中找到各种架构的Docker Compose配置。

自托管知识先决条件

自托管 n8n 需要技术知识,包括:

  • 设置和配置服务器和容器
  • 管理应用程序资源和扩展
  • 保护服务器和应用程序
  • 配置 n8n

n8n 建议专业用户进行自托管。错误可能导致数据丢失、安全问题和停机。如果您在管理服务器方面缺乏经验,n8n 建议使用 n8n Cloud

Latest 和 Next 版本

n8n 每周发布一个新的次要版本。latest 版本用于生产环境。next 是最新的发布版本。您应该将 next 视为测试版:它可能不稳定。要报告问题,请使用论坛

Current latest: 1.112.4
Current next: 1.113.1

1. 安装 Docker 和 Docker Compose#

安装Docker和Docker Compose的方式取决于您的Linux发行版。您可以在下面的链接中找到每个组件的具体说明:

按照安装说明后,通过输入以下命令验证Docker和Docker Compose是否可用:

1
2
docker --version
docker compose version

2. 可选:非 root 用户访问#

您可以选择授予运行 Docker 而无需 sudo 命令的权限。

要向您当前登录的用户授予访问权限(假设他们有 sudo 访问权限),请运行:

1
2
3
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> 替换为适当的用户名:

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 file
 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=[email protected]

5. 创建本地文件目录#

在您的项目目录中,创建一个名为local-files的目录,用于在n8n实例和主机系统之间共享文件(例如,使用从磁盘读取/写入文件节点):

1
mkdir local-files

下面的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卷并挂载您之前创建的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 docker compose up -d

要停止容器,请输入:

1
sudo docker compose stop

8. 完成#

您现在可以使用在.env文件配置中定义的子域+域组合访问n8n。上述示例将产生https://n8n.example.com

n8n只能通过安全的HTTPS访问,不能通过普通HTTP访问。

如果您在访问实例时遇到问题,请检查服务器的防火墙设置和DNS配置。

后续步骤#