Deploy
Fyra saker. Sedan Vercel.
Sidan läser bara om en variabel finns — aldrig värdet. Fyll i .env lokalt och samma nycklar under Vercel → Settings → Environment Variables.
Kan starta
Ja
DB + auth + URL
Kan ta kort
Nej
Stripe checkout
Inte SQLite
Ja
Postgres-URL
Steg 1
Skapa Postgres
Välj en. Klistra in två URL:er.
- Neon (enklast till Vercel): nytt projekt → Connection details. Pooled (`-pooler`) →
DATABASE_URL. Unpooled →DIRECT_URL. Båda med?sslmode=require. - Supabase: Project Settings → Database. Transaction pooler port
6543→DATABASE_URLplus?pgbouncer=true&sslmode=require. Direct port5432→DIRECT_URL. Kör sedanprisma/supabase-lockdown.sqli SQL Editor (stänger Data API). - Lokalt:
docker compose up -doch URL:erna i.env.example.
npx prisma migrate deploy npm run db:seed
- Neon (enklast till Vercel): nytt projekt → Connection details. Pooled (`-pooler`) →
Steg 2
Auth och publik URL
openssl rand -base64 32 # klistra in som AUTH_SECRET NEXT_PUBLIC_APP_URL=http://localhost:3000
Nuvarande origin läses från miljön. När custom domain pekar: sätt samma nyckel till
https://getclara.com(utan slash) och redeploy.Steg 3
Stripe-nycklar
- stripe.com → Dashboard. Börja i Test mode.
- Developers → API keys →
STRIPE_SECRET_KEY(sk_test_). - Products: tre recurring monthly priser i EUR — Start 99, Growth 249, Scale 499. Kopiera varje
price_…. - Developers → Webhooks → Add endpoint:
https://DIN_DOMÄN/api/stripe/webhook - Events:
checkout.session.completed,customer.subscription.updated,customer.subscription.deleted. Signing secret →STRIPE_WEBHOOK_SECRET(whsec_).
Checkout slås på när secret + webhook + minst
STRIPE_PRICE_GROWTHfinns.QLARA_DEV_BILLING=1låser upp Growth endast lokalt — produktion ignorerar den.Steg 4
Publicera på Vercel
# i projektroten npx vercel # eller: vercel.com → Add New → Import Git-repo # Samma nycklar som .env under Environment Variables # (Production + Preview) npx vercel --prod
Build kör
prisma migrate deployautomatiskt. Seed kör du en gång mot production om du vill ha Nordlykt-demon:DIRECT_URL=… npm run db:seed.
Checklist — den här miljön
Gäller processen som kör sidan (lokal .env eller Vercel runtime).
- satt
DATABASE_URLrequiredPostgres, pooled (appen / Vercel)
Neon: connection string med -pooler. Supabase: Transaction pooler, port 6543, lägg till ?pgbouncer=true&sslmode=require.
- satt
DIRECT_URLrequiredPostgres, direct (migrationer + seed)
Neon: Unpooled / utan -pooler. Supabase: Direct, port 5432. Lokalt Docker: samma värde som DATABASE_URL.
- satt
AUTH_SECRETrequiredSession-hemlighet
Minst 24 tecken. Kör: openssl rand -base64 32
- satt
NEXT_PUBLIC_APP_URLrequiredPublik app-URL
Lokalt http://localhost:3000. I prod den kanoniska https-domänen, utan slash: https://getclara.com.
- saknas
STRIPE_SECRET_KEYoptionalStripe secret key
Stripe Dashboard → Developers → API keys. Test: sk_test_… Live: sk_live_…
- saknas
STRIPE_WEBHOOK_SECREToptionalStripe webhook secret
Endpoint: {NEXT_PUBLIC_APP_URL}/api/stripe/webhook. Events: checkout.session.completed, customer.subscription.updated, customer.subscription.deleted. Börjar med whsec_.
- saknas
STRIPE_PRICE_STARToptionalStripe Price — Start €99/mån
Product Start, recurring monthly EUR 99. Price-id börjar med price_.
- saknas
STRIPE_PRICE_GROWTHoptionalStripe Price — Growth €249/mån
Product Growth, recurring monthly EUR 249. Krävs för att Checkout ska slås på.
- saknas
STRIPE_PRICE_SCALEoptionalStripe Price — Scale €499/mån
Product Scale, recurring monthly EUR 499.
- satt
OPENAI_API_KEYoptionalOpenAI (valfritt)
Utan nyckel fungerar citerad lexical retrieval. Med nyckel: embeddings + strikt källstyrd text.
- saknas
QLARA_DEV_BILLINGoptionalDev-billing
Sätt 1 endast i lokal .env. Ignoreras i NODE_ENV=production även om variabeln finns på Vercel.
Fullständig lista finns också i .env.example. OpenAI behövs inte för att ta betalt.