One Server

ドキュメント

キュー・Vault・GraphQL・接続制限

pgmqと同じキュー、データベース内の暗号化されたシークレット(Vault)、/graphql/v1、直接接続のアドレス制限とTLS。

キュー、Vault、GraphQL、接続制限

いずれも専用データベース(p_<ref>)にあるプロジェクトで使います。新しいプロジェクトは最初から専用データベースです。

キュー(pgmq)

pgmqと同じSQL関数です。最初のcreate_queueがpgmqスキーマをインストールします。

select pgmq.create('jobs');
select * from pgmq.send('jobs', '{"to": "[email protected]"}');
select * from pgmq.read('jobs', 30, 10);
select pgmq.archive('jobs', 1);
select pgmq.delete('jobs', 2);
select * from pgmq.pop('jobs');
select * from pgmq.metrics('jobs');

ツール: list_queues、create_queue、send_queue_message、peek_queue(取り出さずに見る)、purge_queue、 delete_queue、set_queues_api。キューのテーブルpgmq.q_<名前>はサービスロールのもので、アクセスルールが有効です。 set_queues_api { exposed: true }にすると、データAPIから呼べます。

await supabase.schema('pgmq_public').rpc('send', { queue_name: 'jobs', message: { hello: 'world' } })
await supabase.schema('pgmq_public').rpc('read', { queue_name: 'jobs', sleep_seconds: 30, n: 5 })

公開キーやログインユーザーが使うには、SQLで権限とルールを与えます。

grant insert, select, update on pgmq.q_jobs to authenticated;
create policy "own jobs" on pgmq.q_jobs for all to authenticated using (true) with check (true);

Vault

シークレットを暗号化し、プロジェクトのデータベースのvault.secretsに保存します。鍵はプラットフォームが持ち、データベースには 保存されないため、ダンプ、バックアップ、ブランチには暗号文だけが残ります。シークレットキー(サービスロール)で読むときだけ復号されます。

select vault.create_secret('sk_live_...', 'stripe_key', 'Stripe');
select decrypted_secret from vault.decrypted_secrets where name = 'stripe_key';
select vault.update_secret('<id>', 'sk_live_new');

ツール: list_vault_secrets(名前のみ)、create_vault_secret、update_vault_secret、delete_vault_secret。 公開キーとログインユーザーはvaultスキーマを見られず、直接接続(<ref>_db)ではdecrypted_secretはnullです。

専用データベースへの移行

Vaultと大きなデータベースには専用データベースが必要です(Proプランから)。get_database_moveで今どこにあるかと移行の状態を確認し、 move_to_dedicated_databaseでコンソールの「今すぐ移行」と同じように移行を依頼します(オーナーと管理者)。 順番が来ると移行し、移行中は書き込みが止まり、読み取りは続きます。REST: GETとPOST /projects/<ref>/database/move、 CLI: oneend db move、oneend db move now。

専用ディスク

データベースが大きくなった有料プロジェクトは、ほかのプロジェクトと共有するディスクから、このプロジェクトだけのディスクと Postgres に移ります (Supabase がプロジェクトごとにインスタンスとボリュームを持つのと同じです)。20GB を超えると自動で移し(支出上限がオフの組織または Enterprise)、Enterprise はサイズに関係なく依頼できます。ディスクは max(1.2 × データベース, 20GB) から始まり、75% を超えると 1.5 倍に 増え(4時間に1回まで)、作成したサイズに対して1GBあたり月 ₩1,200(75セント)で請求します。移している間は書き込みが失敗し、読み取りは できます(expected_downtime_seconds)。接続文字列とパスワードは変わりません。移した後は特定時点ではなく毎日のバックアップから復元します。

get_dedicated_disk でディスクのサイズ、使用量、月額、30日間の履歴、縮小の提案を確認し、request_dedicated_disk で移行を、 shrink_dedicated_disk で縮小を依頼します(オーナーと管理者)。自動で縮小することはありません。7日間 25% 未満の使用が続くと縮小を 提案し、確認するとより小さいディスクを作って移し、元のディスクを削除します。プロジェクトを削除すると、30日後にディスクも削除され費用は0になります。 REST: GETとPOST /projects/<ref>/database/dedicated-disk、POST /projects/<ref>/database/dedicated-disk/shrink、 CLI: oneend db disk、oneend db disk request、oneend db disk shrink。

専用サーバー

Pro から、プロジェクトだけが使うサーバーを借りられます(アプリとデータベースが共有し、データベースはメモリの 25%)。サイズと場所ごとの 月額は list_server_sizes が示し、ここには書きません。get_server がサーバー・待機サーバー・作業を表示し、request_server(tier, region) が借り、resize_server(tier, when=now|tonight)がサイズを変え(待機サーバーがなければ 3〜5 分応答なし)、set_standby(standby, auto_failover)が待機サーバーと自動切り替え(60 秒応答なし)を、move_server(region)が場所の移動を(無料、月に 1 回、古いサーバーは 7 日保管)、 release_server(confirm=ref)が返却を、set_restore_days(7|28)が復元できる期間を設定します。支払いが失敗すると 7 日間読み取り専用になり、 その後最後のバックアップを取ってサーバーを削除します。 REST: GET・POST・PATCH・DELETE /projects/<ref>/server、PUT /projects/<ref>/server/standby、POST /projects/<ref>/server/move、 PUT /projects/<ref>/server/restore-days。CLI: oneend server、oneend server request|resize|standby|move|release|restore-days。

GraphQL

enable_extension { ref, name: "pg_graphql" }で有効にすると/graphql/v1が開きます。キーとアクセスルールは/rest/v1と同じです。

POST https://<ref>.<zone>/graphql/v1
apikey: <publishable key>
{"query": "{ todosCollection { edges { node { id title } } } }"}

直接接続の接続制限とTLS

get_network_restrictions、update_network_restrictions { ref, allowed_cidrs: ["203.0.113.0/24"], enforce_ssl: true }。 既定ではすべてのアドレスを許可し、TLSが必須です。リクエストを送ったアドレスが一覧にないと、confirm: trueなしでは保存されません。 コンソール、API、run_sqlは接続プーラーを通らないため、制限を誤ってかけてもそこから元に戻せます。

読み取り専用レプリカ

まだありません。本番の待機サーバー(ステージ3)は障害対策用で、お客様の接続は受け付けません。

HTTPではGET /queues、POST /queues、POST /queues/<名前>/messages、GET /queues/<名前>/messages、 POST /queues/<名前>/purge、DELETE /queues/<名前>、PUT /queues/api、GET /vault、POST /vault、 PATCH /vault/<名前>、DELETE /vault/<名前>、GET /network-restrictions、PUT /network-restrictionsです。