n8n（IFTTT,Zappierの代替）をセルフホストして自動化を快適にする

## はじめに

こんにちは。
みなさんZappierやIFTTTを使ったノーコード自動化は好きですか？

僕は業務の効率化や自動化が好きなので、こういったツールは今まで興味を持っていましたが、料金的なところで二の足を踏んでいました。。。
最近のSaasサービスの値上げラッシュ。特に海外のツールはどんどん月額設定が高くなりますし、為替の影響で高くなります。
ですので、結局、自動化したいことはコードを書いたりエンジニアの知識をフル活用して自動化しちゃいます。笑

今回は、そんなエンジニアのみなさんに向けて、[n8n](https://n8n.io/)というローコード自動化ツールをご紹介しようと思います。

## n8nとは

> **技術者向けのワークフローの自動化**
> 
> # **API と戦うことなく、複雑な自動化を 10 倍速く構築**
> 
> スクリプトのスパゲッティを苦労して過ごした日々は終わりました。その他すべてに柔軟性と UI が必要な場合は、JavaScript を使用してください。
> 
> 引用：[https://n8n.io/](https://n8n.io/)
> 

ZappierやIFTTTをご存知の方なら、「ほぼ同じようなことができて、より技術者向けのツール」と思っていただけると良いと思います。
ご存知ない方にかなりざっくりと説明すると「サービスとサービスを簡単に繋げられるツール」です。他にも、スクレイピングとかもできちゃうので結構自由度高くいろいろなことができます。

< 例えばこういうことができます >
- Asanaでタスクを作ったらGitHubのissueを作成する
- GitHubのissueが作られたらSlackに通知する
- [JSON を Google スプレッドシートに自動的にインポートする](https://blog.n8n.io/google-sheets-import-json/)
- [ウェブサイトからデータをスクレイピングする](https://blog.n8n.io/how-to-scrape-data-from-a-website/)
- [ローコードで多言語ボットを構築する](https://blog.n8n.io/lowcode-multilingual-telegram-bot/)

[チュートリアル](https://blog.n8n.io/tag/tutorial/)を見てもらえると他にもいろいろできます！

## なぜn8nを使うのか

n8nは自分でサーバーを用意してホスティングすることで、月額900円くらいで使えます。
（GCPの無料枠を使えばほぼ無料でホスティングできます）
「複数のユーザーで同じワークフローを扱いたい」というのがなければ、n8nの自動化に関する機能はほぼ全て使えます。
管理コストや安定性はSaasのサービスに劣りますが、基本サーバー放置なのでそこまでキツくないと思います。（あと、セルフホストってなんか楽しい）

他の自動化ツールの説明やメリデメについては、[こちらの記事](https://blog.n8n.io/ifttt-alternatives/)を見ていただけると、詳しく分かります。
![https://i.gyazo.com/dcc463290d4d0d88505d60d19ac5dfe1.png](https://i.gyazo.com/dcc463290d4d0d88505d60d19ac5dfe1.png)

引用：[https://blog.n8n.io/ifttt-alternatives/](https://blog.n8n.io/ifttt-alternatives/)

### 各サービスの料金体系です

**IFTTT**

[https://ifttt.com/plans](https://ifttt.com/plans)

![https://i.gyazo.com/3a09b2048fc0b8015c53892d6a8996e4.png](https://i.gyazo.com/3a09b2048fc0b8015c53892d6a8996e4.png)

**Zappier**

[https://zapier.com/pricing](https://zapier.com/pricing)

![https://i.gyazo.com/cf016790fe7da698b592878c6599c1e7.png](https://i.gyazo.com/cf016790fe7da698b592878c6599c1e7.png)

**n8n(Cloud)**

[https://n8n.io/pricing/](https://n8n.io/pricing/)

![https://i.gyazo.com/0effc4862eeb1fb1cba9a708e550ac5d.png](https://i.gyazo.com/0effc4862eeb1fb1cba9a708e550ac5d.png)

**n8n(Self hosted)**

[https://n8n.io/pricing/](https://n8n.io/pricing/)

![https://i.gyazo.com/7421444cfb61edca8085a35b2106ab37.png](https://i.gyazo.com/7421444cfb61edca8085a35b2106ab37.png)

## n8nをセルフホストする方法

### ホスティングする環境について

さくらVPSでサーバーを借りてホスティングしていきます。
GCEやEC2などでもOKです。メモリは512MBあればおおむね足りると思います。
処理が多いワークフローを作る場合は、1GBくらい欲しいです。
※ 記事を書いた後に気づきましたが、Google Cloud Platformの`e2-micro`の無料枠を使えばほぼ無料でホスティングできます。Dockerを使えばホスティング方法はあまり変わらないと思います。

もっと簡単にホスティングしたい時は、Herokuとかを使うと楽です。
セットアップの方法も[ここ](https://docs.n8n.io/hosting/installation/#installation-guides-for-n8n)に書いてます。

VPSなのでサーバーの知識が少し必要ですが、Dockerを使うので結構楽に設定できます。
SSL証明書の設定なども今回使うdockerのimageが対応してくれるのでほんと便利。
この記事書くまではDocker使っていなかったので、nginxの導入やSSL周りで結構ハマって、時間を溶かしました。笑

### インストールのステップ

1. サーバーを契約
2. 必要なファイルをGitHubに上げる
    ※ サーバーに直でファイル書くならこのステップはいらないです
3. サーバーに必要なパッケージ入れる
    1. Docker
    2. docker-compose
4. n8nの起動
5. サーバーのWebポート開ける
6. ドメインの設定

### サーバーを契約

1. OSは`Ubuntu`を選択
2. スタートアップスクリプト
    1. 変えたい設定あればこれ使うと便利です
3. サーバーのプランを選択してください
    1. 1GBのプランにします。512MBにしたい場合は別のOSで契約してください。
4. リージョン
    1. どこでもOKです
5. SSHキー設定
    1. 公開鍵を設定します
    2. Githubに公開鍵置いてたらGitHubから取得できます。
6. 作成
7. 起動

### サーバーのWebポート開ける

1. さくらのコントロールパネルからサーバーを開く
2. 「パケットフィルター設定」を開く
3. 「パケットフィルター設定を追加」を選択
4. フィルターの種類「Web」を選択する
5. 設定を保存する

### ドメインを設定します

ドメインはなんでも大丈夫です。さくら以外でドメインを取っているときは、さくらの「ネームサーバサービス」に登録が必要です。
僕はGoogle Domainsでドメインを持っているので、それを例に設定します。

**さくらDNSでの設定**
1. [ネームサーバーサービス](https://secure.sakura.ad.jp/domain/name-servers/new)を開きます
2. 設定予定のドメインを入力します
3. 「ゾーン >」を押します
   ![https://i.gyazo.com/7374c5f669013c108b99af9add1b00db.png](https://i.gyazo.com/7374c5f669013c108b99af9add1b00db.png)
4. 「簡単設定」のところにサーバーのIPを入力します
5. 作成できたら、ここの`NS`のデータをGoogle Domainsで使います
   ![](https://i.gyazo.com/e4c3395636164f019a533a09da6c06dc.png)

**Google Domains（ドメインを買ったサービス）**
1. 対象のドメインにNSのレコードを追加します
![https://i.gyazo.com/d83e70c2e6216f7edd1a984e7bef1f85.png](https://i.gyazo.com/d83e70c2e6216f7edd1a984e7bef1f85.png)
2. 保存してDNSに反映されるまで待ちます

[DNSの設定確認できるサイト](https://www.cman.jp/network/support/nslookup.html)で設定できたか確認しましょう。

### 必要なファイルをGitHubに上げる

以下の構成で作成します。この2ファイルあれば十分です。

```
repository root
|- docker-compoose.yml
|- .env
```

**docker-compoose.yml**

```docker-compose.yml
version: "3"

services:
  traefik:
    image: "traefik"
    restart: always
    command:
      - "--api=true"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.mytlschallenge.acme.tlschallenge=true"
      - "--certificatesresolvers.mytlschallenge.acme.email=${SSL_EMAIL}"
      - "--certificatesresolvers.mytlschallenge.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ${DATA_FOLDER}/letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro

  n8n:
    image: n8nio/n8n
    restart: always
    ports:
      - "127.0.0.1:5678:5678"
    labels:
      - traefik.enable=true
      - traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
      - traefik.http.routers.n8n.tls=true
      - traefik.http.routers.n8n.entrypoints=web,websecure
      - traefik.http.routers.n8n.tls.certresolver=mytlschallenge
      - traefik.http.middlewares.n8n.headers.SSLRedirect=true
      - traefik.http.middlewares.n8n.headers.STSSeconds=315360000
      - traefik.http.middlewares.n8n.headers.browserXSSFilter=true
      - traefik.http.middlewares.n8n.headers.contentTypeNosniff=true
      - traefik.http.middlewares.n8n.headers.forceSTSHeader=true
      - traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME}
      - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true
      - traefik.http.middlewares.n8n.headers.STSPreload=true
      - traefik.http.routers.n8n.middlewares=n8n@docker
    environment:
      - N8N_HOST=${SUBDOMAIN}.${DOMAIN_NAME}
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - NODE_ENV=production
      - WEBHOOK_URL=https://${SUBDOMAIN}.${DOMAIN_NAME}/
      - GENERIC_TIMEZONE=${GENERIC_TIMEZONE}
    volumes:
      - ${DATA_FOLDER}/.n8n:/home/node/.n8n
```

********.env********

`#`から始まるコメント部分はファイルに含めなくてOKです

```jsx
DATA_FOLDER=/root/n8n/
DOMAIN_NAME=example.com
SUBDOMAIN=n8n
SSL_EMAIL=user@example.com

# n8nの設定で追加したいものあれば
# ログの出力先をファイルに吐き出す
N8N_LOG_OUTPUT=file
# ワークフローの実行タイムアウト
EXECUTIONS_TIMEOUT=600
# ワークフローの実行履歴の保存期間
EXECUTIONS_DATA_MAX_AGE=240
# タイムゾーン
GENERIC_TIMEZONE=Asia/Tokyo
```

### サーバーに必要なパッケージ入れる

こっからはサーバーで作業していいます。

```sh
# sshでサーバーに接続します。ユーザー名とIPは作成したサーバーに合わせてください。
$ ssh ubuntu@xxx.xxx.xxx.xxx

# rootに切り替えます
$ su -

# =============================================================
# Dockerを入れる
# ref: https://docs.docker.com/engine/install/ubuntu/

# 古いバージョンのアンインストール
$ apt-get remove docker docker-engine docker.io containerd runc

# 必要なパッケージをインストール
$ apt-get update
$ apt-get install ca-certificates curl gnupg lsb-release

# Docker の公式 GPG キーを追加します
$ mkdir -m 0755 -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

# パッケージ インデックスを更新します
$ apt-get update

# 最新バージョンをインストールする
$ apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

### n8nの起動

```sh
$ cd ~
$ git clone https://github.com/xxxxx/xxxxxxx.git
$ mkdir ~/n8n/
$ docker compose up -d
```

### 起動確認

`https://{設定したドメイン}/` にアクセスして、ログイン画面が出ればOK！！！！

## n8nの初期設定

最低限必要なのは、管理者アカウントの作成ですが、初回ログインしたユーザーがになるので特別やる作業はないです。
使いたいサービスが決まっていれば、「Credentials」の設定をしておくと良いです。

## まとめ

今回はn8nとセルフホストの方法を紹介しました。
セルフホストはサーバーの知識などCloud版よりはハードルが上がりますが、自動化ツールのワークフロー数の制限や、条件分岐の制限などがないので、自由度がかなり上がります。

ぜひ、n8nwを使ったローコード自動化を試してください！！！！！！