Files
alva/felsokning/infra/terraform
Claude 5579006e79 Abonnemang: gratis start, månadsfaktura, och en låsning som aldrig rör historiken
Kontot startar på Free och stannar där tills någon väljer annat. En
provperiod som tyst börjar kosta är samma sorts fälla produkten finns för
att undvika. Fakturan skapas ändå vid registreringen — på noll kronor —
därför att den etablerar serien och visar kunden exakt vad den inte
betalar för.

Fyra nivåer: Free (hela metoden, två konton), Standard, Premium,
Enterprise. Enterprise har inget listpris i stället för ett påhittat.
Basavgift plus per aktiv användare, och nivån är en HÄNDELSE — vilken
nivå som gällde när en faktura utfärdades måste gå att svara på i
efterhand, och en kolumn som skrivits över kan inte svara.

Månadsjobbet är idempotent på perioden: kör det två gånger samma dygn och
den andra körningen fakturerar ingenting. Ett fakturajobb som
dubbelfakturerar vid en omstart är värre än ett som inte kör alls.
Perioden räknas från registreringsdagen, inte från den första i månaden —
den som registrerar sig den 20:e ska inte få en faktura på elva dagar som
sin första upplevelse av produkten.

PDF utan beroenden. Kravet var inga beroenden, och ett PDF-bibliotek drar
in fem till för att rita text i två spalter. PDF är ett textformat;
generatorn är tvåhundra rader som går att läsa. Renderad och verifierad i
Chromium. Kunden hämtar fakturan själv eller anger en adress — bägge
vägar leder till samma dokument, och e-post är ett tillägg, inte den enda
vägen till sitt eget underlag.

---- Låsningen och dess gräns ------------------------------------------

Vi litar på kunden: inget kort, ingen förskottsbetalning, ingen spärr
innan någon fått veta. Förfallen faktura ger synlig nedräkning i 14 dagar
och sedan stopp för nya ärenden.

Men läsning och export är sanna i ALLA tillstånd, och det är inte
generositet. Ärendeloggen är verkstadens underlag i en garanti- eller
försäkringstvist som gäller DERAS kund — en tredje part utan del i vår
obetalda faktura. Att göra det oåtkomligt vore att använda någon annans
rättsliga ställning som påtryckningsmedel. Prövat från flera håll,
eftersom det är en regel som är lätt att tumma på under press.

En nollfaktura kan aldrig låsa någon. Free fakturerar noll, och en
obetald nollfaktura är en bokföringspost, inte en skuld.

---- Tre fynd som testerna grävde fram ----------------------------------

1. En kuverterad nyckel gjorde HELA organisationens övriga ärenden
   oläsbara när huvudnyckeln saknades — nycklarFor laddar alla nycklar,
   och en enda som inte gick att öppna kastade. En delvis migrerad
   organisation blev alltså helt stum av ett fel som gällde ett ärende.
   Nu hoppas den över, med varning i loggen, och fälten maskeras — vilket
   dessutom är rätt utfall i sak: det är precis vad krypto-shredding
   lämnar efter sig.

2. Integrationstestet försökte backdatera abonnemangets registrering och
   stoppades av min egen trigger. Att testet fick böja sig för regeln och
   inte tvärtom är poängen med regeln.

3. Palettestet räknade upp färgerna som en andra lista — samma dubblering
   som M-7 handlade om. Det läser dem nu ur FARG, med ett tak på åtta
   värden som motvikt: en palett som växer förbi det är en färglåda.

491 enhetstester · 179 integrationskontroller · genomgången 4/4 ·
portalspärren 18/18.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
2026-08-06 15:55:13 +00:00
..

Infrastrukturen

Hela systemet i Terraform. Filerna är numrerade i den ordning de är begripliga att läsa:

