😇

n8nをKamalで自宅サーバーにデプロイしてみた

に公開

やりたいこと

今話題(?)のn8nを自宅サーバーで使えるように、Kamalでデプロイしてみた。

つかうもの

以下にKamalを使ったデプロイの記事を書いたので、そちらを参照してください
https://zenn.dev/kehra/articles/5eb8e3ef684523

  • Dockerfile

つかうものの説明

Dockerfile

Public imageをそのまま使えないので、wrapperのようなDockerfileを用意します。

色々試行錯誤しすぎて、本当にこれで良いのかあまり自身がないです 😢

FROM n8nio/n8n:latest

ENV GENERIC_TIMEZONE=Asia/Tokyo
ENV TZ=Asia/Tokyo

ENV N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true

RUN mkdir -p /home/node/.n8n

WORKDIR /home/node/.n8n

USER node

Kamal

n8nをPostgreSQLを使う構成で用意してみました。

# config/deploy.yml

service: n8n

image: kehra/n8n

servers:
  web:
    - 192.168.1.xxx

registry:
  username: kehra
  password:
    - KAMAL_REGISTRY_PASSWORD

env:
  clear:
    PORT: 5678
  secret:
    - N8N_BASIC_AUTH_USER
    - N8N_BASIC_AUTH_PASSWORD
    - N8N_ENCRYPTION_KEY
    - DB_TYPE
    - DB_POSTGRESDB_HOST
    - DB_POSTGRESDB_PORT
    - DB_POSTGRESDB_DATABASE
    - DB_POSTGRESDB_USER
    - DB_POSTGRESDB_PASSWORD
    - WEBHOOK_URL
    - N8N_HOST
    - N8N_PROTOCOL

ssh:
  user: kehra
  keys: [ ~/.ssh/id_rsa ]

builder:
  arch: amd64

volumes:
  - "n8n_storage:/home/node/.n8n"

accessories:
  postgres:
    image: postgres:17
    host: 192.168.1.xxx
    port: 5432
    env:
      clear:
        POSTGRES_DB: n8n
      secret:
        - POSTGRES_USER
        - POSTGRES_PASSWORD
    directories:
      - data:/var/lib/postgresql/data

proxy:
  app_port: 5678
  host: n8n.example.com
  healthcheck:
    path: /healthz

ポイントはhealthcheckの設定です。
Kamalはcontainerが正常に起動したかどうかをhealthcheckの設定に応じて行っているのですが、デフォルトは/upです。
しかし、n8nには/upのエンドポイントはなく、healthcheckが通らないので、containerの起動に失敗したとみなされてdeployが失敗します。
なので、ここの設定は注意です。

締め

いかがでしたでしょうか?
こんな構成を組む人がどれだけいるのかわかりませんが、healthcheckでめちゃくちゃ引っかかったので、どなたかのお役に立てればと思い、雑に書いてみました。

Discussion