Open19

Supabase の ローカル構築について

Ryosuke MiyamotoRyosuke Miyamoto

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 の場合)
https://supabase.com/docs/guides/local-development
https://github.com/supabase/cli

Ryosuke MiyamotoRyosuke Miyamoto

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
Ryosuke MiyamotoRyosuke Miyamoto

リモートの 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 がありそう

https://hub.docker.com/r/supabase/postgres

Ryosuke MiyamotoRyosuke Miyamoto

CLIのここに 的な記述はあるので、なんか設定でいけるかな?

DbImage = "supabase/postgres:0.14.0"

https://github.com/supabase/cli/blob/b4042d1cb3c7381f151998344b7880f1a8fa14dd/internal/utils/utils.go#L128-L160

あった。 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")
Ryosuke MiyamotoRyosuke Miyamoto

接続できんぞ...

$psql "postgresql://localhost:5432/postgres?user=postgres&password=postgres"
psql: error: ERROR:  pgbouncer cannot connect to server
Ryosuke MiyamotoRyosuke Miyamoto

ようやく進んだ :D

$supabase db remote set 'postgresql://postgres:[MY_PASSWORD]@[MY_HOST]:5432/postgres'
Finished supabase db remote set.
Ryosuke MiyamotoRyosuke Miyamoto
$ 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)

http://localhost:54323

Ryosuke MiyamotoRyosuke Miyamoto

マイグレーション用の 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

Ryosuke MiyamotoRyosuke Miyamoto

また詰まったぞぃ..

$supabase db remote commit
Error: supabase_migrations.schema_migrations table is not in sync with the contents of supabase/migrations.

すでに supabase.io 何か触ったりしたからかな?

Ryosuke MiyamotoRyosuke Miyamoto

commit push remote commit の順で push が先だった

$supabase db commit createUserTable
$supabase db push
$supabase db remote commit
Ryosuke MiyamotoRyosuke Miyamoto

ポリシーの追加

テーブルは Enable Row Level Security (RLS) をオンにすると、アクセスできなくなる。

let { data, error } = await supabase
  .from('users')
  .select('id')

ポリシーを追加して、データベースにどこ権限のユーザーがアクセスできるかを許可する。(Firebase Rulesみたいな感じ)

以下のパスで、管理画面から追加できる。
http://localhost:54323/project/default/auth/policies

Ryosuke MiyamotoRyosuke Miyamoto

ローカルと本番を同時にいじって、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.