Skip to content

Latest commit

Β 

History

History
164 lines (125 loc) Β· 6.65 KB

File metadata and controls

164 lines (125 loc) Β· 6.65 KB

Local Dev (#282 β€” Supabase Self-Hosted)

둜컬 κ°œλ°œμ€ Supabase CLI 둜 Postgres + Auth λ₯Ό λͺ¨λ‘ λ‘œμ»¬μ—μ„œ λŒλ¦½λ‹ˆλ‹€. 원격 Supabase 의쑴 μ—†μŒ.

Prereqs

brew install supabase/tap/supabase  # CLI >= 2.0
brew install just                   # Justfile λŸ¬λ„ˆ
# Docker Desktop μ‹€ν–‰ 쀑이어야 함

One-command start

just dev

이 λͺ…령은:

  1. just local-deps β€” Supabase CLI μŠ€νƒ + meili/redis/searxng 기동
  2. 3초 λŒ€κΈ° ν›„
  3. local-be & local-fe 병렬 μ‹€ν–‰ (Ctrl+C 둜 두 ν”„λ‘œμ„ΈμŠ€ λ™μ‹œ μ’…λ£Œ)

인프라 μ»¨ν…Œμ΄λ„ˆλŠ” λ°±κ·ΈλΌμš΄λ“œμ— λ‚¨μŒ. μ’…λ£Œ: just dev-down.

첫 μ‹€ν–‰ μ‹œ μŠ€ν‚€λ§ˆ 미적용 μƒνƒœλΌλ©΄:

just dev-reset   # supabase db reset β†’ supabase/migrations/*.sql 적용 + scripts/seed.sql

Port matrix

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)

Justfile recipes

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)

Env setup (μžλ™ν™”)

just local-deps κ°€ μ•Œμ•„μ„œ ν•©λ‹ˆλ‹€:

  1. .env.backend.dev / packages/api-server/.env.dev / packages/web/.env.local 이 μ—†μœΌλ©΄ 각 *.example μ—μ„œ 볡사
  2. supabase status -o env 의 κ°’μœΌλ‘œ Supabase κ΄€λ ¨ ν‚€ (DATABASE_*, SUPABASE_* legacy, NEXT_PUBLIC_*)만 in-place μ—…λ°μ΄νŠΈ
  3. OPENAI / R2 / Rakuten λ“± 개인 secret 은 μ ˆλŒ€ κ±΄λ“œλ¦¬μ§€ μ•ŠμŒ β€” allowlist 기반

Supabase ν‚€κ°€ 바뀐 경우 env 만 μž¬λ™κΈ°ν™”:

just local-env-sync

슀크립트: scripts/local-env-sync.sh (idempotent)

Primary env names

# 둜컬 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.

Auth flow (self-hosted)

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)

Data reset

just dev-reset

이 λͺ…령은:

  1. supabase db reset μ‹€ν–‰ β†’ Postgres μ΄ˆκΈ°ν™”
  2. supabase/migrations/*.sql 을 μˆœμ„œλŒ€λ‘œ 재적용
  3. 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

Running migrations manually

  • 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 μž„.

Troubleshooting

  • 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 일치 μ—¬λΆ€ 확인