n8n 部署

n8n 部署

使用docker compose部署n8n工作流

1. docker 部署配置

.env

# DOMAIN_NAME 和 SUBDOMAIN 一起确定从哪里可以访问 n8n
# 要提供服务的顶级域
DOMAIN_NAME=example.com

# 要提供服务的子域
SUBDOMAIN=n8n

# 上述示例在以下位置提供 n8n:https://n8n.example.com

# 可选时区设置,由 Cron 和其他调度节点使用
# 如果未设置,纽约是默认值
GENERIC_TIMEZONE=Asia/Shanghai

# 用于 TLS/SSL 证书创建的电子邮件地址
SSL_EMAIL=example@outlook.com

# postgre相关信息
DATABASE_HOST=127.0.0.1
DATABASE_USER=n8n
DATABASE_PWD=n8n
DATABASE_PORT=5432
DATABASE_NAME=n8n

docker-compose.yml

可以在其他服务器部署以下文件,域名指向域名服务器,通过该服务器 nginx 进行代理

services::
  n8n:
    image: n8nio/n8n:latest
    restart: always
    ports:
        - 5678:5678
        - 5679:5679
    environment:
        - DB_TYPE=postgresdb
        - DB_POSTGRESDB_DATABASE=${DATABASE_NAME}
        - DB_POSTGRESDB_HOST=${DATABASE_HOST}
        - DB_POSTGRESDB_PORT=${DATABASE_PORT}
        - DB_POSTGRESDB_USER=${DATABASE_USER}
        - DB_POSTGRESDB_PASSWORD=${DATABASE_PWD}
        - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
        - N8N_PORT=5678
          #- N8N_SECURE_COOKIE=false
        - N8N_RUNNERS_ENABLED=true
        - N8N_PROTOCOL=https
        - NODE_ENV=production
        - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
        - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    volumes:
        - ./n8n_data:/home/node/.n8n
        - ./local-files:/files
# 部署
docker compose  -d

2. 配置 nginx 代理

现使用我主域名下的子域名,n8n.example.com,需要提前申请子域名或者泛域名 SSL 证书,并且设置如下的 nginx 配置

server{
       listen       80;
       listen  [::]:80;
       server_name n8n.example.com;
       charset utf-8;

       #http跳转到https
       location / {
          return 301 https://$host$request_uri;
       }
}

server {
    listen       443 ssl;
    server_name  n8n.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # 添加
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://[n8n实际所在的服务器]:[port];

        proxy_ssl_server_name on;
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

3. 注意事项

  • 一定要注意 ./n8n_data 的文件夹权限,自动创建的会导致 docker 内无法修改,需要手动 sudo chmod 777 给权限

4. 修复

4.1 n8n 显示 Connection lost 的错误

我使用的是使用 docker compose 安装 n8n,然后使用 nginx 进行反代,可以修改为使用 websocket 的检测方式

docker-compose.yml

services:
  n8n:
    image: n8nio/n8n
    container_name: n8n
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    environment:
      # ...
      # 添加下面这一行
      - N8N_PUSH_BACKEND=websocket
      # ...
  

修改 nginx 的配置文件

location / {  
    proxy_pass http://127.0.0.1:5678;  
    proxy_set_header Host $host;  
    proxy_set_header X-Real-IP $remote_addr;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    proxy_set_header X-Forwarded-Proto https;  
  
    # 添加下面三行  
    proxy_http_version 1.1;   
    proxy_set_header Upgrade $http_upgrade;  
    proxy_set_header Connection "upgrade";  
}

应用配置

docker compose down 
docker compose up -d

nginx -t
nginx -s reload

5. 样例

订阅新闻邮件

5.1 准备工作

  • 注册 Firecrawl 作为爬取工具
  • 一个 LLM apikey
  • 部署好的 n8n
  • rss.app 生成一个 rss 订阅链接

5.2 创建

5.2.1 创建一个工作流

5.2.2 建立 Schedule Trigger 节点

设为每天早上七点触发一次

5.2.3 建立 RSS Read 节点

选择使用 AIbase 的信息源,通过 rss.app 建立一个 rss 订阅链接

把生成的 RSS 订阅链接复制到 RSS Read 节点

5.2.4 建立 FireCrawl 节点

选中 FireCrawl 的 Scrape a url and get its content

在注册的 FireCrawl 中获取自己的 API Key

在 n8n 中添加 FireCrawl 账号信息,并且拖动 link 到 Url 中即可

5.2.5 建立 AI Agent 节点

输入提示词与要输入的 data,然后在左下角选择对应的 LLM 模型

5.2.6 添加 Markdown 节点

选择 Markdown to HTML,Markdown 栏输入公式 {{ $json.output.join("\n\n") }},用于给不同的信息之间添加换行,Destination Key栏填入data

5.2.7 添加聚合(Aggregate)节点

5.2.8 添加 Email 节点

6. 参考文档

评论