Fil Vad
versions.tf Leverantörer och tillståndsbackend
variables.tf Allt som skiljer en installation från en annan
karta.tf Systemet som data — tjänster, portar, routing, hemligheter, dataflöden, gränser
10-namnrymd.tf Namnrymd, tjänstekonto med IRSA, hemligheter ur Secrets Manager
05-aws.tf Kopplingen till AWS-basen — allt den redan bestämt läses här
15-plattformstjanster.tf ALB-kontroller, External Secrets, metrics, CloudWatch
90-gitea.tf Självhostad git med egna byggrunners
30-plattform.tf Backend: auth, händelse-API, delning, integrationer
40-orkester.tf AI-orkestern
50-web.tf Klienten
60-ingress.tf ALB och DNS
70-natverk.tf Nätverkspolicyer — vem får prata med vem
outputs.tf Kartan utskriven

Börja i karta.tf. Den beskriver systemet en gång, som data; resten av filerna läser därifrån i stället för att upprepa portar och namn.

Kom igång

cp terraform.tfvars.exempel terraform.tfvars   # fyll i domän, register, nycklar
terraform init
terraform plan
terraform apply
terraform output karta                         # hela systemet i klartext

terraform output karta svarar på frågorna "vad kör var", "vem ser vilken hemlighet", "vad pratar med vad" och "vad ingår inte" — utan att någon behöver läsa .tf-filerna.

Kontroll utan kluster

terraform fmt -check -diff        # formatering
terraform init -backend=false     # hämtar leverantörer
terraform validate                # typer och referenser

terraform validate kräver att leverantörerna hämtats från registry.terraform.io.

Var saker ligger

Det här lagret bestämmer nästan ingenting själv. AWS-basen (felsokning/infra/aws) äger klustret, databasen, registret, hinken, rollerna, domänen och hemligheterna — och 05-aws.tf läser dess utdata. Ändras något där slår det igenom här utan att en rad ändras.

Vad Var
Händelseloggen Aurora PostgreSQL utanför klustret, med PITR
Bilagor S3, signerat med tjänstekontots roll — inga nycklar finns
Hemligheter Secrets Manager, speglade av External Secrets var timme
Bilder ECR med oföränderliga taggar
Trafik in ALB med ACM-certifikat
Git och bygge Gitea med egna runners i samma kluster

Terraform ser aldrig en hemlighets värde. Det är avsiktligt: en hemlighet som passerar Terraform hamnar i tillståndsfilen.

Driftsättning

Bilderna byggs av publicera.yml vid varje push till main och taggas med git-SHA:t. Driftsättningen är ett eget flöde, driftsatt.yml, som startas för hand med en tagg och kör mot GitHub-miljön produktion — den kan kräva godkännande. Rollback är att köra flödet igen med en tidigare tagg.

Kustomize- och Argo CD-vägen är borttagen. Den beskrev samma system en gång till och kunde inte köras samtidigt som Terraform utan att de motarbetade varandra (selfHeal återställde det Terraform ändrade, prune tog bort det Terraform skapade).

Det som medvetet inte ingår

Står också i terraform output karta under avgränsningar:

  • Objektlagring. Foton och video ligger som data-URL:er i händelseloggen. Det gör loggen till systemets enda sanningskälla, men också stor och tung att säkerhetskopiera.
  • Observability. Ingen metrikexport, ingen tracing.
  • Takt-begränsning på inloggning. Bara den publika beslutsvägen är begränsad, och bara per pod.
  • Återkallelse av JWT. En utfärdad token gäller sina 12 timmar ut även om användaren tagits bort.

Krav på klustret

  • En CNI som tillämpar NetworkPolicy (Cilium, Calico, Antrea). Utan det är 70-natverk.tf dokumentation, inte skydd.
  • ingress-nginx, med kontrollern i namnrymden var.ingress_namnrymd.
  • cert-manager med en ClusterIssuer.
  • En metrics-server för autoskalningen.
  • En StorageClass som klarar ReadWriteOnce.