# Paket 03 · Webbklienten Detta paket innehåller `app/` (källkod, utan `node_modules` och `dist`) och `supabase/` (värdapplikationens migrationsunderlag). Här byggs och publiceras webbilden — en statisk SPA bakom oprivilegierad nginx. Kräver att paket 01 är klart. Oberoende av paket 02 — får köras parallellt, men med SAMMA bildtagg. ## Delarna — packa upp allihop innan något byggs Paket 03 levereras i flera zip-filer: `03-webb-kalla` (källkoden) och `03-webb-resurser-1…N` (bildresurserna i `app/src/assets`, delade i storleksbegränsade delar för överföringens skull). Delningen är teknisk, inte logisk — de är ETT steg: 1. Packa upp samtliga `03-webb-*`-filer i samma arbetsträd som övriga paket. Vilka delar som finns framgår av `SHA256SUMS.txt` i paket 00. 2. Kontrollera fullständigheten mot delarnas fillistor: ```sh cat paket/03-webb-*/INNEHALL.txt | grep '^app/src/assets/' | sort | while read -r f; do [ -f "$f" ] || echo "SAKNAS: $f" done # ingen utskrift = komplett ``` Saknas en resursfil faller för övrigt bygget på importfel — men kontrollera FÖRE, så att felmeddelandet är "del saknas", inte en kryptisk byggutskrift. ## Steg 1 — testa före bygge ```sh cd app npm ci npx vitest run # hela sviten ska vara grön npm run typkontroll npm run lint # jämför mot baslinjen i rapporten från leverantören ``` ## Steg 2 — bygg bilden Vite-variablerna bakas in vid byggtillfället och skickas som byggargument — en färdig bild är alltså knuten till sin miljö. Plattforms- och orkesteradresserna är miljöns publika adresser (ur paket 01:s `karta`); Supabase-värdena är värdapplikationens och hämtas ur organisationens Supabase-projekt. ```sh cd app REG= TAGG= # samma tagg som paket 02 docker build \ --build-arg VITE_PLATTFORM_URL="https://" \ --build-arg VITE_AI_ORKESTER_URL="https://" \ --build-arg VITE_SUPABASE_URL="" \ --build-arg VITE_SUPABASE_PUBLISHABLE_KEY="" \ --build-arg VITE_SUPABASE_PROJECT_ID="" \ -t "$REG/felsokning-web:$TAGG" . ``` Den publicerbara Supabase-nyckeln är publik per definition — men den är det ENDA nyckelvärde som får förekomma i ett byggargument. Allt hemligt bor i Secrets Manager och når bara backendtjänsterna. ## Steg 3 — publicera ```sh aws ecr get-login-password | docker login --username AWS --password-stdin "$REG" docker push "$REG/felsokning-web:$TAGG" ``` ## Verifiering ```sh aws ecr describe-images --repository-name felsokning-web \ --query 'imageDetails[].imageTags' | grep "$TAGG" # Bilden serverar och svarar: docker run --rm -d -p 8080:8080 --name webbprov "$REG/felsokning-web:$TAGG" curl -fsS http://127.0.0.1:8080/ | grep -q "