λ‘컬 κ°λ°μ Supabase CLI λ‘ Postgres + Auth λ₯Ό λͺ¨λ λ‘컬μμ λ립λλ€. μ격 Supabase μμ‘΄ μμ.
brew install supabase/tap/supabase # CLI >= 2.0
brew install just # Justfile λ¬λ
# Docker Desktop μ€ν μ€μ΄μ΄μΌ ν¨just devμ΄ λͺ λ Ήμ:
just local-depsβ Supabase CLI μ€ν + meili/redis/searxng κΈ°λ- 3μ΄ λκΈ° ν
local-be & local-feλ³λ ¬ μ€ν (Ctrl+C λ‘ λ νλ‘μΈμ€ λμ μ’ λ£)
μΈνλΌ μ»¨ν
μ΄λλ λ°±κ·ΈλΌμ΄λμ λ¨μ. μ’
λ£: just dev-down.
첫 μ€ν μ μ€ν€λ§ λ―Έμ μ© μνλΌλ©΄:
just dev-reset # supabase db reset β supabase/migrations/*.sql μ μ© + scripts/seed.sql| Service | Host port | Notes |
|---|---|---|
| Supabase Postgres | 54322 | postgres:postgres@localhost:54322/postgres |
| Supabase API (Kong) | 54321 | GoTrue / PostgREST / Storage / Realtime κ²μ΄νΈμ¨μ΄ |
| Supabase Studio | 54323 | UI β μ μ μμ±, ν μ΄λΈ μ‘°ν |
| Inbucket (μ΄λ©μΌ) | 54324 | λ‘컬 μ΄λ©μΌ νμΈ |
| Analytics (Logflare) | 54327 | λ‘컬 λ‘κ·Έ |
| Redis | 6303 | Local container (internal 6379) |
| Meilisearch | 7700 | Local container |
| SearXNG | 4000 | Local container |
| api-server HTTP | 8000 | Native (bun run dev:local-be) |
| api-server gRPC | 50053 | Native β AI callback listener |
| ai-server HTTP | 10000 | Native |
| ai-server gRPC | 50052 | Native β receives jobs from api-server |
| web (Next.js) | 3000 | Native (bun run dev:local-fe) |
| Recipe | What it does |
|---|---|
just dev |
local-deps β 3s wait β local-be & local-fe (Ctrl+C kills both) |
just dev-down |
Supabase + μμ‘΄ 컨ν μ΄λ μ μ§ (λ³Όλ₯¨ μ μ§) |
just dev-reset |
supabase db reset β λ§μ΄κ·Έλ μ΄μ
μ¬μ μ© + scripts/seed.sql |
just local-deps |
Supabase μ€ν + μμ‘΄ 컨ν μ΄λ κΈ°λ + env μλ μ μ |
just local-env-sync |
env νμΌλ§ μ¬λκΈ°ν (Supabase ν€ λ³κ²½ μ) |
just local-be |
api-server + ai-server native, λ‘κ·Έλ .logs/local/{api,ai}.log |
just local-fe |
Next.js dev server |
just seed [URL] |
scripts/seed.sql μ μ© (κΈ°λ³Έ: λ‘컬 Postgres 54322) |
just local-deps κ° μμμ ν©λλ€:
.env.backend.dev/packages/api-server/.env.dev/packages/web/.env.localμ΄ μμΌλ©΄ κ°*.exampleμμ 볡μ¬supabase status -o envμ κ°μΌλ‘ Supabase κ΄λ ¨ ν€ (DATABASE_*,SUPABASE_*legacy,NEXT_PUBLIC_*)λ§ in-place μ λ°μ΄νΈ- OPENAI / R2 / Rakuten λ± κ°μΈ secret μ μ λ 건λλ¦¬μ§ μμ β allowlist κΈ°λ°
Supabase ν€κ° λ°λ κ²½μ° env λ§ μ¬λκΈ°ν:
just local-env-syncμ€ν¬λ¦½νΈ: scripts/local-env-sync.sh (idempotent)
# λ‘컬 Supabase Postgres
DATABASE_URL=postgresql://postgres:postgres@localhost:54322/postgres
# λ‘컬 GoTrue (Auth)
DATABASE_API_URL=http://127.0.0.1:54321
DATABASE_ANON_KEY=<supabase status μμ 볡μ¬>
DATABASE_SERVICE_ROLE_KEY=<supabase status μμ 볡μ¬>
DATABASE_JWT_SECRET=<supabase status μμ 볡μ¬>
# Web public (λΈλΌμ°μ λ
ΈμΆ)
NEXT_PUBLIC_DATABASE_API_URL=http://127.0.0.1:54321
NEXT_PUBLIC_DATABASE_ANON_KEY=<supabase status μμ λ³΅μ¬ (λμΌκ°)>Legacy SUPABASE_* μ΄λ¦λ fallback μΌλ‘ μ½ν (#268). λ§€νμ packages/web/lib/supabase/env.ts:ENV_ALIASES.
Browser βββΊ localhost:3000 βββΊ supabase-js (Auth)
β
βΌ
λ‘컬 GoTrue http://127.0.0.1:54321/auth/v1/*
β
JWT λ°κΈ (λ‘컬 JWT secret)
β
JWT μΏ ν€ / localStorage μ μ₯
β
Browser βββΊ localhost:3000/api/v1/* βββΊ localhost:8000 (api-server)
β
βββΊ JWT κ²μ¦ (DATABASE_JWT_SECRET, λ‘컬 GoTrue κ°)
β
βββΊ λ‘컬 Postgres μ‘°ν/μ°κΈ° (DATABASE_URL)
- λ‘κ·ΈμΈ/νμκ°μ /μ΄λ©μΌ νμΈ λͺ¨λ λ‘컬μμ λ«ν. μΈν°λ· λΆνμ.
- μ΄λ©μΌμ μ€μ λ‘ λ°μ‘λμ§ μκ³ Inbucket (http://localhost:54324) μμ νμΈ.
- ν μ€νΈ μ μ μμ±μ΄ κ°μ₯ λΉ λ₯Έ κ²½λ‘: Studio (http://localhost:54323) β Authentication β Add user.
- api-server κ° JWT μμ μΆμΆν
sub(UUID) λ₯Ό λ‘컬public.usersμμ 룩μ . λλ½ μ:- λΉ λ₯Έ ν΄κ²°: μλ‘ λ§λ Auth μ μ UUID λ₯Ό
scripts/seed.sqlμ μΆκ° νjust seed - μ₯κΈ°: api-server λ―Έλ€μ¨μ΄κ° 첫 JWT κ²μ¦ μ upsert (#267 follow-up)
- λΉ λ₯Έ ν΄κ²°: μλ‘ λ§λ Auth μ μ UUID λ₯Ό
just dev-resetμ΄ λͺ λ Ήμ:
supabase db resetμ€ν β Postgres μ΄κΈ°νsupabase/migrations/*.sqlμ μμλλ‘ μ¬μ μ©scripts/seed.sqlμ€ν (μΉ΄ν κ³ λ¦¬Β·λ‘컬 μ μ stub λ±)
λ³Όλ₯¨μ μ μ§λ¨. Auth μ μ λ 리μ λμ§ μμ (λ³λ κ΄λ¦¬).
μμ μ΄κΈ°ν (Auth ν¬ν¨, λ³Όλ₯¨ μ κ±°) κ° νμν κ²½μ°:
just dev-down
supabase stop --no-backup
docker volume ls | grep supabase_ | awk '{print $2}' | xargs docker volume rm
just local-deps
just dev-reset- Supabase λ§μ΄κ·Έλ μ΄μ
(SOT):
supabase db resetλλsupabase migration up - SeaORM λ§μ΄κ·Έλ μ΄μ (api-server λ΄λΆ, B.3 μ΄ν ν΅ν© μμ ):
cd packages/api-server
cargo run --bin migrationν μμ μμλ supabase/migrations/*.sql μ΄ κΈ°μ€. SeaORM λ§μ΄κ·Έλ μ΄μ
μ api-server startup μ μλ μ€νλμ§λ§ B.3 (ν΅ν© μμ
) μ κΉμ§λ partial coverage μ.
supabase startμ€ν¨ βdocker psλ‘ κΈ°μ‘΄supabase_*컨ν μ΄λ νμΈ,supabase stop --no-backupν μ¬μλ- ν¬νΈ μΆ©λ (54321/54322/54323) β
lsof -i :54321λ‘ νμΈ,.env.backend.devμ΄μ κ°(5432) μ°Έμ‘° μ¬λΆ μ κ² - pgvector λλ½ β
psql postgresql://postgres:postgres@localhost:54322/postgres -c "\dx"λ‘ νμΈ, μμΌλ©΄supabase/migrations/μCREATE EXTENSION vectorꡬ문 μ μ© μ¬λΆ μ κ² - JWT κ²μ¦ μ€ν¨ β
supabase statusμ JWT secret κ³Ό.env.backend.devμDATABASE_JWT_SECRETμΌμΉ μ¬λΆ νμΈ