03f1ef20f6
Målarkitekturen ur Master Prompt som kod: - Webben containeriserad (flerstegs-Dockerfile → oprivilegierad nginx med SPA-fallback, hashade assets cachas hårt, säkerhetsheaders). - AI-orkestern som egen tjänst (services/ai-orkester): samma routing och AI-regler som edge-funktionen men körbar som pod — egen HS256-JWT-verifiering (fail closed), /halsa, storleksgränser, read-only container som kör som node-användaren. Livetestad: hälsokontroll ok, 401 utan/med ogiltig token, 400-validering bakom giltig JWT. - Kubernetes-manifest (infra/k8s, kustomize): namespace, Deployments med readiness/liveness och åtstramad securityContext, Services, HPA 2–10 pods på 70 % CPU, PodDisruptionBudgets, Ingress med TLS via cert-manager, secret-mall (riktiga värden skapas utanför git). - Klienten väljer AI-väg vid bygget: VITE_AI_ORKESTER_URL → tjänsten i klustret, annars Supabase-edge-funktionen. Samma orkester i båda, låst av paritetstest. - CI-arbetsflöde: tester + produktionsbygge + verifierande containerbyggen av båda bilderna på varje push/PR. - docs/DRIFT.md: arkitekturdiagram, driftsättningssteg, skalning, och vad som återstår mot full självhostning. Verifierat: 27 vitest-tester gröna, produktionsbygge ok, alla K8s-manifest YAML-validerade, orkestertjänsten livetestad, Playwright-röktest grönt. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
23 lines
782 B
Docker
23 lines
782 B
Docker
# Guidad Felsökning — webbklienten som statisk SPA bakom nginx (oprivilegierad).
|
|
# Vite-variabler bakas in vid byggtillfället — skicka som build args.
|
|
|
|
FROM node:22-alpine AS bygg
|
|
WORKDIR /app
|
|
COPY package.json package-lock.json ./
|
|
RUN npm ci --no-audit --no-fund
|
|
COPY . .
|
|
ARG VITE_SUPABASE_URL
|
|
ARG VITE_SUPABASE_PUBLISHABLE_KEY
|
|
ARG VITE_SUPABASE_PROJECT_ID
|
|
ARG VITE_AI_ORKESTER_URL
|
|
ENV VITE_SUPABASE_URL=$VITE_SUPABASE_URL \
|
|
VITE_SUPABASE_PUBLISHABLE_KEY=$VITE_SUPABASE_PUBLISHABLE_KEY \
|
|
VITE_SUPABASE_PROJECT_ID=$VITE_SUPABASE_PROJECT_ID \
|
|
VITE_AI_ORKESTER_URL=$VITE_AI_ORKESTER_URL
|
|
RUN npm run build
|
|
|
|
FROM nginxinc/nginx-unprivileged:1.27-alpine
|
|
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
|
|
COPY --from=bygg /app/dist /usr/share/nginx/html
|
|
EXPOSE 8080
|