docs: legg til VM-BOOTSTRAP guide og bootstrap.sh script

This commit is contained in:
chrischristiansen-glitch 2026-05-25 20:55:08 +02:00
parent 8038c1d805
commit f781a991da
2 changed files with 263 additions and 0 deletions

163
docs/VM-BOOTSTRAP.md Normal file
View File

@ -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*

100
scripts/bootstrap.sh Normal file
View File

@ -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 ""