セルフ・ホスティング
Supabaseにはいくつかの利用方法があります。
- Supabaseクラウド:何も導入する必要はありません。私たちがインフラを管理し、スケールします。
- Docker:ご自身のインフラにデプロイします。
- Kubernetes:近日公開予定です。
アーキテクチャ
Supabaseは、オープンソースのツールを組み合わせたもので、それらはエンタープライズで耐えられるよう、特別に選んでいます。
すでに必要なツールとコミュニティーが存在し、MITやApache 2または同等のオープンライセンスであれば、そのツールを使用し、サポートします。 もし、必要としているツールが存在しないのであれば、自分たちでオープンソースとして開発します。
- PostgreSQLは、30年以上にわたって活発な開発が行われているオブジェクト・リレーショナル・データベースシステムです。信頼性、機能の堅牢性、パフォーマンスの面で高い評価を得ています。
- RealtimeはElixirのサーバーで、PostgreSQLの挿入、更新、削除をWebsocketを使ってリッスンできます。Realtimeは、Postgresに組み込まれたレプリケーション機能を使ってデータベースの変更をポーリングします。そして、変更内容をJSONに変換し、そのJSONをWebsocket経由で許可されたクライアントにブロードキャストします。
- PostgRESTは、PostgreSQLデータベースにRESTful APIで直接接続できるようにするためのWebサーバーです。
- Storageは、S3に保存されたファイルを管理するためにRESTfulなインターフェイスを提供し、Postgresを使用してパーミッションを管理します。
- postgres-metaは、Postgresを管理するためのRESTful APIで、テーブルの取得、ロールの追加、およびクエリの実行などが可能です。
- GoTrueはSWTベースのAPIで、ユーザーの管理やSWTトークンの発行ができます。
- Kongは、クラウド・ネイティブなAPIゲートウェイです。
構成
各システムには数多くの設定オプションがあり、関連するプロダクトのドキュメントに記載されています。
データベースの管理
ミドルウェアをダウンタイムなしでアップグレードできるように、データベースをミドルウェアから切り離すことをお勧めします。 「ミドルウェア」とは、Postgres以外のすべてのものを指し、あらゆるPostgresプロバイダー(AWS RDSなど)や独自のPostgresクラスターで動作するはずです。
データベースの拡張機能
Supabaseは、APIと認証システムを動作させるために、いくつかのPostgres拡張機能をデフォルトで有効にする必要があります。拡張は、スキーマ初期化スクリプトの中にあります。
すべての拡張をextensions
スキーマにインストールすることをお勧めします。これにより、public
スキーマのすべてのテーブルがAPIで公開されるため、APIをクリーンに保つことができます。
create schema if not exists extensions;
create extension if not exists "uuid-ossp" with schema extensions;
create extension if not exists pgcrypto with schema extensions;
create extension if not exists pgjwt with schema extensions;
uuid-ossp
UUID関数のためのもので、PostgreSQLの13.0以降で必要です。
pgcrypto
およびpgjwt
JWTおよびAuth関数を扱うためのものです。
データベースのロール
Supabaseは、Postgresデータベースにいくつかのデフォルトのロールを作成します。スキーマ初期化スクリプト内にあるコマンドを実行することで、いつでもデフォルトに戻せます。
postgres
PostgreSQLのデフォルトのロールです。管理者権限を持ちます。
anon
「匿名アクセス」のためのロールです。これは、ユーザーがログインしていないときに、API(PostgREST)が使用するロールです。
authenticator
API(PostgREST)用の特別なロールです。非常に限定されたアクセス権を持ち、JWTを検証し、JWTの検証によって決定された別のロールへ「変身」するために使用されます。
authenticated
「認証されたアクセス」のためのロールです。これは、ユーザーがログインしたときにAPI(PostgREST)が使用するロールです。
service_role
昇格アクセス用。このロールは、API(PostgREST)が行単位セキュリティーをバイパスするために使用されます。
supabase_auth_admin
Authミドルウェアがデータベースに接続し、マイグレーションを実行する際に使用します。アクセス権はauth
スキーマに限定されます。
supabase_storage_admin
Authミドルウェアがデータベースに接続し、マイグレーションを実行する際に使用します。アクセス権はstorage
スキーマに限定されます。
dashboard_user
Supabase UIでコマンドを実行するために使用します。
supabase_admin
Supabaseの管理者で、データベースのメンテナンスを行います。
APIキー
APIゲートウェイ(Kong)は、データベースへのアクセスを認証するためにJWTを使用します。JWTは、関連するPostgresのロールに対応していなければなりません。Supabaseは、認証されていないアクセス用のANON_KEY
と、昇格したアクセス用のSERVICE_KEY
の2つのロールで動作するように設計されています。
鍵の生成には次のツールを使用してください。
シークレットの管理
Supabaseの多くのコンポーネントは、安全なシークレットとパスワードを使用しています。これらはセルフ・ホスティングのenvファイルに記載されていますが、プロダクションにデプロイする際にはシークレット・マネージャーを使用することを強くお勧めします。dotenvのようなプレーンテキストのファイルでは、誤ってリークが発生し、高くつくことになります。
推奨されるシステムとしては、以下のようなものがあります。
- Doppler
- AzureのKey Vault
- AWSのSecrets Manager
- GCPのSecrets Manager
- HashicorpのVault
移行とアップグレード
データベースとミドルウェアを切り離しているのであれば、破壊的な変更がない限り、いつでも最新のミドルウェアを再デプロイできるはずです。 Supabaseは急速に進化しており、私たちのコアなサービスの一部として、移行のための戦略を改善していきます。
データベースの移行が難しいことは認識しています。そして、開発者にとって簡単にできるようにするのは、私たちが計画している問題の1つでもあります。
デプロイメントの選択肢
Supabaseは公式にDockerをサポートしていますが、他にもコミュニティーによって管理されているデプロイメントの戦略がいくつかあります。
- supabase-docker(公式)
- supabase-kubernetes(非公式)
- supabase-terraform(非公式)
- supabase-traefik(非公式)