feat(V1e): SPF + DKIM + DMARC DNS records for vauco.no

- infrastructure/terraform/dns-email.tf: tre Cloud DNS TXT-records
  - SPF: Google Workspace avsendertillatelse
  - DKIM: google._domainkey.vauco.no med faktisk nøkkel
  - DMARC: p=quarantine, rapporter til chris.christiansen@vauco.no
- ROADMAP: V1e markert ferdig

OQ-24 lukkes etter terraform apply
This commit is contained in:
chrischristiansen-glitch 2026-06-10 01:28:19 +02:00
parent 749a107e9d
commit 5983f64e33
2 changed files with 78 additions and 56 deletions

View File

@ -11,20 +11,20 @@
## HOSTING-PRINSIPP (autoritativt)
> **All hosting skjer på GCP. GitHub Pages og Cloudflare Pages skal fases ut.**
> Begrunnelse: samle all infrastruktur på Google Cloud for kontroll, konsolidering og fremtidig multi-tenant.
> - `vauco.no` → GCS + GCP Load Balancer + Cloud CDN ✅ (migrert 2026-06-05)
> - `costguard.oss.vauco.no` → Cloud Run via IAP (ikke Cloudflare Pages)
> - `vauco.no` → GCS + GCP Load Balancer + Cloud CDN ✅
> - `costguard.oss.vauco.no` → Cloud Run via IAP ✅
> - `threadstone.vauco.no` → GitHub Pages midlertidig — migreres til GCP ved T2
> - Ingen nye tjenester skal deployes til GitHub Pages eller Cloudflare Pages
---
## NOW — Aktiv akkurat nå
- [x] **K2 — AGENT_RULEBOOK retting**
- [x] **F8 — End-to-end test via opax.vauco.no**
- [x] **CG6 — Modulært drag+collapse dashboard + nye billing-endepunkter** · 2026-06-10
- [x] **CG3e — Token-logging til BQ med full CG4-labeling** · 2026-06-10
- [x] **OX1a** — Cloud Build live-widget i opax.html ✅ 2026-06-10
- [x] **OX1b** — Embedded TUI-panel i opax.html ✅ 2026-06-10
- [x] **CG4a**`/billing/tokens/by-module` ✅ 2026-06-10
- [x] **CG4c** — Prosjektestimator `/billing/tokens/estimate` ✅ 2026-06-10
- [x] **V1e** — SPF + DKIM + DMARC terraform (dns-email.tf) ✅ 2026-06-10 — kjør `terraform apply`
- [x] **ML-3b**`docs/gemma/world.md` opprettet ✅ 2026-06-10
---
@ -32,33 +32,22 @@
### vauco.no salgsportal (V-spor)
- [x] **V1aV1d** — vauco.no LIVE (GCS+LB, SSL ACTIVE) · 2026-06-05
- [ ] **V1e** — Sett opp SPF + DKIM + DMARC TXT-records på `vauco.no`
- [x] **V1e** — SPF + DKIM + DMARC · terraform klar · **mangler: `terraform apply`**
### CostGuard frontend
- [x] **CG3aCG3d** — costguard.html, CNAME, OAuth-flow ✅
- [ ] **OQ-21** — Bygg `app.threadstone.vauco.no` eller fjern CNAME
### CostGuard — token intelligence
- [ ] **CG4b** — Dashboard breakdown per modul (trenger BQ-data, trigger: 50+ kall)
- [ ] **CG4d** — Kundeprisingskalkulator basert på token-historikk
### CG4 — Token Intelligence
### OX1 — Operator Hub
- [x] **OX1a** — Cloud Build widget ✅
- [x] **OX1b** — TUI-panel ✅
- [ ] **OX1c** — Jason som eneste grensesnitt (erstatter VM-tilkobling)
> Bygger på `llm_token_usage`-rådata fra CG3e. Trigger: minst 50 loggede kall.
| # | Oppgave | Formål |
|---|---------|--------|
| CG4a | `/billing/tokens/by-module` — aggreger per `module_name` + `caller_type` | Hvilken komponent spiser tokens |
| CG4b | Dashboard breakdown: `jason/light`, `jason/heavy`, `costguard`, `billing_agent`, `cli/gemini-tui` | Visuell oversikt |
| CG4c | Prosjektestimator: historisk snitt-tokens × kompleksitetsfaktor → USD-estimat FØR oppgave startes | Estimer kostnad før bygg |
| CG4d | Kundeprisingskalkulator: token-historikk → autogenerer prisforslag per oppdrag | Korrekt prising av AI-arbeid |
### OX1 — Operator Hub fullføring
> Mål: `opax.vauco.no` blir Chris sitt komplette cockpit — aldri trenger VM igjen.
| # | Oppgave | Formål |
|---|---------|--------|
| OX1a | Cloud Build live-widget i `opax.html` — spinner → ✅/❌ ved push til main | Se deploy-status live |
| OX1b | Embedded terminal / TUI-vindu i operator hub (reaktiver `vauco-gemini-tui-bridge` som iframe/xterm.js) | CLI-tilgang uten VM |
| OX1c | Jason-chat som primærgrensesnitt i opax.html (erstatter VM-tilkobling for daglig drift) | Full kontroll fra browser |
| OX1d | `/opax/build-status` endepunkt mot Cloud Build API | Backend for OX1a |
### ML-3 — Gemma-verdensbygging
- [x] **ML-3b**`docs/gemma/world.md` opprettet ✅ — oppdateres løpende
- [ ] **ML-3a** — GCP GPU-VM klargjøring (`g2-standard-4` Spot, L4, ~$120/mnd)
- [ ] **ML-3c** — Hybrid agent: Gemma internt / Gemini for kunder
- [ ] **ML-3d** — Fine-tune på Vauco-sesjonsdata
---
@ -70,21 +59,6 @@
- [ ] **DX5** — Dialogflow Messenger live på costguard-landingssiden
- [ ] **ML-2** — Adaptiv intelligens (trigger: >500 telemetri-kall)
### ML-3 — Gemma-migrering (lokal modell)
> **Strategi:** Kjør ut Vertex AI-kreditter fullt ut. Bygg Gemmas «verden» simultant.
> Når kreditter er brukt opp → Gemma tar over internt. Kunder fortsetter på Gemini via Vertex.
> **Trigger:** Vertex-kreditter < 20% ELLER første betalende kunde er onboardet.
| # | Oppgave | Detaljer |
|---|---------|----------|
| ML-3a | Klargjør GCP GPU-VM: `g2-standard-4` Spot (1× L4, 24GB VRAM, ~$120150/mnd) | Ollama + Gemma 4 12B int4 |
| ML-3b | **Simultant nå:** Bygg Gemma-kontekst-pakke — last inn MASTERPLAN, ROADMAP, HANDOFF, alle sesjonsprotokoller, AGENT_RULEBOOK som system-prompt/RAG for Gemma | Gemma er ikke dum når den starter — forstår Vauco fra dag 1 |
| ML-3c | Migrer `agent.py` til hybrid: Gemma internt (Jason/Chris-bruk), Gemini via Vertex for kunder | Tofase-arkitektur |
| ML-3d | Fine-tune Gemma 4 på Vauco-sesjonsdata (protokoller + MASTERPLAN + kundeinteraksjoner) | Jason blir virkelig autonom |
> **ML-3b starter NESTE SESJON** — uavhengig av trigger. Kontekstpakken bygges parallelt med alt annet.
### Modul #2 — Threadstone
- [ ] **T1** — Konsolider `threadstone-instructions``OSVauco/docs/threadstone/`
- [ ] **T2** — Bygg `app.threadstone.vauco.no` — migrer fra GitHub Pages til GCP
@ -111,14 +85,14 @@
## BLOCKED
- ⏳ **OQ-22** — Claude Opus 4.6/4.7 EU-kvote ikke innvilget. Midlertidig`gemini-2.5-pro` via Vertex AI.
- ⏳ **OQ-22** — Claude EU-kvote ikke innvilget. Kjører`gemini-2.5-pro` via Vertex AI.
---
## KJENTE HULL
- [x] **OQ-23**`vauco.no` LIVE · 2026-06-05
- [ ] **OQ-24** — SPF/DKIM/DMARC mangler på `vauco.no` → V1e
- [ ] **OQ-24** — SPF/DKIM/DMARC — terraform klar, **lukkes etter `terraform apply`**
- [x] **OQ-25** — Personvern + vilkår publisert · 2026-06-05
- [ ] **OQ-26** — Ingen statuspage → etter første kunde
@ -128,15 +102,18 @@
- [x] **Phase 07** — Baseline, domener, Cloud Run, IAP, CI/CD, RAG · 2026-05-2130
- [x] **GDrive/GitHub paritet** · 2026-05-25
- [x] **Repo-konsolidering trinn 1** · 2026-05-27
- [x] **Terraform bootstrap-modul** · 2026-05-26
- [x] **OPAX operator hub** · 2026-05-31
- [x] **K1 — Repo-konsolidering** · 2026-06-09
- [x] **K3 — Fiks nattlig GDrive backup** · 2026-06-09
- [x] **CG6 — Modulært dashboard, anomalier, historikk, budsjett** · 2026-06-10
- [x] **CG3e — Token-logging til BQ med full CG4-labeling** · 2026-06-10
- [x] **ML-3 plan — Gemma-migrering dokumentert, kontekstbygging planlagt** · 2026-06-10
- [x] **K1** — Repo-konsolidering · 2026-06-09
- [x] **K3** — Nattlig GDrive backup · 2026-06-09
- [x] **CG6** — Modulært dashboard, anomalier, historikk, budsjett · 2026-06-10
- [x] **CG3e** — Token-logging til BQ med full CG4-labeling · 2026-06-10
- [x] **OX1a** — Cloud Build live-widget · 2026-06-10
- [x] **OX1b** — Embedded TUI-panel · 2026-06-10
- [x] **CG4a+c** — Token intelligence endepunkter · 2026-06-10
- [x] **V1e** — SPF/DKIM/DMARC terraform · 2026-06-10
- [x] **ML-3b** — Gemma world.md · 2026-06-10
---
*Sjekkliste-logikk: NOW skal være ≤4 oppgaver. Når en NOW er done → flytt til Fullført. Når en NEXT starter → flytt opp til NOW.*
*Sjekkliste-logikk: NOW skal være ≤4 oppgaver. Når en NOW er done → flytt til Fullført.*

