All checks were successful
L'app Android n'arrivait a se logger/inscrire nulle part (204 + "erreur inattendue" cote client) : CORS_ORIGIN n'etait jamais defini en prod (docker-compose.yml ne le passe pas a `app`), donc il retombait sur son default `http://localhost:5173` (le serveur Vite de dev), qui ne matche evidemment jamais l'origine reelle de l'appli packagee (`https://localhost`, cf. capacitor.config.ts). Le site web n'est lui jamais touche : il est servi depuis la meme origine que l'API en prod, donc jamais de preflight CORS du tout sur /auth/*. Le symptome trompeur vient du package `cors` : un preflight OPTIONS recoit toujours 204, meme pour une origine rejetee — la difference invisible sans inspecter les headers est l'absence de Access-Control-Allow-Origin, qui fait ensuite bloquer le vrai POST cote client sans jamais atteindre le serveur. Vu depuis les logs serveur, la route a bien l'air "appelee" (le preflight matche le meme chemin) alors que /auth/login lui-meme n'est jamais reellement recu. CORS_ORIGIN devient une liste separee par des virgules (le type `ExpressServerCoreOptions.corsOrigin` acceptait deja `string | string[]`) et son default inclut desormais `https://localhost` — l'origine de l'appli packagee est fixe et non secrete (contrairement au domaine du site en prod, qui n'a de toute facon pas besoin d'etre dans cette liste puisqu'il est same-origin), donc la coder en dur dans le default couvre tout deploiement sans configuration supplementaire. Verifie en local : script ad hoc qui demarre le vrai `createServer()` et envoie un preflight OPTIONS /auth/login avec differentes origines — `https://localhost` et `http://localhost:5173` recoivent maintenant Access-Control-Allow-Origin, une origine arbitraire non listee continue de ne pas le recevoir (pas de bypass en wildcard). Egalement `pnpm --filter api exec tsc --noEmit` et `pnpm exec biome check` sur les fichiers touches. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
37 lines
1.9 KiB
Text
37 lines
1.9 KiB
Text
NODE_ENV=development
|
|
PORT=3000
|
|
# Match whatever you set in the root .env (POSTGRES_USER/PASSWORD/DB) —
|
|
# do not commit the real value.
|
|
DATABASE_URL="postgresql://changeme:changeme@localhost:5432/batchcooking?schema=public"
|
|
|
|
# Required, no default on purpose — generate your own, e.g.:
|
|
# node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"
|
|
JWT_SECRET=changeme-generate-a-real-random-secret-at-least-32-chars
|
|
|
|
# Optional — defaults shown (see src/config/env.ts)
|
|
# JWT_EXPIRES_IN=7d
|
|
# AUTH_COOKIE_NAME=session
|
|
# CORS_ORIGIN=http://localhost:5173,https://localhost
|
|
# INTENT_SERVICE_BASE_URL=http://localhost:8000
|
|
|
|
# Required — services/tech-step-intent-service must be running locally (see
|
|
# that service's own README) for any recipe save/preview to detect
|
|
# techniques at all. Must match that service's own INTENT_SERVICE_SECRET.
|
|
# Generate your own the same way as JWT_SECRET above.
|
|
INTENT_SERVICE_SECRET=changeme-generate-a-real-random-secret-at-least-32-chars
|
|
|
|
# Only needed if you're running services/tech-step-llm-worker locally —
|
|
# every /internal/tech-steps/* request is rejected outright while unset.
|
|
# Generate your own the same way as JWT_SECRET above; must match the
|
|
# worker's own INTERNAL_WORKER_SECRET.
|
|
# INTERNAL_WORKER_SECRET=changeme-generate-a-real-random-secret-at-least-32-chars
|
|
|
|
# Only needed to use the admin surface (apps/web's /admin/* routes) — every
|
|
# /admin/* request 401s while unset (`requireAdmin` fails closed). MUST be a
|
|
# different value than JWT_SECRET. Generate your own the same way.
|
|
# ADMIN_JWT_SECRET=changeme-a-different-random-secret-at-least-32-chars
|
|
# Read only by `src/scripts/create-admin.ts` when its --email/--password/
|
|
# --name flags are omitted — never by the running server.
|
|
# ADMIN_INITIAL_EMAIL=ops@example.com
|
|
# ADMIN_INITIAL_PASSWORD=changeme-at-least-8-chars
|
|
# ADMIN_INITIAL_NAME=Ops
|