docs: legg til VM-BOOTSTRAP guide og bootstrap.sh script
This commit is contained in:
parent
8038c1d805
commit
f781a991da
163
docs/VM-BOOTSTRAP.md
Normal file
163
docs/VM-BOOTSTRAP.md
Normal 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
100
scripts/bootstrap.sh
Normal 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 ""
|
||||
Loading…
Reference in New Issue
Block a user