果報

二度寝して待つ

Oracle Cloudの無料枠で、外部から接続可能なn8nのサーバを構築する

Oracle Cloud Infrastructure(OCI)で、インターネットから接続可能なn8nのサーバを構築します。

OCIサーバの構築

OCIでのサーバ新規作成(というか、n8nの構築含めて)は、基本的に以下のサイトを参考にすればだいたいうまくいきます。

www.thomasmartens.eu

なので、ここではポイントだけ書いておきます。

  • OSはCanonical Ubuntu 22.04 with the latest build dateを選択する
  • 東京リージョンの場合「VM.Standard.A1.Flex」は基本空いてないので「VM.Standard.E2.1.Micro」で妥協する
  • インスタンス構築後、パブリックIPを予約して対象インスタンスに付与する
  • 80,443ポートを許可を忘れないようにする

Dockerのインストール

n8nはDockerのコンテナで動かします。

Dockerのインストール方法は色々なサイトで紹介されているので、どこを参考にしてもよいです。ここでは先ほど紹介したサイトのコマンドを引用します。

$ sudo apt install ca-certificates curl gnupg lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

インストール後、以下のコマンドを実行して、sudoなしでdockerコマンド打てるようにします。

$ sudo usermod -aG docker $USER

Caddyのインストール

Caddyは、httpsの通信をn8nに転送(リバースプロキシ)するためのWebサーバです。Caddy以外にも、nginxとか、公式サイトにもあるTraefikをDockerで起動する方法とかいくつか選択肢はあるようですが、Caddy以外は数時間苦戦してもうまくいかなかったので、Caddyを使います。

$ sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
$ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
$ sudo apt update
$ sudo apt install caddy

iptablesのアンインストール

OCIのUbuntuではiptablesがufwの役割を果たしてるようで、はっきり言って邪魔なので削除します。終わったら念のためサーバを再起動します。

$ sudo apt remove iptables-persistent
$ sudo reboot

n8nのインストール(Docker)

n8n用のフォルダを作成して、Docker構成ファイルを作成します。

$ cd ~
$ mkdir n8n
$ cd n8n
$ nano docker-compose.yml

構成ファイルの内容は以下のとおり。restart: alwaysenvironment:は、冒頭に記載したサイトから変更しています。

version: '2'
services:
  n8n:
  image: n8nio/n8n:latest
  restart: always
  ports:
    - 5678:5678
  environment:
    - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
    - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    - N8N_DIAGNOSTICS_ENABLED=false
    - N8N_VERSION_NOTIFICATIONS_ENABLED=false
    - N8N_TEMPLATES_ENABLED=false
    - EXTERNAL_FRONTEND_HOOKS_URLS=
    - N8N_DIAGNOSTICS_CONFIG_FRONTEND=
    - N8N_DIAGNOSTICS_CONFIG_BACKEND=
    - N8N_ONBOARDING_FLOW_DISABLED=true
volumes:
- ./n8n_data:/home/node/.n8n

- N8N_DIAGNOSTICS_ENABLED=false以下の設定は、今回構築したサーバがn8n.io/n8n.cloudと不要な通信をしないようにする設定で、以下の記事(冒頭のサイトと同じ人)を参考にしました。

www.thomasmartens.eu

次に環境設定を編集します。

$ nano .env
DOMAIN_NAME=yusukesakai.com
SUBDOMAIN=n8n

N8N_LOG_OUTPUT=file
EXECUTIONS_TIMEOUT=600
EXECUTIONS_DATA_MAX_AGE=240
GENERIC_TIMEZONE=Asia/Tokyo

パラメータは以下のサイトを参考にしました。

qiita.com

ここまでくればn8nを起動できるはずなので、以下のコマンドを実行します。

$ docker compose up -d

Caddyの設定

インターネットからアクセスできるようにCaddyの設定を変更します。

$ sudo nano /etc/caddy/Caddyfile

うちのサイトはCloudflareのSSL証明書を使っているので、それにあわせた設定をします。設定は以下のサイトを参考にしました。

samjmck.com

{
        ocsp_stapling off
        servers {
                strict_sni_host
        }
}

n8n.yusukesakai.com {
        root * /usr/share/caddy
        file_server
        reverse_proxy localhost:5678 {
                flush_interval -1
                transport http {
                        compression off
                }
        }
        tls /etc/ssl/certs/yusukesakai.com.pem /etc/ssl/private/yusukesakai.com.key {
                client_auth {
                        mode require_and_verify
                        trusted_ca_cert_file /etc/ssl/certs/origin-pull-ca.pem
                }
        }
}

ここは地味にハマったので、ポイントをいくつか書きます。

  • 設定のインデントは半角スペースではなくタブを使う(でないとエラーになる)
  • 証明書の格納先に適切な権限を設定する(でないとエラーになる)

編集後、以下のコマンドで設定ファイルに問題がないか検証します。

$ sudo caddy validate --config /etc/caddy/Caddyfile

問題なければサービスを再起動します。

$ sudo systemctl restart caddy

うまくいけば、これで最初のユーザ作成画面が表示されるはずです。お疲れさまでした。

Cloudflareに関する補足

n8nでいざ新規ワークフローを作成しようと思ったら、画面の右上に「Connection lost」と表示されて作成できませんでした。

原因はCloudflareのキャッシュ設定でn8nも対象にしてたからで、対象のサブドメインを除外したらうまくいきました。