Supabase の ローカル構築について
npm でインストールした supabase で supabase db コマンドが使えない
ローカルに supabase コマンドを使えるようにするためのインストール方法として、npm からのインストール方法の記載を見かけるが、バージョンが 今現在(2021/12/04)で 0.5.0 がダウンロードされる。
$ npx supabase -v
0.5.0
0.5 のバージョンだと、 supabase db commit
などが使用できない。
結論
公式ドキュメントにリンクが貼られている Github の Readme の通り brew (mac OS のば)からインストールするといけた(mac OS の場合)
m1 Macの場合の brew install supabase/tap/supabase でエラーになる
m1 Macの場合、下記のエラーでおこれるので、
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
To rerun under ARM use:
arch -arm64 brew install ...
To install under x86_64, install Homebrew into /usr/local.
エラーの指示通り下記でおこなると、正常にインストールできる
$arch -arm64 brew install supabase/tap/supabase
DB初期セットアップ
初期ファイル作成
$supabase init
データベース起動初期化
$supabase start
リモートの posgres DBが設定できない
postgres のバージョンがローカルは 13 で、supabase.io は 14 なのが原因ぽい
$supabase db remote set 'postgresql://postgres:[MY_PASSWORD]@[MY_HOST]:5432/postgres'
Error: Remote database Postgres version 140001 is incompatible with dbVersion 130003.
ローカル Docker のイメージ
supabase/postgres:13.3.0
ここ見ると supabase/postgres 14.1.0 がありそう
$supabase -v #0.15.2
CLIのここに 的な記述はあるので、なんか設定でいけるかな?
DbImage = "supabase/postgres:0.14.0"
あった。 config.json 行けるっぽい
viper.SetConfigFile("supabase/config.json")
if err := viper.ReadInConfig(); err != nil {
fmt.Fprintln(os.Stderr, "Failed to read config:", err)
os.Exit(1)
}
ApiPort = fmt.Sprint(viper.GetUint("ports.api"))
if viper.IsSet("ports.inbucket") {
InbucketPort = fmt.Sprint(viper.GetUint("ports.inbucket"))
}
DbPort = fmt.Sprint(viper.GetUint("ports.db"))
StudioPort = fmt.Sprint(viper.GetUint("ports.studio"))
DbVersion = viper.GetString("dbVersion")
あ、14.1.0
ではなく、0.14.0
...?
同然ながら、エラー変わらず。
とりあえず、ローカルのバージョンあげるのは、 issue & PRにしておいた。
一旦本番の DBバージョン下げれるか、みてみる。
うーん、なんかぱっと見できなそう。。
マージされた :D
supabase をアップデート
$arch -arm64 brew upgrade supabase
supabase/config.json のバージョン変更
{
"dbVersion": "140001"
}
接続できんぞ...
$psql "postgresql://localhost:5432/postgres?user=postgres&password=postgres"
psql: error: ERROR: pgbouncer cannot connect to server
お。ちょっと寝かしてて, アップデートしたら治った。
$brew upgrade supabase
$supabase -v #0.15.8
ようやく進んだ :D
$supabase db remote set 'postgresql://postgres:[MY_PASSWORD]@[MY_HOST]:5432/postgres'
Finished supabase db remote set.
$ supabase start
Started local development setup.
API URL: http://localhost:54321
DB URL: postgresql://postgres:postgres@localhost:5432/postgres
Studio URL: http://localhost:54323
で、Studio という管理画面にアクセス (m)
テーブル追加
Stuido のデータベースページで、GUIでテーブル作れる。もちろん postico などでも可能。便利。
マイグレーション用の SQL 生成
差分のSQLを確認
supabase db changes
で先に生成される内容の確認だけができる。
ただ重い..
$ supabase db changes
⣯ Comparing Tables of schema 'storage'...
-- This script was generated by the Schema Diff utility in pgAdmin 4
-- For the circular dependencies, the order in which Schema Diff writes the objects is not very sophisticated
-- and may require manual changes to the script to ensure changes are applied in the correct order.
-- Please report an issue for any failure with the reproduction steps.
CREATE TABLE IF NOT EXISTS public."User"
(
id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
"createdAt" timestamp with time zone NOT NULL DEFAULT now(),
"updatedAt" timestamp without time zone NOT NULL DEFAULT now(),
uid uuid NOT NULL DEFAULT uuid_generate_v4(),
name character varying COLLATE pg_catalog."default",
CONSTRAINT "User_pkey" PRIMARY KEY (id),
CONSTRAINT "User_uid_key" UNIQUE (uid)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public."User"
OWNER to postgres;
ALTER TABLE IF EXISTS public."User"
ENABLE ROW LEVEL SECURITY;
GRANT ALL ON TABLE public."User" TO anon;
GRANT ALL ON TABLE public."User" TO authenticated;
GRANT ALL ON TABLE public."User" TO postgres;
GRANT ALL ON TABLE public."User" TO service_role;
COMMENT ON TABLE public."User"```
差分のSQL生成
$supabase db commit createUserTable
先ほど確認した SQLが ここに生成
/supabse/migraton/20211215131709_createUserTable.sql
また詰まったぞぃ..
$supabase db remote commit
Error: supabase_migrations.schema_migrations table is not in sync with the contents of supabase/migrations.
すでに supabase.io 何か触ったりしたからかな?
commit
push
remote commit
の順で push が先だった
$supabase db commit createUserTable
$supabase db push
$supabase db remote commit
ポリシーの追加
テーブルは Enable Row Level Security (RLS) をオンにすると、アクセスできなくなる。
let { data, error } = await supabase
.from('users')
.select('id')
ポリシーを追加して、データベースにどこ権限のユーザーがアクセスできるかを許可する。(Firebase Rulesみたいな感じ)
以下のパスで、管理画面から追加できる。
ローカルと本番を同時にいじって、migrate の差分ができてうまくいかなくなった。
ので、本番 DB をこのままローカルにコピーした。
pg_dump -C -h db.yourProjectId.supabase.co -U postgres postgres | psql -h localhost -U postgres postgres -p 54322
が、 migration は結局できなくなった
$supabase db remote commit
Error: supabase_migrations.schema_migrations table is not in sync with the contents of supabase/migrations.