7c24186cc5
Sista externa beroendet borta — hela stacken kör i eget kluster: - Ny plattformstjänst (services/plattform): egen inloggning (registrering + inloggning, lösenord bcrypt-hashade med pgcrypto, HS256-JWT), append-only händelse-API för synken (endast insert, on conflict do nothing) och publik delningsendpoint för Live Share med samma filtrering som Supabase-funktionen. Fail closed utan hemligheter; inga update/delete-operationer exponeras. - Postgres som StatefulSet med PVC och init-schema; append-only garanterat i databasen med triggers på både händelser och ärenden — historik kan inte ändras oavsett ansluten roll. CloudNativePG rekommenderas för produktion i docs. - JWT-hemligheten delas mellan plattform och AI-orkester (orkestern läser JWT_SECRET med SUPABASE_JWT_SECRET som fallback) — flödet livetestat: plattformens token accepteras av orkestern, fel hemlighet och utgångna tokens avvisas. - Klienten får självhostat läge via VITE_PLATTFORM_URL: inloggnings- panel på startsidan, synk mot plattformens API (samma konfliktfria flätning), Live Share via /api/delad och AI via klustrets orkester. Utan variabeln är Supabase-läget oförändrat. - Ingress routar /api/ai → orkestern, /api + /halsa → plattformen, / → webben; kustomize inkluderar hela stacken; CI bygger alla tre bilderna; DRIFT.md omskriven för självhostad drift. Verifierat: 28 vitest-tester gröna (inkl. append-only-triggers och API-ytan), plattformstjänsten livetestad (hälsa, 401, fail closed), JWT-paritet mellan tjänsterna testad, alla manifest YAML-validerade, produktionsbygge ok, Playwright-röktest grönt. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
35 lines
1.1 KiB
YAML
35 lines
1.1 KiB
YAML
# Ingress med TLS (cert-manager). Längsta prefix vinner:
|
|
# /api/ai → AI-orkestern, övriga /api + /halsa → plattformen, / → webben.
|
|
apiVersion: networking.k8s.io/v1
|
|
kind: Ingress
|
|
metadata:
|
|
name: guidad-felsokning
|
|
namespace: guidad-felsokning
|
|
annotations:
|
|
cert-manager.io/cluster-issuer: letsencrypt # ersätt med er issuer
|
|
spec:
|
|
ingressClassName: nginx
|
|
tls:
|
|
- hosts: [app.exempel.se] # ersätt med er domän
|
|
secretName: guidad-felsokning-tls
|
|
rules:
|
|
- host: app.exempel.se # ersätt med er domän
|
|
http:
|
|
paths:
|
|
- path: /api/ai
|
|
pathType: Prefix
|
|
backend:
|
|
service: { name: ai-orkester, port: { number: 80 } }
|
|
- path: /api
|
|
pathType: Prefix
|
|
backend:
|
|
service: { name: plattform, port: { number: 80 } }
|
|
- path: /halsa
|
|
pathType: Prefix
|
|
backend:
|
|
service: { name: plattform, port: { number: 80 } }
|
|
- path: /
|
|
pathType: Prefix
|
|
backend:
|
|
service: { name: web, port: { number: 80 } }
|