Docker を使わずに n8n を Amazon Lightsail にセルフホストする

## はじめに
オープンソースのワークフロー自動化ツールである n8n を Amazon Lightsail にセルフホストする機会がありましたのでご紹介します。

## Dockerは使わずに
公式ドキュメントでは Docker を使用してセルフホストする方法が紹介されていますが、今回は Docker を使わずに行いました。

## セットアップ
### Amazon Lightsail のインスタンス作成
Amazon Lightsail のコンソールで、LightSailの新規インスタンスを以下のスペックで作成します。
- Node.js
- 4GB以上のMemory

メモリは4GB以上でないとメモリ不足で正常に動作しない可能性があります。

### Lightsailセットアップ
作成したインスタンスのコンソール画面から、SSHでログインします。

#### ProxyPassの設定
以下のファイルに下記のとおり追記します。

```/opt/bitnami/apache2/conf/httpd.conf
# 末尾に以下を追加
ProxyPass / http://localhost:5678/
ProxyPassReverse / http://localhost:5678/
```
apacheを再起動します

```
sudo /opt/bitnami/ctlscript.sh restart apache
```

#### n8n インストール
以下のディレクトリに移動します
```
cd /opt/bitnami/apache2/htdocs/
```
n8nをインストールします
```
sudo npm install n8n -g
```

#### pm2 インストール
```
sudo npm install pm2 -g
```

#### pm2 で n8n を永続化します
```
$ pm2 start n8n --name "n8n"
$ pm2 save
$ pm2 startup
```

#### IPアドレスを固定化する
Lightsailのインスタンスは起動のたびにIPアドレスが変わってしまうため、固定化します。
- LightSail管理画面のNetworkingを開く
- Attach Static IP をクリック
- 適当な名前（Staticip-1とかのデフォルト名でもOK）で作成する
- IPアドレスが固定される

ここまで完了すると、表示されたIPアドレスをブラウザに入力するとn8nのホーム画面が表示されると思います。

## 追加の設定
### ドメイン設定とSSL化
今回はAWSの Route53 を使用します。
以下を参考にしてください。

https://zenn.dev/nakamura196/articles/5772d6c918508a#%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E4%BB%98%E4%B8%8E

###  WEBソケットの設定
n8nはWEBソケットを使ってブラウザとサーバで双方向通信をします。
この設定をしなくてもn8nは動作しますが、ブラウザ上の見た目や表示を正常にしたい場合は以下の設定を行います。

### bitnami-ssl.conf を編集する
`<VirtualHost _default_:443>` の内容を以下のように書き換えます。
```/opt/bitnami/apache2/conf/bitnami/bitnami-ssl.conf
 <VirtualHost _default_:443>
     DocumentRoot "/opt/bitnami/apache/htdocs"
     SSLEngine on
     SSLCertificateFile "/opt/bitnami/apache/conf/n8n-selfhost-8gb.nakamura.trial-sandbox.com.crt"
     SSLCertificateKeyFile "/opt/bitnami/apache/conf/n8n-selfhost-8gb.nakamura.trial-sandbox.com.key"
 
     # BEGIN: Configuration for letsencrypt
     Include "/opt/bitnami/apps/letsencrypt/conf/httpd-prefix.conf"
     # END: Configuration for letsencrypt
 
     # BEGIN: Support domain renewal when using mod_proxy without Location
     <IfModule mod_proxy.c>
     ProxyPass /.well-known !
     </IfModule>
     # END: Support domain renewal when using mod_proxy without Location
 
     <Directory "/opt/bitnami/apache/htdocs">
         Options Indexes FollowSymLinks
         AllowOverride All
         Require all granted
     </Directory>
 
     # Error Documents
     ErrorDocument 503 /503.html
 
     # BEGIN: Support domain renewal when using mod_proxy within Location
     <Location /.well-known>
         <IfModule mod_proxy.c>
         ProxyPass !
         </IfModule>
     </Location>
     # END: Support domain renewal when using mod_proxy within Location
 
     # WebSocket Setting
     RewriteEngine On
     RewriteCond %{HTTP:Upgrade} =websocket [NC]
     RewriteRule /(.*) ws://localhost:5678/$1 [P,L]
 
     # HTTP Request Setting
     ProxyPass / http://localhost:5678/
     ProxyPassReverse / http://localhost:5678/
 
     ErrorLog /opt/bitnami/apache2/logs/error_log
     CustomLog /opt/bitnami/apache2/logs/access_log combined
 </VirtualHost>
```
保存して、Apacheを再起動します。
```
sudo /opt/bitnami/ctlscript.sh restart apache
```

## まとめ
以上、Docker を使わずに n8n を Amazon Lightsail にセルフホストする方法をまとめました。
参考になりましたら幸いです。