Files
boc/workcamp/VOL3-Infrastructure-Operations.md
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- Add NFC ePassport roadmap (ICAO 9303, eIDAS)
- Add TensorFlow.js edge face detection (BlazeFace)
- Add structured audit logger (GDPR-compliant)
- Risk scoring support

Part of KYC Apple Native UX v1.1.0
2026-06-29 16:24:48 +00:00

555 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AMOS Development Workcamp 2026
# Volume 3: Infrastructure and Operations History
# Period: 11 maj 7 juni 2026
# Genererat: 2026-06-07 | Klassifikation: INTERN KONFIDENTIELL
---
## 1. AWS-INFRASTRUKTUR ÖVERSIKT
### 1.1 AWS-konto och Region
| Parameter | Värde |
|-----------|-------|
| **AWS-konto** | 155407238699 |
| **Primär region** | eu-north-1 (Stockholm) |
| **Sekundär region** | eu-west-1 (Irland) Mac Build Server |
| **IAM-profil (agent)** | platform-ai-agent |
| **Instans-roll** | platform-ec2-ssm-role (AmazonSSMManagedInstanceCore) |
### 1.2 EC2-instanser
#### server-2 (primär produktionsserver)
| Parameter | Värde |
|-----------|-------|
| **Instance ID** | i-09b2204a52c2f33c9 |
| **Typ** | ARM64 (aarch64) |
| **Region/AZ** | eu-north-1b |
| **Elastic IP** | 16.170.83.169 |
| **Hostname** | bernt.wavult.com / bernt.aamos.systems |
| **OS** | Amazon Linux 2023 (ARM64), kernel 6.18.30-61.116.amzn2023.aarch64 |
| **RAM** | 6.0GB (Node.js) |
| **SSM** | Online (AmazonSSMManagedInstanceCore) |
| **SG** | sg-070aca8fc94a5a91b |
#### host-2 / server-3 (redundanshost, RES-004)
| Parameter | Värde |
|-----------|-------|
| **Instance ID** | i-0fc20ddba6bb17ead (v2, DNS-fix) |
| **Privat IP** | 172.31.20.206 |
| **Region/AZ** | eu-north-1a |
| **AMI-origin** | ami-0fc5c75dc45812df9 (server-2 baseline snapshot) |
| **Skapad** | 2026-06-05 03:09 UTC |
| **SSM** | Online |
| **DNS-fix** | /etc/resolv.conf: nameserver 172.31.0.2, chattr +i |
#### GPU-box / gpu-training (ALETHEIA-träning)
| Parameter | Värde |
|-----------|-------|
| **Instance ID** | i-04239ef03d26b218b |
| **Typ** | A10G 23GB VRAM |
| **Publik IP** | 13.61.176.142 |
| **Privat IP** | 172.31.36.61 |
| **SSH-nyckel** | gpu_deploy_key |
| **EJ SSM-styrd** | SSH-baserad åtkomst |
| **Status** | STANNAR igång (Erik: fortsatt träning) |
| **Serverar** | vLLM :8000 (ALETHEIA) |
#### p4d.24xlarge SPOT (DDP-träning, TERMINERAD)
| Parameter | Värde |
|-----------|-------|
| **Instance ID** | i-0e9e845b6d85af5a0 |
| **Typ** | p4d.24xlarge (8x A100-SXM4-40GB) |
| **Region/AZ** | eu-north-1c |
| **Publik IP** | 13.48.129.246 |
| **Privat IP** | 172.31.1.199 |
| **Kostnad** | $8/h SPOT (cap $12/h) |
| **DLAMI** | PyTorch 2.7 |
| **Status** | TERMINERAD efter v5-träning (ALETHEIA klar) |
#### Mac Build Server (eu-west-1)
| Parameter | Värde |
|-----------|-------|
| **Instance ID** | i-0fde74767ebfcbdd8 |
| **AMI** | ami-02ab2839514384495 |
| **Dedicated Host** | h-0298aacec652d75b3 (eu-west-1a) |
| **Snapshot** | snap-00d2f39d8775caa67 (completed) |
| **Publik IP** | 3.249.41.127 |
| **SSH** | `ssh -i ~/.openclaw/workspace/mac-build-key.pem ec2-user@3.249.41.127` |
| **macOS** | 26.4.1 (BuildVersion: 25E253) |
| **Runner** | wavult-mac-build-eu-01, Runner ID: 2 |
### 1.3 RDS (PostgreSQL)
#### platform-identity-core (primär produktions-DB)
| Parameter | Värde |
|-----------|-------|
| **Endpoint** | platform-identity-core.cvi0qcksmsfj.eu-north-1.rds.amazonaws.com |
| **DB-namn** | amos (schema: quixzoom, wavult_identity, m.fl.) |
| **Initial klass** | db.t4g.small (2GB RAM) |
| **Klass efter RES-003** | **db.r6g.large (16GB RAM)** 8x ökning |
| **Multi-AZ** | **TRUE** (aktiverat RES-001, 2026-06-04) |
| **Backup retention** | 35 dagar + daglig auto-snapshot |
| **SG** | sg-0feb828ee1ff94071 |
| **SSM-access** | Instansroll saknar secrets-access → använd platform-ai-agent |
> **KRITISK LÄRDOM:** DNS-resolution av RDS sker via Tailscale MagicDNS (100.100.100.100) på server-2. host-2 saknade Tailscale → ENOTFOUND. Löst med statisk VPC-resolver (172.31.0.2) via chattr.
#### aamos-postgres (K8s/EKS DB)
- Endpoint: aamos-postgres/aamos_prod (intern EKS-resurs)
- OBS: Skiljer sig från identity-core restaurangtjänster använder identity-core/amos
### 1.4 Application Load Balancer (ALB)
| Parameter | Värde |
|-----------|-------|
| **Namn** | aamos-prod-alb |
| **DNS** | aamos-prod-alb-709257248.eu-north-1.elb.amazonaws.com |
| **AZ:er** | eu-north-1a, eu-north-1b, eu-north-1c |
| **Target Group** | aamos-prod-tg |
| **Targets** | server-2 (1b, HEALTHY) + host-2 (1a, HEALTHY) |
| **Health check** | HTTP:3209/health/ready (djup DB-check) |
| **HTTPS listener** | *.wavult.com + quixzoom.com cert (SNI) |
| **HTTP redirect** | 301 → HTTPS |
| **ALB-SG** | sg-0cac842012eae85dd |
| **DNS live** | quixzoom-api.wavult.com → ALB alias |
### 1.5 S3
| Bucket | Användning |
|--------|-----------|
| `quixzoom-landing-prod` | Statisk sajt (CloudFront EE30B9WM5ZYM7) |
| `platform-ouroboros-models` | AI-modeller. `aletheia-eslm-v5-20260607/` (14 objekt) |
### 1.6 EKS-kluster
| Parameter | Värde |
|-----------|-------|
| **Klusternamn** | wavult |
| **Version** | v1.31 |
| **Auth-mode** | API_AND_CONFIG_MAP |
| **Noder** | 3 Ready (graviton r6g/r8g, arm64) |
| **x86-pool** | c6i (desired=0, vilande) |
| **ECR** | 155407238699.dkr.ecr.eu-north-1.amazonaws.com |
**Installerade controllers/operators:**
- ArgoCD (GitOps)
- cert-manager
- external-dns
- external-secrets (ClusterSecretStore: `aws-ssm-store` → AWS SSM)
- Kong gateway (NLB k8s-gateway-konggate)
- aws-load-balancer-controller
- Karpenter (graviton-spot nodepool)
- metrics-server
- Kafka (KRaft, 3-broker StatefulSet `wavult-kafka`, wavult ns)
**Namespaces:**
- `rust` Rust-workloads (7 ClusterIP-services definierade)
- `gateway` Kong Ingress
- `wavult` Kafka + bakgrundsinfra
- `argocd` GitOps
- `aamos` aamos-event-bus-svc :3383
**Migrationsstatus 2026-06-07:**
- tickets-tjänst: KLAR i EKS (2 pods, arm64, Kong-route, RDS-verifierad)
- ledger: ECR-repo skapad, EJ migrerad
- 15 övriga restaurant-tjänster: EJ migrerade
### 1.7 AWS Secrets Manager
| Secret | ARN-suffix | Innehåll |
|--------|-----------|---------|
| `/wavult/prod/core` | — | Core-nycklar |
| `/wavult/prod/identity` | — | Identity-nycklar |
| `/wavult/prod/amos-db-url` | — | RDS URL |
| `/wavult/prod/ledger-db-url` | — | Ledger DB URL |
| `wavult/codebuild/gitea-token` | — | Gitea CI-token |
| `aamos/prod/mail-accounts` | ...NCx2TX | 21 Mailu-kontolösenord |
| `/aamos/prod/restaurant/DATABASE_URL` | — | Restaurant-tjänsters DB |
> **OBS:** Instansroll saknar secrets-access. Åtkomst VIA profil `platform-ai-agent`.
### 1.8 Cloudfront
| Distribution | Origin | Domäner |
|-------------|--------|---------|
| EE30B9WM5ZYM7 | S3 quixzoom-landing-prod | quixzoom.com, www.quixzoom.com |
### 1.9 CodeBuild
- build-wavult-core
- build-amos-core
- mirror-gitea
- hypbit-build-landvex-api
---
## 2. NÄTVERKSARKITEKTUR
### 2.1 VPC och Subnets
- VPC: eu-north-1 (Standard AWS VPC)
- Subnets: eu-north-1a, eu-north-1b, eu-north-1c
- DNS: AmazonProvidedDNS (172.31.0.2) CANONICAL resolver för prod
- Tailscale: MagicDNS 100.100.100.100 server-2 primär resolver (BRÄCKLIGT för multi-host)
### 2.2 Tailscale
- server-2 är Tailscale-ansluten (100.100.100.100)
- **ARKITEKTUR-FLAGGA:** Prod DB-resolution beror på Tailscale MagicDNS bräckligt
- **ÅTGÄRD (2026-06-05):** VPC-resolver som fallback via systemd-resolved.conf.d/99-vpc-fallback.conf på server-2. FallbackDNS=172.31.0.2 + Domains ~rds.amazonaws.com.
### 2.3 Security Groups
| SG | Roll | Kritiska regler |
|----|------|----------------|
| sg-070aca8fc94a5a91b | server-2 + host-2 (hosts) | Self-reference inlagd 2026-06-05 (443/3100/3209 från sig själv) |
| sg-0cac842012eae85dd | ALB | — |
| sg-0feb828ee1ff94071 | RDS | Tillåter host-SG (070a) på 5432 |
> **KRITISK FIX (2026-06-05 02:38 UTC):** sg-070aca8fc94a5a91b saknade self-reference → host→host (och host→egen-priv-IP) blockerat. Tillagd: inbound 443/3100/3209 från egen SG. host-2 fick omedelbart RDS-access på 3209.
### 2.4 DNS (Route53)
| Zon | Zone ID |
|-----|--------|
| aamos.systems | Z03908683A2AIMRZR85BQ |
| wavult.com | 5bed27e91d719b3f9d82c234d191ad99 (Cloudflare, avvecklat 2026-05-16) |
| quixzoom.com | e9a9520b64cd67eca1d8d926ca9daa79 (Cloudflare) |
**DNS-migrationsstatus (2026-06-05/06):**
- 66 Route53-zoner inventerade (C1 2026-06-06)
- Kategori EU: 38 zoner (hanteras av teamet)
- Kategori övriga marknader: 13 zoner (partner-modell, hold tills Erik beslutar)
- Dubbletter/döda: 4 zoner
---
## 3. TJÄNSTER OCH PORTAR
### 3.1 Systemd-tjänster (Rust ARM64)
| Tjänst | Port | Kategori |
|--------|------|---------|
| aamos-api-gateway | 3206 | Core |
| aamos-rule-engine | 3201 | Core |
| aamos-tolkserver | 3204 | Core (Primal Charter §1.1-1.8) |
| aamos-stammregister | 3205 | Core |
| aamos-gecl-chain | 3263 | Core (Governed Evidence Chain Ledger) |
| aamos-health-aggregator | 3299 | Core (hårdkodad port) |
| aamos-financial-engine | 3203 | Finance |
| aamos-ledger | 3250 | Finance (dubbel bokföring, BAS, SIE4) |
| aamos-sie-import | 3254 | Finance |
| aamos-bank-import | 3253 | Finance |
| aamos-billing-engine | 3392 | Finance |
| aamos-payroll-rust | 3285 | Finance/HR |
| aamos-invoice-rust | 3286 | Finance |
| aamos-people-core | 3271 | HR |
| aamos-hr-rust | 3284 | HR |
| aamos-operations-core | 3272 | Ops |
| aamos-commerce-rust | 3280 | Commerce |
| aamos-crm-rust | 3282 | Commerce |
| aamos-campaign-rust | 3283 | Commerce |
| aamos-compliance-rust | 3287 | Compliance |
| aamos-dynasty-engine | 3210 | Governance (hårdkodad port) |
| aamos-venture | 3316 | Governance |
| aamos-analytics-engine | 3211 | Analytics |
| aamos-analytics-rust | 3281 | Analytics |
| aamos-meeting-service | 3308 | Collab |
| aamos-quixzoom-engine | 3390 | quiXzoom |
| aamos-landvex-engine | 3391 | LandveX |
| aamos-dissg-engine | 3360 | Gov/Intel (DISSG Kolada) |
| aamos-seep | 3350 | Gov/Intel (SEEP Kvittovalvet Pan-EU) |
| aamos-mlcs-engine | 3370 | Intelligence |
| amos-core | 3100 | Core (AI Brain, LLM-router) |
#### Restaurant-systemd (Rust ARM64, server-2)
| Tjänst | Port |
|--------|------|
| aamos-restaurant-pos | 3300 |
| aamos-restaurant-inventory | 3301 |
| aamos-restaurant-hr | 3302 |
| aamos-restaurant-ops | 3303 |
| aamos-restaurant-onboarding | 3304 |
| aamos-restaurant-menu | 3305 |
| aamos-restaurant-compliance | 3306 |
| aamos-restaurant-analytics | 3307 |
| aamos-restaurant-delivery | 3309 |
| aamos-restaurant-licensing | 3310 |
| aamos-restaurant-kiosk | 3311 |
| aamos-restaurant-estax | 3312 |
| aamos-restaurant-eslocal | 3313 |
| aamos-restaurant-screens | 3314 |
| aamos-restaurant-designer | 3315 |
| aamos-restaurant-tickets | 3318 → **EKS (rust ns, 2 pods)** |
### 3.2 Systemd-tjänster (Node.js)
| Tjänst | Port |
|--------|------|
| ouroboros-finance | 3202 |
| ouroboros-identity | 3207 |
| ouroboros-payroll | 3231 |
| ouroboros-expenses | 3226 |
| aamos-audit-engine | 3251 |
### 3.3 PM2-processer (Node.js)
| Namn | Port | Roll |
|------|------|------|
| quixzoom-api | 3209 | quiXzoom API (bakom ALB) |
| ai-gateway | 3270 | LLM-routing (6 providers, auto-failover) |
| provider-monitor | — | Kredit/health-bevakning |
| audit-proxy | — | Audit-proxy (bryggar 3251→3260) |
| ouroboros-multiorg | — | Multi-org orchestration |
| ouroboros-finance-proxy | — | Finance proxy |
| ouroboros-identity-proxy | — | Identity proxy |
| ouroboros-people-proxy | — | People proxy |
| ouroboros-commerce-proxy | — | Commerce proxy |
| ouroboros-time | — | Time tracking |
| mail-admin | — | Mailadmin |
### 3.4 Externa tjänster (vLLM, NATS)
| Tjänst | Host | Port | Status |
|--------|------|------|--------|
| vLLM (ALETHEIA) | 172.31.36.61 (gpu-training) | 8000 | LIVE, nohup (EJ systemd) |
| NATS | server-2 | — | Systemd |
| Kafka | EKS wavult ns | — | 3/3 brokers healthy |
---
## 4. DOMÄNMIGRATION wavult.com → aamos.systems
### 4.1 Bakgrund
Erik (2026-06-05): "Vi driver affären Aamos i Aamos. wavult ska ALDRIG synas i domäner."
### 4.2 Migreringsstatus (2026-06-05/06)
**Live på aamos.systems (200+):**
- os, pro, ai, api, analytics, commerce, amos, bernt, git, gitea, grafana/monitor, watchman, sales, tasks, identity, payments, gfiae, audit
**Produktdomäner (live):**
- aamos.ai (+www +api)
- api.quixzoom.com
**301-redirects (gammal wavult.com → ny):**
- ouroboros→os, argus→watchman, staff→team, jira/plane→tasks, quixzoom-api→api.quixzoom.com, gate/kong-admin→api.aamos.systems
**Maintenance (503):**
- team (port 3510 ej deployad)
- vault (172.31.42.221 nedlagd)
### 4.3 nginx-konfiguration
Huvudfil: `/etc/nginx/sites-available/aamos.systems`
**Subdomäner i aamos.systems-filen:**
- `os.aamos.systems` → proxy 127.0.0.1:3100
- `pro.aamos.systems` → proxy 127.0.0.1:3100
- `ai.aamos.systems` → proxy 127.0.0.1:3100
- `api.aamos.systems` → microservices gateway
**Egna dedikerade vhost-filer:**
- audit.aamos.systems, gfiae.aamos.systems, git.aamos.systems, gitea.aamos.systems
- grafana.aamos.systems, identity.aamos.systems, payments.aamos.systems, watchman.aamos.systems
> **NGINX-PRIVKEY-BUGG (fixad):** Alla certs i /etc/letsencrypt/archive/*/privkey*.pem hade 640 (ec2-user) → nginx-worker (uid 101) kunde ej läsa → krasch vid reload. Fixat till 644. Viktigt vid framtida cert-skapande.
---
## 5. MAILINFRASTRUKTUR (MAILU)
### 5.1 Stack
| Komponent | Detalj |
|-----------|--------|
| **Stack** | Mailu 2.0 (postfix/dovecot/rspamd/admin/webmail) |
| **Mailserver** | mail.wavult.com @ 16.170.83.169 |
| **Utgående relay** | Resend (resend.com) |
| **TLS-cert** | mail.wavult.com (EJ mail.aamos.systems SAN saknas) |
| **Admin** | Mailu admin-panel |
| **Docker** | Docker-stack live |
### 5.2 Brevlådor (17 st)
**aamos.systems (10):**
- erik, winston, dennis, johan, leon (RADERAD 2026-06-06), bernt
- info, support, hr, no-reply
- Roll-brevlådor: ceo, cfo, coo, cto (+ cmo-alias)
**landvex.com (3):** info, support, no-reply
**quixzoom.com (4):** info, support, no-reply, zoomers
### 5.3 Alias-routing (24 alias, multi-hop)
**Funktionsadress → ROLL → Person-arkitektur:**
- sales/marketing@aamos.systems → cmo → cto (CMO vakant, temporärt)
- billing/finance/invoice@aamos.systems → cfo → winston
- legal@aamos.systems → coo → dennis
- security/cto@aamos.systems → cto → johan
- ceo@aamos.systems → ceo → erik
**LIVE-test (verifierat):**
- sales@aamos.systems → cmo → ceo → erik: status=sent ✅
- billing@landvex.com → cfo → winston: status=sent ✅
### 5.4 DNS-konfiguration (Route53)
| Record | Värde |
|--------|-------|
| MX | 10 mail.wavult.com |
| SPF | v=spf1 mx a:mail.wavult.com include:spf.resend.com ~all |
| DKIM | wavult._domainkey.aamos.systems (RSA 2048, chunkad 255-bitar) |
| DMARC | p=none (mjuk start, rua→postmaster@aamos.systems) |
### 5.5 Kvarstående Mailuppgifter
- TLS-cert: lägg till mail.aamos.systems som SAN
- DMARC: höj p=none → p=quarantine/reject (efter 1-2v verifiering)
- ~60 övriga domäner: partner-modell eller catch-all-redirect, väntar Eriks beslut
---
## 6. AI-INFRASTRUKTUR
### 6.1 AI-Gateway (ai-gateway, PM2, port 3270)
**Fil:** `/opt/amos/data/ai-gateway/gateway.mjs`
**Failover-kedjor (Grok exkluderad tills påfylld):**
| Task | Primär → Fallback 1 → Fallback 2 |
|------|----------------------------------|
| reasoning | openai(o3) → anthropic(opus) → deepseek |
| fast | groq → gemini → openai(4o-mini) |
| search | perplexity (ingen fallback) |
| creative | openai(gpt-4o) → anthropic(sonnet) → gemini |
| financial | anthropic(claude) → openai(o3) → groq |
| default | anthropic(sonnet) → openai(4o) → groq |
**Endpoints:** POST /v1/chat, GET /health, /metrics, /providers
**Circuit-breaker:** Per provider (öppnas efter N fel, halvöppen efter cooldown)
### 6.2 Provider-monitor (PM2)
**Fil:** `/opt/amos/data/ai-gateway/monitor.mjs`
- Pollar 7 providers var 5:e min
- Auto-larm CRITICAL: Winston (kredit) + Johan (nedtid) via HomoDeus
- Output: provider-status.json
### 6.3 AWS Bedrock
| Modell | Status |
|--------|--------|
| Qwen3-32B (aws) | LIVE primär för /api/aamos/chat |
| Claude Sonnet 4.5 (Bedrock eu-north-1) | UPPLÅST (FTU-formulär inskickat 2026-06-06 via API, root) |
| Claude Opus 4.6 (Bedrock eu-north-1) | UPPLÅST |
| Claude Opus 4.8 (direkt Anthropic-nyckel) | LIVE poliskontroll/domare |
> **OBS:** Bedrock-Claude var gated (use-case-formulär ej ifyllt). Lösning: PutUseCaseForModelAccess API anropades direkt med root-access. Nu upplåst för konto 155407238699 eu-north-1.
### 6.4 ALETHEIA (ESLM v5)
| Parameter | Värde |
|-----------|-------|
| **Basmodell** | Qwen2.5-7B-Instruct (unsloth/Qwen2.5-7B-Instruct-bnb-4bit) |
| **Träningsdata** | v5: 20807 train / 2319 val, 0 företagstermer |
| **LoRA config** | r=16, alpha=32, dropout=0.05, 7 target_modules |
| **Träningsresultat** | train_loss 0.35, token-accuracy 94%, 3 epoker, 57 min (8x A100) |
| **Serving** | vLLM fp16, VRAM 21GB, served-name: aletheia |
| **Endpoint** | 172.31.36.61:8000/v1 |
| **Bugfix** | VLLM_USE_FLASHINFER_SAMPLER=0 + --enforce-eager |
| **Säkrad** | server-2 /opt/amos/models/aletheia-v5/ (15GB) + S3 + A10G |
**Versionshistorik:**
- v1 (amos-r2 original): 33473 ex, fel org-nr (559316-3881), LandveX=bostad → BLOCKED 33%
- v2: 33352 ex, org-nr fixat, ej omtränats
- v3: 33352 ex (canon-datafix), Leon/Vincento kvar → KASSERAD (kontaminerad)
- v4: 33178 ex (Leon/Vincento droppade) → KASSERAD (v4 hade fortf. företagstermer)
- **v5 (KLAR): 20807 ex, 0 företagstermer, generell evidensmotor → DEPLOYAD**
---
## 7. SÄKERHETSHÄNDELSER OCH ÅTGÄRDER
### 7.1 Kritiska Säkerhetssårbarheter Reparerade
| CVSS | Sårbarhet | Status | Datum |
|------|-----------|--------|-------|
| **10.0** | JWT Algorithm Confusion jwt.decode() istf jwt.verify() i 6 filer | ✅ Fixad | 2026-05-06 |
| **Kritisk** | POST /api/qz/payments/credits/add INGEN auth (obegränsad credits-minting) | ✅ Fixad | 2026-06-05 |
| **Kritisk** | Stripe-webhook ingen idempotens (dubbel kreditering vid retry/multi-host) | ✅ Fixad | 2026-06-05 |
| **Hög** | /api/qz/assistant öppen LLM-endpoint (AI-kostnadsabuse) | ✅ Rate-limited | 2026-06-05 |
| **Medel** | quiXzoom.submissions saknade approval-endpoint (zoomers aldrig betalade) | ✅ Fixad | 2026-06-05 |
### 7.2 Latenta SSL-buggar (Fixade)
Alla `.mjs`-filer med `new Pool({connectionString: ...})` utan SSL:
- tool-registry.mjs → FIXED (ssl:{rejectUnauthorized:false})
- ouroboros-notifications-routes.mjs → FIXED
- timetrack/analytics-engine.mjs → FIXED
- scaffold/generator.mjs + transitions.mjs → Skippade (code templates, ej mot RDS)
### 7.3 nginx privkey chmod-bugg (Fixad)
Privkey-filer i /etc/letsencrypt/archive/*/privkey*.pem hade chmod 640 (ec2-user:ec2-user) → nginx-worker (uid 101) kraschade vid reload. Fixat till 644.
---
## 8. INCIDENTER MED RCA
### INC-001: xAI/Grok kredit-haveri (2026-06-04 21:43 UTC)
**Symptom:** AI-orkestrering #1c stoppade utan förvarning
**Rotorsak:** xAI/Grok API-nyckel hade 0 kr kvar, ingen auto-failover
**Impact:** Strategisk AI-orkestrering stoppades (ej kundpåverkande)
**Fix:** AI-Gateway med auto-failover + circuit-breaker. Provider-monitor med CRITICAL-larm.
**Permanent åtgärd:** ABSOLUT REGEL varje provider = primärt Revolut-kort + fallback-kort + auto-topup + buffert (Tickets: Johan PROV-001..006, Winston PROV-W1..6)
### INC-002: LandveX-systemkunskap-haveri (2026-06-06)
**Symptom:** AI-systemet trodde LandveX = "bostad/mäklare"
**Rotorsak (4 lager):**
1. RAG-index existerade inte på disk
2. rag.mjs indexerade bara 3 filer (ej styrningspaketet)
3. Stubs svarade ok:true (dolde att RAG var dött)
4. 39 konkurrerande truth-filer (ingen enskild sanningskälla)
**Impact:** Felaktig produktdefinition i AI-assistenten (produktionschat)
**Fix:** AAMOS_CANON.md skapad, rag.mjs patchad, RAG-index byggt om (94 chunks), wavult-facts.mjs fixad, orphan-fil neutraliserad
**Permanent åtgärd:** AAMOS_CANON.md = ENDA kanoniska sanningskällan (E4). Separation: wavult-facts.mjs (manuell) + CANON/RAG separata källor.
### INC-003: host-2 DNS/RDS-fel (2026-06-05 03:00 UTC)
**Symptom:** host-2 (server-3) fick ENOTFOUND på RDS-endpoint
**Rotorsak:** AMI-snapshot fångade server-2:s resolv.conf med 100.100.100.100 (Tailscale). host-2 utan Tailscale → resolvern ej nåbar → RDS-DNS ouppslag
**Impact:** host-2 hölls automatiskt ur ALB-rotation (djup health-check 503 → korrekt beteende)
**Fix:** Terminerade trasig klon, ny host-2 v2 med user-data som skriver resolv.conf + chattr +i (nameserver 172.31.0.2)
**Permanent åtgärd:** server-2 fick FallbackDNS via systemd-resolved.conf.d/99-vpc-fallback.conf. ARKITEKTUR: Lägg VPC-resolver som primär/fallback på ALLA prod-hostar.
### INC-004: amos-core OOM via SocialAuto restart-storm (2026-06-05)
**Symptom:** Alla domäner mot port 3100 timeout. amos-core: 5.2G/6.0G RAM, 1850 tasks, NATS 503-flod
**Rotorsak:** SocialAuto (social-account-automation.mjs) relanserade vid varje restart ALLA QUEUED/FAILED-jobb utan concurrency-tak → 137 stealth-Chromium-instanser (13.4 GB) → OOM → event-loop svalt
**Fix:** Cancellerade 274 skenande jobb. PATCH: global semafor SOCIALAUTO_MAX_CONCURRENT=3 runt runAutomation()
**Lärdom:** Vid amos-core-strul kolla ALLTID `pgrep -fc chrome` och social-account-jobs.json status-counts FÖRST.
### INC-005: Kafka degraderad 8 dagar (2/3 brokers) (Uppdagad 2026-06-07)
**Symptom:** kafka-1 saknad, 2/3 brokers i ≥8 dagar
**Rotorsak 1:** kafka-1 init-container `fix-volume` saknade resource limits → ResourceQuota `wavult-quota` blockerade (FailedCreate x721 över 8 dagar)
**Rotorsak 2:** kafka-1:s PVC bunden till raderad EBS-volym vol-0891ca1531dc90def (InvalidVolume.NotFound)
**Fix:** Patchade initContainer med resource limits. Raderade orphaned PVC + pod. EBS-CSI provisionerade ny 20Gi gp3. Broker rejoinade via RF=3-replikation.
**Permanent åtgärd:** Broker-hälso-monitoring saknas → observability-gap att åtgärda.
---
## 9. CERTIFIKAT
| Domän | CA | Giltig t.o.m. | Nyckeltyp |
|-------|-----|--------------|----------|
| landvex.com + www | ZeroSSL | 2026-09-02 | EC |
| *.wavult.com | Let's Encrypt | Rollande | RSA |
| mail.wavult.com | Let's Encrypt | Rollande | RSA |
| quixzoom.com | ACM (ALB) | Hanteras av AWS | RSA |
---
*Volume 3 av 7 | AMOS Development Workcamp Reconstruction Package*