Driftsättningspaketen: agentanvisningar och paketering i sex zip-steg
Skriptet deploy/paketera.sh skär plattformen i numrerade paket i driftsättningsordning: plan med SHA256-summor, AWS-basen, backend- bilderna, webbilden, arbetslasten och slutkontrollen. Varje paket bär sin egen ANVISNING-AGENT.md med steg, verifiering och stoppvillkor, plus fillista och versionsstämpel under paketunik väg så att alla paket kan packas upp i samma arbetskatalog. Ordningen är motiverad i planen: basen före bilderna (registret måste finnas), bilderna före arbetslasten (apply drar dem), verifieringen sist. 02 och 03 är utpekat parallelliserbara med samma bildtagg. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
# Driftsättningspaketen
|
||||
|
||||
Paketeringen skär plattformen i numrerade zip-paket, ett per
|
||||
driftsättningssteg, avsedda att utföras av agenter i ordning. Varje
|
||||
paket bär sin egen `ANVISNING-AGENT.md` — den som packar upp ett paket
|
||||
ska inte behöva något annat än paketet och det föregående stegets
|
||||
utdata.
|
||||
|
||||
```sh
|
||||
bash felsokning/deploy/paketera.sh <målkatalog>
|
||||
```
|
||||
|
||||
| Paket | Innehåll | Steg |
|
||||
| --- | --- | --- |
|
||||
| `00-plan.zip` | Driftsättningsplanen + SHA256-summor för övriga paket | Läses först, verifierar leveransen |
|
||||
| `01-aws-bas.zip` | `infra/aws` + `infra/postgres-init.sql` | Terraform: VPC, EKS, Aurora, S3, ECR, KMS, hemligheter, domän, larm |
|
||||
| `02-tjanster.zip` | `services/` — plattform, ai-orkester, gemensam | Bygg och publicera backendbilderna till ECR, initiera schemat |
|
||||
| `03-webb.zip` | `app/` (utan `node_modules`/`dist`) + `supabase/` | Bygg och publicera webbilden |
|
||||
| `04-arbetslast.zip` | `infra/terraform` | Terraform: arbetslasten i klustret, ingress, DNS |
|
||||
| `05-verifiering.zip` | `docs/` | Slutkontroll av den driftsatta miljön, driftdokumentation |
|
||||
|
||||
Ordningen är driftsättningsordningen och den är inte förhandlingsbar:
|
||||
basen före bilderna (registret måste finnas), bilderna före arbetslasten
|
||||
(poddarna drar dem vid apply), verifieringen sist. Skälen står i
|
||||
respektive anvisning.
|
||||
|
||||
Vad som medvetet INTE packas: `node_modules` (återskapas ur
|
||||
`package-lock.json`), `app/dist` (byggs i webbilden med miljöns egna
|
||||
byggargument), `.git`, och värdapplikationens rotkataloger — ALVA:s
|
||||
plattform är `felsokning/`.
|
||||
|
||||
Anvisningstexterna ligger i `anvisningar/` och versionshanteras här;
|
||||
skriptet lägger in dem i paketen under `paket/<paketnamn>/` tillsammans
|
||||
med `INNEHALL.txt` (fillista) och `PAKET.txt` (version, git-SHA,
|
||||
byggtid) — vägen är paketunik så att alla paket kan packas upp i samma
|
||||
arbetskatalog. Summorna i `00-plan.zip` beräknas över de färdiga
|
||||
paketen — verifiera dem innan något packas upp.
|
||||
@@ -0,0 +1,54 @@
|
||||
# Driftsättningsplan · ALVA på AWS
|
||||
|
||||
Detta paket läses först. Det innehåller planen och SHA256-summorna för
|
||||
de fem arbetspaketen. Allt är egenhostat i ett eget AWS-konto — ingen
|
||||
extern byggtjänst, inget externt register.
|
||||
|
||||
## Leveransen
|
||||
|
||||
| Paket | Steg | Utförs av |
|
||||
| --- | --- | --- |
|
||||
| `01-aws-bas.zip` | AWS-basen: VPC, EKS, Aurora, S3, ECR, KMS, Secrets Manager, Route 53, larm | Agent med AWS-behörighet |
|
||||
| `02-tjanster.zip` | Backendbilderna (plattform, ai-orkester) byggs, testas och publiceras; databasschemat initieras | Agent med Docker + ECR-push |
|
||||
| `03-webb.zip` | Webbilden byggs med miljöns byggargument och publiceras | Agent med Docker + ECR-push |
|
||||
| `04-arbetslast.zip` | Arbetslasten i klustret: tjänster, ingress, DNS, nätverkspolicyer | Agent med kluster-behörighet |
|
||||
| `05-verifiering.zip` | Slutkontroll av den driftsatta miljön | Valfri agent, läsbehörighet räcker |
|
||||
|
||||
## Ordningen och varför
|
||||
|
||||
`01` före `02`/`03`: bilderna kan inte publiceras förrän registret
|
||||
finns. `02`/`03` före `04`: arbetslastens poddar drar bilderna vid
|
||||
apply — en apply mot tomma repon ger poddar i `ImagePullBackOff`.
|
||||
`05` sist, alltid: ett steg utan verifiering är inte utfört.
|
||||
`02` och `03` är oberoende av varandra och får köras parallellt av två
|
||||
agenter; alla andra steg är sekventiella.
|
||||
|
||||
## Innan något packas upp
|
||||
|
||||
```sh
|
||||
sha256sum -c SHA256SUMS.txt
|
||||
```
|
||||
|
||||
Stämmer inte en summa: stanna och rapportera. Packa upp paketen i EN
|
||||
gemensam arbetskatalog — vägarna är relativa `felsokning/` och lägger
|
||||
sig i ett träd (`infra/`, `services/`, `app/`, `docs/`). Varje pakets
|
||||
anvisning, fillista och versionsstämpel ligger under
|
||||
`paket/<paketnamn>/` och krockar därför aldrig med de andras.
|
||||
|
||||
## Verktyg som förutsätts
|
||||
|
||||
Terraform (version enligt `versions.tf`), AWS CLI v2 med behörighet i
|
||||
målkontot, Docker, Node 22, `kubectl`, `jq`, `psql`. Region enligt
|
||||
`variables.tf` (standard `eu-north-1`).
|
||||
|
||||
## Regler som gäller varje steg
|
||||
|
||||
1. **Fortsätt aldrig förbi en misslyckad verifiering.** Rapportera vad
|
||||
som fallerade och stanna — nästa paket förutsätter det förra.
|
||||
2. **Hemligheter går aldrig in i Terraform, git eller ett paket.**
|
||||
De sätts direkt i Secrets Manager; tillståndsfilen får aldrig se dem.
|
||||
3. **En bildtagg pekar på ett bygge, för alltid.** Registret har
|
||||
oföränderliga taggar; välj en ny tagg per bygge (git-SHA:t i
|
||||
`PAKET.txt` är rätt val) och använd SAMMA tagg i steg 02, 03 och 04.
|
||||
4. **Rapportera utfall ordagrant** — vad som kördes, vad som verifierades,
|
||||
vad som återstår. `terraform output karta` är kvittot i steg 01 och 04.
|
||||
@@ -0,0 +1,71 @@
|
||||
# Paket 01 · AWS-basen
|
||||
|
||||
Detta paket lägger grunden: nätverk i tre lager, EKS-klustret, Aurora
|
||||
PostgreSQL, S3 för bilagor, ECR, KMS-nycklar, Secrets Manager, Route 53
|
||||
och larm. Allt efterföljande läser den här basens utdata.
|
||||
|
||||
## Förutsättningar
|
||||
|
||||
AWS-behörighet i målkontot, Terraform enligt `infra/aws/versions.tf`.
|
||||
Läs `infra/aws/README.md` — den förklarar varje val; denna anvisning
|
||||
är utförandeordningen.
|
||||
|
||||
## Steg
|
||||
|
||||
```sh
|
||||
cd infra/aws
|
||||
terraform init
|
||||
terraform validate
|
||||
terraform plan -out plan.ut # granska: inga destruktiva ändringar väntas i en ny miljö
|
||||
terraform apply plan.ut
|
||||
terraform output karta # hela basen i klartext — bifoga i rapporten
|
||||
```
|
||||
|
||||
Variabler som ska sättas medvetet (via `-var` eller en tfvars-fil som
|
||||
INTE innehåller hemligheter): `doman`, `zon_id`, `larm_epost`, och
|
||||
`tillatna_api_cidr` snävat till de adresser som ska nå API-servern.
|
||||
Standardvärdet är öppet enbart för att en ny miljö ska gå att nå alls.
|
||||
|
||||
## Efter apply — fyra saker Terraform inte gör
|
||||
|
||||
1. **Claude-nyckeln** in i Secrets Manager (Terraform ska inte känna
|
||||
den):
|
||||
```sh
|
||||
aws secretsmanager put-secret-value \
|
||||
--secret-id felsokning-produktion/app \
|
||||
--secret-string "$(aws secretsmanager get-secret-value --secret-id felsokning-produktion/app \
|
||||
--query SecretString --output text | jq '.anthropic_api_key = "sk-ant-…"')"
|
||||
```
|
||||
2. **Databasschemat.** Aurora ligger i ett datalager utan routing ut;
|
||||
kör `infra/postgres-init.sql` inifrån klustret:
|
||||
```sh
|
||||
aws eks update-kubeconfig --name <klusternamn ur karta>
|
||||
kubectl run psql --rm -i --image=postgres:16 --restart=Never -- \
|
||||
psql "<databas_url ur terraform output databas_url>" < ../postgres-init.sql
|
||||
```
|
||||
Det är samma fil som integrationstestet kör — de kan inte glida isär.
|
||||
3. **Verifiera att `tillatna_api_cidr` är snävat** om det inte gjordes
|
||||
före apply.
|
||||
4. **Bekräfta larmprenumerationen** — SNS skickar ett
|
||||
bekräftelsemejl till `larm_epost`; utan klick går larmen ingenstans.
|
||||
|
||||
## Verifiering — allt ska vara sant innan steget rapporteras klart
|
||||
|
||||
```sh
|
||||
terraform output karta # kvar_att_gora ska vara tomt utom det som uttryckligen skjutits upp
|
||||
kubectl get nodes # samtliga Ready
|
||||
aws ecr describe-repositories \
|
||||
--query 'repositories[].repositoryName' # tre repon: web, plattform, ai-orkester
|
||||
kubectl run schema --rm -i --image=postgres:16 --restart=Never -- \
|
||||
psql "<databas_url>" -c "\dt" # tabellerna ur postgres-init.sql finns
|
||||
```
|
||||
|
||||
Rapportera `terraform output karta` ordagrant, registeradressen och
|
||||
klusternamnet — steg 02–04 behöver dem.
|
||||
|
||||
## Stoppvillkor
|
||||
|
||||
Faller `terraform apply`, kör inte om i blindo: läs felet, åtgärda
|
||||
orsaken, kör `plan` igen och granska. Ett kluster utan Ready-noder
|
||||
eller ett `kvar_att_gora` med oförklarade punkter betyder stopp, inte
|
||||
vidare till paket 02.
|
||||
@@ -0,0 +1,67 @@
|
||||
# Paket 02 · Backendtjänsterna
|
||||
|
||||
Detta paket innehåller `services/`: plattformstjänsten (auth,
|
||||
händelse-API, delning, fakturering), AI-orkestern och den delade koden
|
||||
i `gemensam/`. Här byggs och publiceras de två backendbilderna.
|
||||
|
||||
Kräver att paket 01 är klart och verifierat: registret och databasen
|
||||
finns, och du har registeradressen ur dess rapport. Paket 03 är
|
||||
oberoende av detta paket och får köras parallellt av en annan agent —
|
||||
men med SAMMA bildtagg.
|
||||
|
||||
## Steg 1 — testa före bygge
|
||||
|
||||
Grönt lokalt är villkoret för att bygga över huvud taget:
|
||||
|
||||
```sh
|
||||
cd services/plattform
|
||||
npm ci
|
||||
bash integrationstest.sh # hela ärendeflödet mot en lokal server
|
||||
bash aterstallningstest.sh # säkerhetskopian går att läsa tillbaka
|
||||
```
|
||||
|
||||
## Steg 2 — bygg bilderna
|
||||
|
||||
Byggkontexten är `services/` — Dockerfilerna hämtar den delade
|
||||
observationsmodulen därifrån. Taggen är git-SHA:t ur `PAKET.txt`;
|
||||
registret har oföränderliga taggar, så en tagg som redan finns kan
|
||||
inte återanvändas.
|
||||
|
||||
```sh
|
||||
cd services
|
||||
REG=<registeradress ur paket 01> # t.ex. …dkr.ecr.eu-north-1.amazonaws.com
|
||||
TAGG=<git-SHA ur PAKET.txt>
|
||||
|
||||
docker build -f plattform/Dockerfile -t "$REG/felsokning-plattform:$TAGG" .
|
||||
docker build -f ai-orkester/Dockerfile -t "$REG/felsokning-ai-orkester:$TAGG" .
|
||||
```
|
||||
|
||||
Exakta reponamn: `aws ecr describe-repositories` — avviker de från
|
||||
raderna ovan gäller registrets namn, inte anvisningens.
|
||||
|
||||
## Steg 3 — publicera
|
||||
|
||||
```sh
|
||||
aws ecr get-login-password | docker login --username AWS --password-stdin "$REG"
|
||||
docker push "$REG/felsokning-plattform:$TAGG"
|
||||
docker push "$REG/felsokning-ai-orkester:$TAGG"
|
||||
```
|
||||
|
||||
## Verifiering
|
||||
|
||||
```sh
|
||||
aws ecr describe-images --repository-name felsokning-plattform \
|
||||
--query 'imageDetails[].imageTags' | grep "$TAGG"
|
||||
aws ecr describe-images --repository-name felsokning-ai-orkester \
|
||||
--query 'imageDetails[].imageTags' | grep "$TAGG"
|
||||
docker run --rm "$REG/felsokning-plattform:$TAGG" node --version # bilden startar
|
||||
```
|
||||
|
||||
Rapportera taggen och båda bildernas digest — paket 04 sätter taggen i
|
||||
`bildtagg` och digesten är svaret på "vilken kod kör i produktion".
|
||||
|
||||
## Stoppvillkor
|
||||
|
||||
Rött integrationstest eller återställningstest: bygg ingenting.
|
||||
Misslyckad push mot befintlig tagg betyder att taggen redan är använd —
|
||||
välj en ny tagg (nytt SHA), skriv aldrig över.
|
||||
@@ -0,0 +1,71 @@
|
||||
# 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.
|
||||
|
||||
## 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=<registeradress ur paket 01>
|
||||
TAGG=<git-SHA ur PAKET.txt> # samma tagg som paket 02
|
||||
|
||||
docker build \
|
||||
--build-arg VITE_PLATTFORM_URL="https://<plattformens adress>" \
|
||||
--build-arg VITE_AI_ORKESTER_URL="https://<orkesterns adress>" \
|
||||
--build-arg VITE_SUPABASE_URL="<supabase-url>" \
|
||||
--build-arg VITE_SUPABASE_PUBLISHABLE_KEY="<publicerbar nyckel>" \
|
||||
--build-arg VITE_SUPABASE_PROJECT_ID="<projekt-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 "<div id=\"root\"" && echo "serverar"
|
||||
docker rm -f webbprov
|
||||
```
|
||||
|
||||
Rapportera taggen och bildens digest.
|
||||
|
||||
## Stoppvillkor
|
||||
|
||||
Röda tester, typfel eller lintfel utöver den kända baslinjen: bygg
|
||||
ingenting. Saknade byggargument ger en bild som kraschar vid start
|
||||
("supabaseUrl is required") — en sådan bild publiceras inte.
|
||||
@@ -0,0 +1,57 @@
|
||||
# Paket 04 · Arbetslasten
|
||||
|
||||
Detta paket innehåller `infra/terraform`: tjänsterna i klustret,
|
||||
ingress med ALB och ACM-certifikat, DNS, nätverkspolicyer, External
|
||||
Secrets och den självhostade git-tjänsten. Läs `karta.tf` först — den
|
||||
beskriver hela systemet som data, och resten av filerna läser därifrån.
|
||||
|
||||
Kräver att paket 01 är klart (basen ger utdata som `05-aws.tf` läser)
|
||||
och att paket 02 och 03 är klara (bilderna finns i registret — en
|
||||
apply mot tomma repon ger `ImagePullBackOff`).
|
||||
|
||||
## Steg
|
||||
|
||||
```sh
|
||||
cd infra/terraform
|
||||
cp terraform.tfvars.exempel terraform.tfvars
|
||||
# Fyll i: domän, register, bildtagg = taggen ur paket 02/03, repliker.
|
||||
# INGA hemligheter i filen — de bor i Secrets Manager och speglas av
|
||||
# External Secrets; Terraform ser aldrig ett värde.
|
||||
|
||||
terraform init
|
||||
terraform validate
|
||||
terraform plan -out plan.ut # granska innan apply
|
||||
terraform apply plan.ut
|
||||
terraform output karta # vad kör var, vem ser vilken hemlighet — bifoga i rapporten
|
||||
```
|
||||
|
||||
## Verifiering
|
||||
|
||||
```sh
|
||||
kubectl get pods -A # alla Running/Completed, inga omstartsloopar
|
||||
kubectl get pods -n <namnrymd> -o wide # web, plattform, ai-orkester uppe i angivet antal repliker
|
||||
kubectl get ingress -n <namnrymd> # ALB-adress tilldelad
|
||||
aws acm list-certificates \
|
||||
--query 'CertificateSummaryList[].{d:DomainName,s:Status}' # ISSUED för domänen
|
||||
|
||||
# Hälsokontrollerna genom hela kedjan (DNS → ALB → tjänst):
|
||||
curl -fsS https://<plattformens adress>/halsa
|
||||
curl -fsS https://<orkesterns adress>/halsa
|
||||
curl -fsS https://<webbadressen>/ | grep -q "<div id=\"root\""
|
||||
```
|
||||
|
||||
DNS-propagering kan ta några minuter efter apply — skilj på "inte än"
|
||||
(avvakta, försök igen) och "fel" (ändra ingenting, rapportera).
|
||||
|
||||
## Rollback
|
||||
|
||||
Kör om med föregående `bildtagg` i `terraform.tfvars` och `apply`
|
||||
igen. Taggarna är oföränderliga, så en tidigare tagg är exakt det
|
||||
bygge den alltid varit.
|
||||
|
||||
## Stoppvillkor
|
||||
|
||||
Poddar i `ImagePullBackOff`: fel tagg eller paket 02/03 inte klara —
|
||||
tillbaka dit, inte vidare. `CrashLoopBackOff` i plattformen: läs
|
||||
`kubectl logs`; saknade hemligheter betyder att paket 01 punkt 1 inte
|
||||
utfördes. Verifieringen ska vara grön i sin helhet innan paket 05.
|
||||
@@ -0,0 +1,59 @@
|
||||
# Paket 05 · Slutkontroll
|
||||
|
||||
Detta paket innehåller dokumentationen (`docs/`) och den samlade
|
||||
slutkontrollen. Grundhållningen är plattformens egen: ett steg utan
|
||||
verifiering är inte utfört, och en driftsättning som inte kan granskas
|
||||
i efterhand är inte klar.
|
||||
|
||||
Kräver att paket 01–04 rapporterats klara. Läsbehörighet räcker —
|
||||
detta steg ändrar ingenting.
|
||||
|
||||
## Kontrollerna
|
||||
|
||||
**1. Kartan stämmer med verkligheten.**
|
||||
```sh
|
||||
cd infra/terraform && terraform output karta
|
||||
kubectl get pods -n <namnrymd> -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
|
||||
```
|
||||
Varje pod kör exakt den bild och tagg som paket 02/03 rapporterade —
|
||||
jämför digest, inte bara tagg.
|
||||
|
||||
**2. Kedjan utifrån.**
|
||||
```sh
|
||||
curl -fsS https://<plattformens adress>/halsa
|
||||
curl -fsS https://<orkesterns adress>/halsa
|
||||
curl -fsS https://<webbadressen>/ | grep -q "<div id=\"root\""
|
||||
curl -fsSI https://<webbadressen>/ | grep -i strict-transport-security
|
||||
```
|
||||
|
||||
**3. Grinden spärrar på servern.** Skapa ett provärende via API:t och
|
||||
begär avslut utan uppfyllda krav — svaret ska vara hindren, inte ett
|
||||
förseglat ärende. (Flödet i detalj: `docs/OPERATIONS.md`.)
|
||||
|
||||
**4. Säkerhetskopiering och återställning.**
|
||||
```sh
|
||||
aws rds describe-db-clusters --query 'DBClusters[].{id:DBClusterIdentifier,pitr:EarliestRestorableTime}'
|
||||
```
|
||||
PITR-fönstret finns. Larmet för utebliven backupmätpunkt är aktivt i
|
||||
CloudWatch — det larmar på SAKNAD data, kontrollera att det inte redan
|
||||
larmar.
|
||||
|
||||
**5. Larmen är beväpnade.** Fyra larm i CloudWatch, ingen i `ALARM`,
|
||||
och SNS-prenumerationen på `larm_epost` är bekräftad, inte
|
||||
`PendingConfirmation`.
|
||||
|
||||
**6. Hemligheterna ligger rätt.** `terraform.tfvars` i paket 04
|
||||
innehåller inga nyckelvärden; `kubectl get secret -n <namnrymd>` visar
|
||||
speglade hemligheter från External Secrets, inte handlagda.
|
||||
|
||||
## Rapporten
|
||||
|
||||
Slutrapporten listar varje kontroll med utfall och belägg (kommandot
|
||||
och dess svar), bildtagg + digest per tjänst, och det som medvetet
|
||||
lämnats: obekräftade prenumerationer, öppna CIDR, uppskjutna punkter
|
||||
ur paket 01. En avvikelse gör inte rapporten misslyckad — en
|
||||
orapporterad avvikelse gör det.
|
||||
|
||||
Driftdokumentationen som gäller därefter: `docs/OPERATIONS.md`
|
||||
(drift), `docs/ALVA-SYSTEMBESKRIVNING.md` (systemet),
|
||||
`docs/GARANTISTANDARD-FGS.md` (garantiflödet).
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env bash
|
||||
# Paketerar plattformen i numrerade zip-paket för agentdriven
|
||||
# driftsättning på AWS. Se README.md i samma katalog.
|
||||
#
|
||||
# Paketen byggs i en arbetskatalog och flyttas färdiga till målet —
|
||||
# ett avbrutet skript lämnar aldrig ett halvt paket där någon kan
|
||||
# hitta det. Summorna i 00-plan beräknas över de färdiga paketen,
|
||||
# därför byggs 00 sist trots att det läses först.
|
||||
set -euo pipefail
|
||||
|
||||
ROT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # felsokning/
|
||||
UT="${1:?ange målkatalog för paketen}"
|
||||
mkdir -p "$UT"
|
||||
|
||||
VERSION="$(node -e 'import(process.argv[1]).then(m => console.log(m.PLATTFORMSVERSION))' \
|
||||
"$ROT/services/gemensam/version.mjs" 2>/dev/null || echo "okänd")"
|
||||
SHA="$(git -C "$ROT" rev-parse --short HEAD 2>/dev/null || echo "utan-git")"
|
||||
STAMPEL="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
||||
|
||||
# paketera <namn> <anvisningsfil> <väg>... — vägarna är relativa ROT.
|
||||
paketera() {
|
||||
local namn="$1" anvisning="$2"; shift 2
|
||||
local arbets; arbets="$(mktemp -d)"
|
||||
|
||||
# node_modules återskapas ur package-lock; dist byggs i webbilden.
|
||||
tar -C "$ROT" -cf - --exclude=node_modules --exclude=app/dist "$@" |
|
||||
tar -C "$arbets" -xf -
|
||||
|
||||
# Metafilerna ligger under paket/<namn>/ så att alla paket kan packas
|
||||
# upp i SAMMA arbetskatalog utan att skriva över varandras.
|
||||
mkdir -p "$arbets/paket/$namn"
|
||||
cp "$ROT/deploy/anvisningar/$anvisning" "$arbets/paket/$namn/ANVISNING-AGENT.md"
|
||||
printf '%s · %s · paketerad %s · paket %s\n' \
|
||||
"$VERSION" "$SHA" "$STAMPEL" "$namn" > "$arbets/paket/$namn/PAKET.txt"
|
||||
(cd "$arbets" && find . -type f | sort | sed 's|^\./||') > "$arbets/paket/$namn/INNEHALL.txt"
|
||||
|
||||
(cd "$arbets" && zip -qrX "$namn.zip" .)
|
||||
mv "$arbets/$namn.zip" "$UT/"
|
||||
rm -rf "$arbets"
|
||||
du -h "$UT/$namn.zip" | awk '{print " " $2 " " $1}'
|
||||
}
|
||||
|
||||
echo "paketerar $VERSION ($SHA) → $UT"
|
||||
rm -f "$UT"/0[0-5]-*.zip
|
||||
|
||||
paketera 01-aws-bas 01-aws-bas.md infra/aws infra/postgres-init.sql
|
||||
paketera 02-tjanster 02-tjanster.md services
|
||||
paketera 03-webb 03-webb.md app supabase
|
||||
paketera 04-arbetslast 04-arbetslast.md infra/terraform
|
||||
paketera 05-verifiering 05-verifiering.md docs
|
||||
|
||||
# 00-plan: planen + summorna över de fem färdiga paketen.
|
||||
arbets="$(mktemp -d)"
|
||||
cp "$ROT/deploy/anvisningar/00-plan.md" "$arbets/DRIFTSATTNING.md"
|
||||
printf '%s · %s · paketerad %s · paket 00-plan\n' \
|
||||
"$VERSION" "$SHA" "$STAMPEL" > "$arbets/PAKET.txt"
|
||||
(cd "$UT" && sha256sum 0[1-5]-*.zip) > "$arbets/SHA256SUMS.txt"
|
||||
(cd "$arbets" && zip -qrX 00-plan.zip .)
|
||||
mv "$arbets/00-plan.zip" "$UT/"
|
||||
rm -rf "$arbets"
|
||||
du -h "$UT/00-plan.zip" | awk '{print " " $2 " " $1}'
|
||||
|
||||
echo "klart — läs 00-plan.zip först"
|
||||
Reference in New Issue
Block a user