supabaseをAzureVM上でセルフホストしてみた

# 背景
supabaseをセルフホストしようと思い、コンテナインスタンスを使っていい感じにできないかなと思いましたが少し難しそうだったので大人しくVMに載せてみました。一旦細かいことは気にせずとにかく起動して外部からアクセスする！を目指した記事となります。

## 環境
osはubuntu20.04、VMサイズはB2s_v2を選択しました。高いので終わったら消します😭（本当はもっと安いやつを使いたかったのですが最低スペックを選択したらHome brewのインストール中になんか固まってしまいました😭）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/603e0f64-4d1a-b2a0-41f2-49a6da0e7d41.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/0a640508-9bba-6755-2bc8-08a48c04cb09.png)
作成したVMにsshでアクセスして設定を進めます。ターミナルからでも問題ありませんが、環境変数の書き換え等行いますのでvscode等から接続すると便利です。
# 手順
* 基本的には、supabase公式のセルフホストのページに従っていただければ問題ありません

https://supabase.com/docs/guides/self-hosting/docker

* またDockerのインストールが必要になるので、以下の記事等を参照しVMにインストールしてください

Dockerインストール参考

https://qiita.com/yoshiyasu1111/items/17d9d928ceebb1f1d26d#%E5%8F%A4%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%AE%E5%89%8A%E9%99%A4



## supabaseをcloneする

* 公式の手順に従い、supabaseのプロジェクトをcloneします
```bash
# Get the code
git clone --depth 1 https://github.com/supabase/supabase

# Go to the docker folder
cd supabase/docker

# Copy the fake env vars
cp .env.example .env
```
## 環境変数を書き換える
上記のコマンドを実行し終えるとサンプルの.envファイルが作成されますので、必要に応じてユーザーネームやパスワードなどの値を書き換えます。supabaseのサイト内でKeyの生成が行えますのでそちらをご利用ください。
これと合わせて、localhostが設定されている箇所を全て、VMのグローバルIPで置換してください。
```.env
POSTGRES_PASSWORD=
JWT_SECRET=
ANON_KEY=                   
SERVICE_ROLE_KEY=
USERNAME=
DASHBOARD_PASSWORD=
```
## コンテナを起動する
* 以下のコマンドを実行しsupabaseのコンテナを起動します
```
# Pull the latest images
docker compose pull

# Start the services (in detached mode)
docker compose up -d
```
恐らくですがこののままですとユーザーにDockerデーモンへのアクセス権がないため権限エラーが起きると思います。以下のコマンドを実行してユーザーに権限を付与します。

```bash
sudo usermod -aG docker $USER
```
こちらのコマンドを実行後再度Docker composeを行ってください。
※まだエラーが出る様でしたらターミナルの再起動等行ってください！
以上の手順でVM上にSupabase環境を構築することができました！⊂( `ᾥ´ )っ

## 外部からのアクセスを有効化する
* ここまででコンテナの起動は完了しましたが、こののままですと外部からアクセス不可ですので設定を行っていきます

## AzureVMのNSGを設定する
AzureVMのNSGを設定し、supabaseのコンテナが使用しているportに対する外部ネットワークからのアクセスを許可します。
まずは,docker psコマンドでコンテナがどのポートでリッスンしているか調べます。

```
CONTAINER ID   IMAGE                              COMMAND                   CREATED              STATUS                          PORTS                                                                NAMES
f5ad84d4dcfc   supabase/storage-api:v0.46.4       "docker-entrypoint.s…"    About a minute ago   Up About a minute (healthy)     5000/tcp                                                             supabase-storage
94e78616596c   kong:2.8.1                         "bash -c 'eval \"echo…"   About a minute ago   Up About a minute (healthy)     0.0.0.0:8000->8000/tcp, 8001/tcp, 0.0.0.0:8443->8443/tcp, 8444/tcp   supabase-kong
607da209ee2c   supabase/edge-runtime:v1.36.1      "edge-runtime start …"    About a minute ago   Up About a minute                                                                                    supabase-edge-functions
a6aa20691927   supabase/studio:20240205-b145c86   "docker-entrypoint.s…"    About a minute ago   Up About a minute (unhealthy)   3000/tcp                                                             supabase-studio
b4699a4670de   supabase/realtime:v2.25.50         "/usr/bin/tini -s -g…"    About a minute ago   Up About a minute (healthy)                                                                          realtime-dev.supabase-realtime
d403b4591beb   postgrest/postgrest:v12.0.1        "postgrest"               About a minute ago   Up About a minute               3000/tcp                                                             supabase-rest
ae5dd69e983c   supabase/gotrue:v2.132.3           "auth"                    About a minute ago   Up About a minute (healthy)                                                                          supabase-auth
b3f40de49347   supabase/postgres-meta:v0.77.2     "docker-entrypoint.s…"    About a minute ago   Up About a minute (healthy)     8080/tcp                                                             supabase-meta
45020aadec5b   supabase/logflare:1.4.0            "sh run.sh"               About a minute ago   Up About a minute (healthy)     0.0.0.0:4000->4000/tcp                                               supabase-analytics
86c11d0fa356   supabase/postgres:15.1.0.147       "docker-entrypoint.s…"    About a minute ago   Up About a minute (healthy)     0.0.0.0:5432->5432/tcp                                               supabase-db
be7542517677   darthsim/imgproxy:v3.8.0           "imgproxy"                About a minute ago   Up About a minute (healthy)     8080/tcp                                                             supabase-imgproxy
0cbfb5973da2   timberio/vector:0.28.1-alpine      "/usr/local/bin/vect…"    About a minute ago   Up About a minute (healthy)                                                                          supabase-vector
```

この中で、外からアクセスする必要があるポートは、
8000,3000,5432(いずれもtcpプロトコル),443(https)
となりますので、AzureVMのNSGに設定を追加しアクセスを許可します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/7734a7c8-c155-2eb0-8c59-84e3e8d86f48.png)
※このあたりの設定、かなり雑に行っているので余り真似しない方が良いかもしれません^^;兎にも角にも環境を整えて外からアクセスするのが目標となります。

* 設定反映後、nmapなどで確認するとポートが開いているのがわかります
```bash
user@vm:~$ nmap 000.000.000.000 #VMのグローバルIP
Starting Nmap 7.80 ( https://nmap.org ) at 2024-02-28 07:35 UTC
Nmap scan report for 000.000.000.000
Host is up (0.0020s latency).
Not shown: 996 filtered ports
PORT     STATE  SERVICE
80/tcp   closed http
443/tcp  closed https
5432/tcp open   postgresql
8000/tcp open   http-alt
```
3000番ポートは開ける必要が無かったかもしれません、、、、、

### 外部アクセスの準備が整いました！
http://{yourIpAdress}:8000　にアクセスると、、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/042d1f49-727b-9d7b-1631-cd7ae9f72a22.png)
認証画面が表示されました。
環境変数に設定した値を入力しログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910804/4e550c4a-f5c4-8a53-4281-568d583f20c8.png)
ログイン後こちらの画面が表示されれば成功です！

# 後書き
管理等大変なのでセルフホストは今後行わない見込みですが、勉強も兼ねてAzureVM上でsupabaseのセルフホストを行いました。ネットワークの勉強もちゃんとしないとなと思います(..)
supabase、従量課金ではないので個人開発には強い味方になるのではないかと思っていますので学習を続けていこうと思います！