diff --git a/docs/VM-BOOTSTRAP.md b/docs/VM-BOOTSTRAP.md new file mode 100644 index 0000000..193df5d --- /dev/null +++ b/docs/VM-BOOTSTRAP.md @@ -0,0 +1,163 @@ +# OSVauco — VM Bootstrap Guide + +> **Denne guiden gjelder ny VM eller etter serverbytte.** +> Følg stegene i rekkefølge. Ikke hopp over noe. + +--- + +## Forutsetninger + +| Krav | Verdi | +|------|-------| +| GCP-prosjekt | `propane-will-491900-m5` | +| Region | `us-central1` | +| Billing account | `0171F6-057E6B-A260BA` | +| gcloud CLI | Installert på VM (`gcloud version`) | +| Git | Installert (`git --version`) | + +--- + +## Steg 1 — SSH-nøkkel til GitHub (én gang per VM) + +```bash +# Generer nøkkel +ssh-keygen -t ed25519 -C "chris.christiansen@vauco.no" -f ~/.ssh/id_ed25519 -N "" + +# Vis public key — kopier hele linjen +cat ~/.ssh/id_ed25519.pub +``` + +Gå til [github.com/settings/keys](https://github.com/settings/keys) → **New SSH key** +Tittel: `osvauco-dev-vm` → lim inn nøkkelen → **Add SSH key** + +```bash +# Test tilkobling +ssh -T git@github.com +# Forventet: Hi chrischristiansen-glitch! You've successfully authenticated... +``` + +--- + +## Steg 2 — Klon repo og sett opp .env + +```bash +cd ~ +git clone git@github.com:chrischristiansen-glitch/OSVauco.git +cd OSVauco + +# Sett git-identitet +git config --global user.name "Chris Christiansen" +git config --global user.email "chris.christiansen@vauco.no" + +# Opprett .env +cp .env.example .env +nano .env +``` + +**Fyll inn disse to feltene** (resten er ferdigutfylt): + +```bash +export BILLING_ACCOUNT_ID="0171F6-057E6B-A260BA" +# ALERT_EMAIL er allerede satt til chris.christiansen@vauco.no +``` + +--- + +## Steg 3 — Autentiser med din Google-konto + +> ⚠️ **Viktig:** VM-en starter med Compute Engine default service account. +> Du MÅ logge inn som deg selv — ellers feiler alle gcloud-kall. + +```bash +gcloud auth login +# Følg lenken, logg inn som chris.christiansen@vauco.no + +gcloud auth application-default login +# Samme prosess — nødvendig for Vertex AI / ADK + +gcloud config set project propane-will-491900-m5 +gcloud config set compute/region us-central1 +``` + +Verifiser: +```bash +gcloud auth list +# Skal vise: * chris.christiansen@vauco.no +``` + +--- + +## Steg 4 — Kjør bootstrap-scriptet + +```bash +source .env +bash scripts/bootstrap.sh +``` + +Scriptet gjør i rekkefølge: +1. Auth-sjekk +2. Bygg base Docker-image (hvis ikke finnes) +3. Verifiser at Cloud Run-agenten svarer + +--- + +## Steg 5 — Manuell IAM-fix (kun ved nytt prosjekt / ny CI/CD) + +Disse to IAM-bindingene må ligge på plass for at CI/CD skal fungere: + +```bash +# Cloud Build SA kan deploye som osvauco-agent-sa +gcloud iam service-accounts add-iam-policy-binding \ + osvauco-agent-sa@propane-will-491900-m5.iam.gserviceaccount.com \ + --member="serviceAccount:357036551735@cloudbuild.gserviceaccount.com" \ + --role="roles/iam.serviceAccountUser" \ + --project=propane-will-491900-m5 + +# osvauco-agent-sa kan opptre som seg selv +gcloud iam service-accounts add-iam-policy-binding \ + osvauco-agent-sa@propane-will-491900-m5.iam.gserviceaccount.com \ + --member="serviceAccount:osvauco-agent-sa@propane-will-491900-m5.iam.gserviceaccount.com" \ + --role="roles/iam.serviceAccountUser" \ + --project=propane-will-491900-m5 +``` + +--- + +## Hurtigtest — svar fra agenten + +```bash +TOKEN=$(gcloud auth print-identity-token) +curl -s -X POST -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"user_id":"chris","session_id":"test-1","message":"Hei, hvem er du?"}' \ + https://osvauco-agent-357036551735.us-central1.run.app/run | python3 -m json.tool +``` + +Forventet svar: JSON med `"response"` felt fra OPAX-agenten. + +--- + +## Kveld — teardown (OBLIGATORISK) + +```bash +bash infrastructure/03-teardown.sh +``` + +Kjøres hver kveld for å unngå 24/7-fakturering. + +--- + +## Feilsøking + +| Feil | Årsak | Fix | +|------|-------|-----| +| `ACCESS_TOKEN_SCOPE_INSUFFICIENT` | Kjører som Compute SA | `gcloud auth login` | +| `gemini-2.0-flash not found` | Feil modellnavn i Cloud Run | Env-var `ORCHESTRATOR_MODEL=gemini-2.0-flash-001` | +| `osvauco-base:latest not found` | Base-image ikke bygget | `bash scripts/bootstrap.sh` | +| `iam.serviceaccounts.actAs denied` | Mangler IAM-binding | Steg 5 over | +| `git push` krever passord | HTTPS-remote | `git remote set-url origin git@github.com:chrischristiansen-glitch/OSVauco.git` | +| `fetch first` ved push | Remote har nyere commits | `git pull --rebase && git push` | + +--- + +*OSVauco-NMTMD-GCOS | propane-will-491900-m5 | us-central1* diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh new file mode 100644 index 0000000..e07eb92 --- /dev/null +++ b/scripts/bootstrap.sh @@ -0,0 +1,100 @@ +#!/bin/bash +# bootstrap.sh — OSVauco VM bootstrap +# Kjøres på ny VM eller etter serverbytte +# Bruk: source .env && bash scripts/bootstrap.sh + +set -euo pipefail + +PROJECT_ID="${PROJECT_ID:-propane-will-491900-m5}" +REGION="${REGION:-us-central1}" +ARTIFACT_REPO="${ARTIFACT_REPO:-osvauco-repo}" +CLOUD_RUN_SERVICE="${CLOUD_RUN_SERVICE:-osvauco-agent}" +CLOUD_RUN_URL="https://osvauco-agent-357036551735.us-central1.run.app" + +echo "" +echo "╔══════════════════════════════════════════════════╗" +echo "║ OSVauco VM Bootstrap ║" +echo "║ Prosjekt: $PROJECT_ID ║" +echo "╚══════════════════════════════════════════════════╝" +echo "" + +# ── Steg 1: Auth-sjekk ───────────────────────────────────── +echo "[1/4] Auth-sjekk..." +bash infrastructure/00-authcheck.sh + +# ── Steg 2: Sjekk at osvauco-base finnes i Artifact Registry ─ +echo "" +echo "[2/4] Sjekker base Docker-image..." + +BASE_IMAGE="${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REPO}/osvauco-base" + +if gcloud artifacts docker images describe "${BASE_IMAGE}:latest" \ + --project="$PROJECT_ID" >/dev/null 2>&1; then + echo " ✅ osvauco-base:latest finnes — hopper over bygg" +else + echo " ⚠️ osvauco-base:latest mangler — bygger nå (~5-10 min)..." + gcloud builds submit \ + --config=cloudbuild.base.yaml \ + --project="$PROJECT_ID" \ + . + echo " ✅ osvauco-base bygget og pushet" +fi + +# ── Steg 3: Sjekk IAM-bindinger for CI/CD ────────────────── +echo "" +echo "[3/4] Sjekker IAM-bindinger for CI/CD..." + +PROJECT_NUMBER=$(gcloud projects describe "$PROJECT_ID" --format="value(projectNumber)") +CB_SA="${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com" +AGENT_SA="osvauco-agent-sa@${PROJECT_ID}.iam.gserviceaccount.com" + +# Cloud Build SA → iam.serviceAccountUser på agent-SA +gcloud iam service-accounts add-iam-policy-binding "$AGENT_SA" \ + --member="serviceAccount:${CB_SA}" \ + --role="roles/iam.serviceAccountUser" \ + --project="$PROJECT_ID" \ + --quiet 2>/dev/null && echo " ✅ Cloud Build SA har actAs på agent-SA" || echo " ℹ️ Cloud Build SA binding allerede på plass" + +# Agent SA → iam.serviceAccountUser på seg selv +gcloud iam service-accounts add-iam-policy-binding "$AGENT_SA" \ + --member="serviceAccount:${AGENT_SA}" \ + --role="roles/iam.serviceAccountUser" \ + --project="$PROJECT_ID" \ + --quiet 2>/dev/null && echo " ✅ Agent SA har actAs på seg selv" || echo " ℹ️ Self-binding allerede på plass" + +# ── Steg 4: Test at Cloud Run-agenten svarer ─────────────── +echo "" +echo "[4/4] Tester Cloud Run-agenten..." + +TOKEN=$(gcloud auth print-identity-token 2>/dev/null || echo "") + +if [[ -z "$TOKEN" ]]; then + echo " ⚠️ Kan ikke hente identity token — er du logget inn med gcloud auth login?" +else + HTTP_CODE=$(curl -s -o /tmp/osvauco-test.json -w "%{http_code}" \ + -X POST \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"user_id":"bootstrap","session_id":"boot-1","message":"Hei"}' \ + "${CLOUD_RUN_URL}/run") + + if [[ "$HTTP_CODE" == "200" ]]; then + echo " ✅ Agent svarer (HTTP 200)" + cat /tmp/osvauco-test.json | python3 -m json.tool 2>/dev/null | head -5 + else + echo " ⚠️ Agent svarte HTTP $HTTP_CODE" + cat /tmp/osvauco-test.json + echo "" + echo " Vanlige årsaker:" + echo " - gemini-2.0-flash: kjør 'gcloud run services update ...' med ORCHESTRATOR_MODEL=gemini-2.0-flash-001" + echo " - 403: ny revisjon ikke deployet ennå — vent 2 min og prøv igjen" + fi +fi + +echo "" +echo "╔══════════════════════════════════════════════════╗" +echo "║ Bootstrap ferdig! ║" +echo "║ Husk: bash infrastructure/03-teardown.sh ║" +echo "║ ...hver kveld for å unngå 24/7-fakturering ║" +echo "╚══════════════════════════════════════════════════╝" +echo ""