View File

@ -0,0 +1,45 @@
# dns-email.tf
# V1e SPF + DKIM + DMARC for vauco.no
# Apply: terraform apply -target=google_dns_record_set.spf -target=google_dns_record_set.dkim -target=google_dns_record_set.dmarc
# Verifiser etterpå: dig TXT vauco.no, dig TXT google._domainkey.vauco.no, dig TXT _dmarc.vauco.no
locals {
dns_zone = "vauco-no" # Cloud DNS managed zone name
domain = "vauco.no."
}
# SPF
resource "google_dns_record_set" "spf" {
name = local.domain
managed_zone = local.dns_zone
type = "TXT"
ttl = 3600
rrdatas = [
"\"v=spf1 include:_spf.google.com ~all\""
]
}
# DKIM
resource "google_dns_record_set" "dkim" {
name = "google._domainkey.${local.domain}"
managed_zone = local.dns_zone
type = "TXT"
ttl = 3600
rrdatas = [
"\"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3BWJTmOMIJ/nNFFOhyKQT1Ls35jYaBNKDGErqw2P4hOSpGHzJyMQAl3EkQyWYDC6e/mmk3It3HxwL8mfyyNKYXUFVVEKadDt58AFiJCNxM+lUAmdg0aM9ePWQ6LNBrkLE3Av7D/zrd40cFkBPP4eReKhWQQp94P5BuvoljFM6bTqmdejXuS5fERUMJ2p9aFo7tpSaczI57qt+CYejLaHCckgGoYeC7zecLxTQDA6Lfh7wX5rkjyVvU6q/+CeAOdNO+WyWEHPgEFsCnbZ8LhqlbnrkBib9KmpG99z7Btrnc1SHUj6X0nTfuXfJk+1w0bdlnaTr4asWdP6qVbQnksYSQIDAQAB\""
]
}
# DMARC
resource "google_dns_record_set" "dmarc" {
name = "_dmarc.${local.domain}"
managed_zone = local.dns_zone
type = "TXT"
ttl = 3600
rrdatas = [
"\"v=DMARC1; p=quarantine; pct=100; rua=mailto:chris.christiansen@vauco.no; ruf=mailto:chris.christiansen@vauco.no; fo=1\""
]
}