背景
supabaseをセルフホストしようと思い、コンテナインスタンスを使っていい感じにできないかなと思いましたが少し難しそうだったので大人しくVMに載せてみました。一旦細かいことは気にせずとにかく起動して外部からアクセスする!を目指した記事となります。
環境
osはubuntu20.04、VMサイズはB2s_v2を選択しました。高いので終わったら消します😭(本当はもっと安いやつを使いたかったのですが最低スペックを選択したらHome brewのインストール中になんか固まってしまいました😭)
作成したVMにsshでアクセスして設定を進めます。ターミナルからでも問題ありませんが、環境変数の書き換え等行いますのでvscode等から接続すると便利です。
手順
- 基本的には、supabase公式のセルフホストのページに従っていただければ問題ありません
- またDockerのインストールが必要になるので、以下の記事等を参照しVMにインストールしてください
Dockerインストール参考
supabaseをcloneする
- 公式の手順に従い、supabaseのプロジェクトをcloneします
# 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で置換してください。
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デーモンへのアクセス権がないため権限エラーが起きると思います。以下のコマンドを実行してユーザーに権限を付与します。
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に設定を追加しアクセスを許可します。
※このあたりの設定、かなり雑に行っているので余り真似しない方が良いかもしれません^^;兎にも角にも環境を整えて外からアクセスするのが目標となります。
- 設定反映後、nmapなどで確認するとポートが開いているのがわかります
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 にアクセスると、、、、
認証画面が表示されました。
環境変数に設定した値を入力しログインします。
後書き
管理等大変なのでセルフホストは今後行わない見込みですが、勉強も兼ねてAzureVM上でsupabaseのセルフホストを行いました。ネットワークの勉強もちゃんとしないとなと思います(..)
supabase、従量課金ではないので個人開発には強い味方になるのではないかと思っていますので学習を続けていこうと思います!