# 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`.