a5e276534c
Andra lagret läser nu basens utdata i stället för att upprepa någonting. 05-aws.tf hämtar klustret, domänen, certifikatet, registret, rollerna, hinken och hemligheternas namn — ändras något i basen slår det igenom här utan att en rad ändras. Autentiseringen mot klustret sker med en färsk EKS-token i stället för en kubeconfig på disk: inget att distribuera, inget som går ut. Hemligheterna bor i Secrets Manager och speglas in av External Secrets var timme. Terraform ser aldrig värdena, och det är själva poängen — en hemlighet som passerar Terraform hamnar i tillståndsfilen. Roteras en hemlighet följer klustret efter av sig självt. Plattformstjänsten kör som ett tjänstekonto med IRSA. Rollen är bunden till exakt det kontot i den namnrymden, så grannpodden på samma nod får ingenting på köpet. Bilagorna signeras mot S3 med samma roll — inga nycklar existerar att läcka. Postgres-podden är borta. Händelseloggen ligger i Aurora utanför klustret, i ett subnätlager utan routing ut, med automatisk säkerhetskopiering och PITR. Ingressen är en ALB med ACM-certifikat i stället för nginx, och alla tre tjänsterna delar den genom samma gruppnamn. Gitea med egna Actions-runners kör i samma kluster. Därmed finns inget externt beroende kvar: källkod, bygge, register och driftsättning ligger allt i vår AWS-miljö. Runnern och driftsättningen har varsitt tjänstekonto med skilda roller — bygget får publicera till ECR men inte röra klustret, driften tvärtom. Ett komprometterat bygge kan inte driftsätta. Gitea kör SQLite på en EBS-volym i stället för en egen Aurora-databas. En verkstadsinstallation har en handfull utvecklare, och ytterligare en databas att säkerhetskopiera och övervaka är kostnad utan motsvarande nytta. Verifierat: 96 vitest-tester, rotens lint och format:check, terraform fmt på båda lagren och statisk referenskontroll av vardera (88 respektive 35 resurser, inga dinglande referenser, alla count-resurser indexerade). terraform validate kunde inte köras här — registry.terraform.io är blockerad av sessionens egress-policy — så CI-jobbet kör den. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012EQg3rJsrQ1ZNTvkzmQAtt
103 lines
4.0 KiB
Markdown
103 lines
4.0 KiB
Markdown
# 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
|
|
|
|
```sh
|
|
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
|
|
|
|
```sh
|
|
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`.
|