From eb7adda612b5a99b46850270233c333ecfde3686 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Mon, 20 Apr 2026 17:14:04 +0200 Subject: [PATCH] docs: enhance NEXT_STEPS.md with AI logging and audit requirements; update TEKNISK_BESKRIVNING.md with Caddy configuration details --- NEXT_STEPS.md | 10 ++++++ TEKNISK_BESKRIVNING.md | 69 ++++++++++++++++++++++++++++-------------- 2 files changed, 57 insertions(+), 22 deletions(-) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index db2f20a5..4397d68b 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -180,6 +180,16 @@ AI-infrastrukturen är nu på plats (`AiService`, `mistral-small-2603`, premium- --- +## AI-loggning och audit + +- detta behöver ske innan nästa Ai-integration (receptförslag, veckoplanering) implementeras, för att säkerställa att vi har en robust lösning på plats för att spåra och analysera AI-anrop och resultat +- Utforska och utveckla lösning för loggning och audit av AI-input och output +- Syfte: möjliggöra spårbarhet, felsökning och kvalitetssäkring av AI-funktioner +- Implementera loggning på ett sätt som inte lagrar personuppgifter eller känslig data i klartext +- Utvärdera om loggar ska lagras i separat databas eller fil, och hur de kan användas för analys och förbättring + +--- + ## Enhetsstöd och konvertering - Se över om vi behöver utöka antalet stödda enhetstyper (t.ex. fler volym- eller portionsenheter) diff --git a/TEKNISK_BESKRIVNING.md b/TEKNISK_BESKRIVNING.md index a5089288..72c8780a 100644 --- a/TEKNISK_BESKRIVNING.md +++ b/TEKNISK_BESKRIVNING.md @@ -120,18 +120,49 @@ docker exec recipe-db mariadb -uroot -p"LÖSENORD" recipe_app -e "SHOW TABLES;" Caddy sitter framför applikationen och distribuerar trafik. Ordningen på `handle`-blocken är kritisk — Caddy väljer det första matchande blocket. ```caddy +(auth) { + basicauth { + admin $2a$14$DahHUWD2cKyXJ96sH5VQwuQv1bqmIn0gsdoSaw4mofzfdNY2Y0VsO + } +} + +(common) { + encode gzip zstd + header { + Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" + X-Content-Type-Options "nosniff" + X-Frame-Options "DENY" + X-XSS-Protection "1; mode=block" + Referrer-Policy "strict-origin-when-cross-origin" + Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()" + Cross-Origin-Opener-Policy "same-origin" + Cross-Origin-Resource-Policy "same-origin" + Cross-Origin-Embedder-Policy "require-corp" + } +} + +# ============================================ +# Import Service (Document Converter) - Standalone UI +# ============================================ +import.gynther.se { + import common + reverse_proxy recipe-import-service:3000 +} + +# ============================================ +# RECIPE APP + IMPORT SERVICE +# ============================================ recept.gynther.se { import common # === IMPORT SERVICE (Document Converter) === - # Måste komma FÖRE backend-reglerna + # Dessa endpoints måste komma FÖRST innan backend reglerna! handle /api/recipes/import* { reverse_proxy recipe-import-service:3000 } - # === NEXT.JS PROXY-ROUTES (frontend-hanterade) === - # Dessa routes innehåller server-side logic (auth, aggregering, mm) - # och måste gå till frontend, INTE backend + # === RECIPE FRONTEND PROXY ENDPOINTS === + # Next.js API routes handle /api/inventory-history-proxy { reverse_proxy recipe-frontend:3000 } @@ -144,7 +175,8 @@ recept.gynther.se { reverse_proxy recipe-frontend:3000 } - # === BACKEND API-ENDPOINTS === + # === RECIPE BACKEND API ENDPOINTS === + # Backend körs på port 8080 (från docker-compose) handle /api/products* { reverse_proxy recipe-api:8080 } @@ -157,35 +189,28 @@ recept.gynther.se { reverse_proxy recipe-api:8080 } + # === HEALTH CHECKS === handle /health { reverse_proxy recipe-api:8080 } - # === CATCH-ALL: Övriga /api/* → frontend === - # Fångar upp alla Next.js API routes som inte explicit - # listats ovan, t.ex. /api/admin/*, /api/auth/*, /api/categories, mm. + # === CATCH ALL === + # Övriga /api/* går till frontend handle /api/* { reverse_proxy recipe-frontend:3000 } - # Alla övriga requests → frontend + # Frontend - catch all remaining routes (port 3000) reverse_proxy /* recipe-frontend:3000 } ``` -### Viktig regel: Caddy-routing och Next.js API routes - -> **Caddy-regeln `handle /api/products*` fångar upp ALLT som börjar med `/api/products`** — inklusive sökvägar som `/api/products-create` eller `/api/products-update`. Det innebär att Next.js API routes som ska hanteras av frontend-containern **INTE** får ha sökvägar som börjar med `products`, `inventory`, `recipes` eller andra prefix som Caddy skickar till backend. - -Next.js API routes som kräver server-side auth och ska gå via frontend måste ha prefix som hamnar i catch-all-blocket `handle /api/* → recipe-frontend:3000`. Exempel på säkra prefix: - -| Prefix | Caddy-regel | Destination | -|--------|-------------|-------------| -| `/api/admin/*` | catch-all | `recipe-frontend:3000` | -| `/api/categories` | catch-all | `recipe-frontend:3000` | -| `/api/auth/*` | catch-all | `recipe-frontend:3000` | -| `/api/products*` | explicit regel | `recipe-api:8080` ⚠️ | -| `/api/inventory*` | explicit regel | `recipe-api:8080` ⚠️ | +**Kommentarer:** +- Blocket `(common)` innehåller alla grundläggande säkerhetshuvuden och komprimering. +- Blocket `(auth)` används för basic auth på utvalda endpoints. +- Importera `(common)` i varje site-block för att återanvända headers och inställningar. +- Proxyreglerna styr trafik till rätt backend/frontend-tjänst beroende på path. +- Kommentarer i filen förklarar ordningen på reglerna och varför vissa hanteras först. ---