n8nは以前も建てていたのだが、SSDが死んだ時にまるごと消えてしまった上に、バックアップも取っていなかった。

しばらくはそのままでも良いかなと思っていたが、今回n8nを使いたい案件があったため改めて構築したが、少し分かりづらかったので自分の言葉でまとめておく。

前提

Ubuntu 22.04

Docker、docker-composeインストール済み

私はOracle Cloudで建てている。

docker-compose周り

ドキュメントはここにある。

が、ちょっと分かりづらい。

公式リポジトリにも設定のサンプルがあるが、こちらを使ったほうが良いかも。

ただ、私は規模が小さいのでPostgreSQLまでは不要としてSQLiteを使うことにした。

そして設定は最小限とし、パブリックアクセス可能にしている。

docker-compose.yaml

version: '3.8'

services:
  n8n:
    build: .
    #image: n8nio/n8n
    restart: always
    environment:
      - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER
      - N8N_BASIC_AUTH_PASSWORD
    ports:
      - 5678:5678
    volumes:
      - ./n8n:/home/node/
    command: /bin/sh -c "n8n start"

Dockerfile

FROM n8nio/n8n

RUN apk --update add curl

.env

# The top level domain to serve from
DOMAIN_NAME=example.com

# The subdomain to serve from
SUBDOMAIN=n8n

# DOMAIN_NAME and SUBDOMAIN combined decide where n8n will be reachable from
# above example would result in: https://n8n.example.com

# The user name to use for authentication - IMPORTANT ALWAYS CHANGE!
N8N_BASIC_AUTH_USER=user

# The password to use for authentication - IMPORTANT ALWAYS CHANGE!
N8N_BASIC_AUTH_PASSWORD=password

WEBHOOK_TUNNEL_URLは使わないけど一応設定。

curlも今のところ不要だが、以前必要になったことがあったので手前でビルドすることにした。

ぶっちゃけ今BASICの設定がいるのか不明(以前は無いと直アクセスだった)

今は普通に認証があるのでなくても挙動は変わらなかった。

nginx

nginxでリバプロするようにしているが、設定のサンプルが見つけられなかったので、以下のように設定している。

server {
  listen 80;
  server_name n8n.example.com;

  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl http2;
  server_name n8n.xn--krsgw--n73t.com;

  ssl_certificate     /etc/letsencrypt/live/n8n.example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem;

  ssl_session_cache shared:le_nginx_SSL:10m;
  ssl_session_timeout 1440m;
  ssl_session_tickets off;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers off;

  ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
  #ssl_dhparam /etc/letsencrypt/dhparam.pem;

   location / {
        proxy_pass http://localhost:5678;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        #proxy_cache_bypass $http_upgrade;
        proxy_buffering off;
        proxy_cache off;
   }
#  error_log /var/log/nginx/error.log ;
}

なお、最近では以下の設定が必須らしく、これがないとそれぞれのタスクが永遠に終わらない事象が発生したり、即切断されてしまった。

※調べて出てきたんだけどソースメモってない

proxy_buffering off;
proxy_cache off;

まとめ

こんな感じで最低限の設定は完了となる。

あとは煮るなり焼くなり好きにすれば良いと思う。

なお、これを見てもあくまで参考程度とし、必ずしも動く保証があるものではないことをここに記載する。

では、また。