TAKASHI TOYOFUKU

n8nをセルフホスティングする

June 9, 2024

n8n cloudだと個人運用するには費用が高く、workflow数が限られるのでDigitalOceanにホスティングする

n8nをセルフホスティングする

他のクラウドサービスを使う場合はよしなに読み替えてください。

手順

  1. SSH の設定
  2. Droplet 作成
  3. SSH テスト
  4. Docker のインストール
  5. DNS の設定
  6. Droplet のポート開放
  7. caddy の設定
  8. 起動
  9. アップデート

以下の公式ドキュメントを参考にする。 Hosting n8n on DigitalOcean - n8n

SSH の設定

Droplet 作成時に SSH する際に必要な公開鍵をアップロードしないといけないので先に作っておく。

ssh-keygen -t rsa -b 4096 -C "digitalocean-n8n"
chmod 644 ~/.ssh/digitalocean-n8n.pub
chmod 600 ~/.ssh/digitalocean-n8n

Droplet 作成

DigitalOcean にいわゆるインスタンスを作成。 作業なので説明は割愛。

  1. アカウント作成
  2. Project 作成
  3. Droplet 作成

サイズはとりあえず Basic でメモリ 1GB くらいにしておけば不自由ない。

Droplet Size
Droplet Size

SSH key は作成時にここで追加。

Add SSH Key
Add SSH Key

SSH テスト&残りの設定

SSH テスト

SSH し易いように config を設定しておく。 まずは ssh できるかどうかの確認を行う。 ip_address の箇所は Droplet の IP アドレスを入力する。

ssh root@ip_address -i ~/.ssh/digitalocean_n8n

次にconfigを設定し、短い記述で SSH できることを確認。

vim ~/.ssh/config
# 内容確認
cat ~/.ssh/config
Host my-n8n
HostName ip_address
User root
Port 22
IdentityFile ~/.ssh/digitalocean_n8n
# 接続確認
ssh ssh my-n8n

残りの設定

  1. SSH ユーザーの作成
  2. root でログインできないように変更
  3. ファイアーウォール設定

今回は username をagentとする

adduser agent
usermod -aG sudo agent
# rootの鍵情報をそのままコピー
rsync --archive --chown=agent:agent ~/.ssh /home/agent
chmod 600 /home/agent/.ssh/authorized_keys
chown -R agent:agent /home/agent/.ssh
# PermitRootLogin noのコメントを外す
vim /etc/ssh/sshd_config
service ssh restart
ufw app list
ufw allow OpenSSH
ufw enable # => y
ufw status

Docker インストール

Docker すでに入っているイメージを使えばいいかもしれないが、インストールする場合は以下の公式ドキュメントに沿ってインストールする。

How To Install and Use Docker on Ubuntu 22.04 - DigitalOcean

インストールが終わったら以下で確認。

sudo systemctl status docker

DNS の設定

n8n に好きなドメインでアクセスしたい場合は DNS の A レコードを追加する。n8n.example.comみたいなサブドメインを設定しておくとよい。 このドメインは後続の設定の際に使用する。

Droplet のポート開放

sudo ufw allow 80
sudo ufw allow 443

caddy をセットアップ

設定リポジトリセットアップ

n8n の設定用のプロジェクトとして n8n-docker-caddy というものがあるのでセットアップ。

git clone https://github.com/n8n-io/n8n-docker-caddy.git
cd n8n-docker-caddy
sudo docker volume create caddy_data
sudo docker volume create n8n_data

環境変数を設定

DOMAIN_NAME, SUBDOMAIN, SSL_EMAILあたりを設定。

cd n8n-docker-caddy
vim .env
cat .env
# Replace <directory-path> with the path where you created folders earlier
DATA_FOLDER=/home/agent/n8n-docker-caddy
# The top level domain to serve from, this should be the same as the subdomain you created above
# 好きなドメイン
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
# Optional timezone to set which gets used by Cron-Node by default
# If not set New York time will be used
GENERIC_TIMEZONE=Asia/Tokyo
# The email address to use for the SSL certificate creation

その他設定

vim caddy_config/Caddyfile
cat caddy_config/Caddyfile
n8n.example.com {
reverse_proxy n8n:5678 {
flush_interval -1
}
}

起動

sudo docker compose up -d

設定変更する場合は build し直す

sudo docker compose up -d --build

アップデート

n8n はどんどんイメージが新しくなってきて、セルフホスティングしていると自動でアップデートされないので、定期的に手動でアップデートする。 手順に従ってセットアップしておけば設定などは volume 内にあり影響ないはずだが、設定やインスタンスのバックアップは事前に取っておくこと。

Docker Installation - Updating

sudo docker pull docker.n8n.io/n8nio/n8n
sudo docker compose down
sudo docker compose pull
sudo docker compose up -d

おわりに

セルフホスティング版の場合いくつか使えなくなるものもあるが、大きな影響はない。 これにより月々の運用金額を可能な限り抑えて、バックエンドの実装を不要にしたりオペレーションを自動化したりできる。

© 2024 Takashi Toyofuku All rights reserved.