diff --git a/CLAUDE.md b/CLAUDE.md index 7d6c4cb..06669e2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -73,18 +73,45 @@ CLAUDE.md er eneste startdokument. Alt annet ligger under `docs/`: - **Database/Graf:** PostgreSQL (+Apache AGE ved behov) - **Binærlagring:** CAS (content-addressable store) - **AI:** Claude Code (chat-agent), LiteLLM (AI Gateway), faster-whisper (STT) -- **Infra:** Docker Compose, Caddy, Authentik (SSO), systemd +- **Infra:** Docker (tredjepart), systemd (egenutviklet), Caddy, Authentik (SSO) -## Driftsmodell -- **Maskinrommet** kjører direkte på hosten som systemd-tjeneste (`maskinrommet.service`), - ikke i Docker. Dette gir tilgang til `claude` CLI for agent-chat. - Bygges med `cargo build --release`, startes med `sudo systemctl restart maskinrommet`. -- **Øvrige tjenester** (PG, STDB, Caddy, Authentik, Whisper, LiteLLM) kjører i Docker. -- **Caddy** bruker `host.docker.internal` for å nå maskinrommet på hosten. -- **Claude som chat-deltaker:** Agent-node (`d3eebc99-...-a44`) i grafen. Legg Claude - til som `member_of` i en kommunikasjonsnode → alle meldinger trigger `agent_respond`-jobb - → maskinrommet kaller `claude -p` → svar skrives tilbake i chatten. +## Driftsmodell: hybrid native + Docker +Egenutviklet kode kjører **native på hosten** (systemd). Tredjepartstjenester +kjører i **Docker**. Prinsipp: Docker for det vi ikke bygger selv, native +for det vi har full kontroll over. + +### Native (systemd) +| Tjeneste | Beskrivelse | Deploy | +|----------|-------------|--------| +| **maskinrommet** | Rust API + jobbkø | `cargo build --release` → `sudo systemctl restart maskinrommet` | +| **SvelteKit** | Frontend (når klar) | `npm run build` → systemd | + +Maskinrommet kjører native fordi det trenger tilgang til `claude` CLI +og hele hosten. Env-filen genereres dynamisk av `scripts/maskinrommet-env.sh` +med Docker container-IPs. + +### Docker (docker-compose) +| Tjeneste | Begrunnelse | +|----------|-------------| +| **PostgreSQL** | Versjonsstyring, enkel oppgradering | +| **SpacetimeDB** | Eksperimentelt, offisielt image | +| **Authentik** | Kompleks stack (server + worker + Redis) | +| **Caddy** | Enkel TLS-terminering, kan tas native senere | +| **LiteLLM** | Ferdig image, sjelden oppdatering | +| **faster-whisper** | Modellhåndtering, ferdig image | + +### Kommunikasjon mellom lagene +- Caddy (Docker) → maskinrommet (host): via `host.docker.internal:3100` + (`extra_hosts: host-gateway` i docker-compose + iptables-regel) +- Maskinrommet (host) → Docker-tjenester: via container-IP + (løses dynamisk i `maskinrommet-env.sh`) + +## Claude som chat-deltaker +- **Agent-node:** `d3eebc99-9c0b-4ef8-bb6d-6bb9bd380a44` (node_kind: `agent`) +- **Trigger:** Melding i kommunikasjonsnode der Claude er `member_of` + → `agent_respond`-jobb → `claude -p` → svar tilbake i chatten - **Kill switch:** `UPDATE agent_identities SET is_active = false WHERE agent_key = 'claude-main'` +- **Detaljer:** Se `docs/infra/claude_agent.md` ## Produksjonsserver - **IP:** 157.180.81.26 diff --git a/docs/arkitektur.md b/docs/arkitektur.md index 52d5570..2c00886 100644 --- a/docs/arkitektur.md +++ b/docs/arkitektur.md @@ -150,21 +150,35 @@ Binærdata (lyd, bilde, video) lagret med hash. TTL basert på modalitet, edges og aksesslog. Generert innhold (TTS, thumbnails) er en cache som regenereres on-demand. +## Driftsmodell: hybrid native + Docker + +Egenutviklet kode kjører **native på hosten** via systemd. +Tredjepartstjenester kjører i **Docker**. Prinsipp: Docker for det vi +ikke bygger selv, native for det vi har full kontroll over. + +**Native (systemd):** maskinrommet (Rust), SvelteKit (når klar). +**Docker:** PostgreSQL, SpacetimeDB, Authentik, Caddy, LiteLLM, faster-whisper. + +Maskinrommet kjører native fordi det trenger tilgang til `claude` CLI +og hele vertsmaskinens verktøy. Caddy (Docker) når maskinrommet via +`host.docker.internal`. + ## Teknologivalg -| Rolle | Teknologi | Begrunnelse | -|-------|-----------|-------------| -| Orkestrator | Rust | Ytelse, typesikkerhet, eier alle skrivinger | -| Frontend | SvelteKit | PWA, SSR, tynt lag mot STDB | -| Database | PostgreSQL | Persistent backup, pgvector, fulltekstsøk, AGE | -| Sanntid | SpacetimeDB | Hele grafen, WebSocket-subscriptions, ~10μs | -| Binærlagring | CAS (filsystem) | Enkel, deduplisering, ingen ekstern avhengighet | -| AI Gateway | LiteLLM | Multi-provider, BYOK, OpenRouter fallback | -| STT | faster-whisper | Lokal, god norsk kvalitet | -| TTS | ElevenLabs (→ lokal) | Kommersiell start, lokal når kvaliteten holder | -| Auth | Authentik | SSO, OIDC, self-hosted | -| Reverse proxy | Caddy | Auto-TLS, enkel config | -| Lyd/video | LiveKit | WebRTC, self-hosted | +| Rolle | Teknologi | Kjøremodus | Begrunnelse | +|-------|-----------|------------|-------------| +| Orkestrator | Rust | Native (systemd) | Ytelse, typesikkerhet, eier alle skrivinger, trenger host-tilgang | +| Frontend | SvelteKit | Native (systemd) | PWA, SSR, tynt lag mot STDB | +| Database | PostgreSQL | Docker | Versjonsstyring, enkel oppgradering | +| Sanntid | SpacetimeDB | Docker | Eksperimentelt, offisielt image | +| Binærlagring | CAS (filsystem) | Native | Enkel, deduplisering, ingen ekstern avhengighet | +| AI Gateway | LiteLLM | Docker | Ferdig image, sjelden oppdatering | +| AI Agent | Claude Code CLI | Native | Chat-deltaker, spawnes av maskinrommet | +| STT | faster-whisper | Docker | Modellhåndtering, ferdig image | +| TTS | ElevenLabs (→ lokal) | — | Kommersiell start, lokal når kvaliteten holder | +| Auth | Authentik | Docker | Kompleks stack (server + worker + Redis) | +| Reverse proxy | Caddy | Docker | Auto-TLS, kan tas native senere | +| Lyd/video | LiveKit | Docker | WebRTC, self-hosted | ## Traits — samlingsnoder med evner diff --git a/docs/setup/produksjon.md b/docs/setup/produksjon.md index 6f3eadd..2faae8c 100644 --- a/docs/setup/produksjon.md +++ b/docs/setup/produksjon.md @@ -437,20 +437,27 @@ docker compose up -d ### Maskinrommet (Rust API) -Maskinrommet bygges som Docker-image fra `maskinrommet/Dockerfile` og kjører -som service i docker-compose. Imaget bygges på serveren (ikke registry): +Maskinrommet kjører **native på hosten** som systemd-tjeneste (ikke i Docker). +Dette gir tilgang til `claude` CLI for agent-chat og hele hostens verktøy. ```bash -# Bygg image -cd /home/vegard/synops/maskinrommet && docker build -t maskinrommet:latest . +# Bygg +cd /home/vegard/synops/maskinrommet && cargo build --release -# Start/restart service -cd /srv/synops && docker compose up -d maskinrommet +# Start/restart +sudo systemctl restart maskinrommet + +# Logger +sudo journalctl -u maskinrommet -f ``` -Maskinrommet kobler til PG og SpacetimeDB via Docker-nettverket `sidelinja-net` -(hostname `postgres` og `spacetimedb`). Ved oppstart laster den hele grafen -fra PG inn i STDB (warmup). Caddy proxyer `api.sidelinja.org` til port 3100. +Env-filen (`/tmp/maskinrommet.env`) genereres automatisk av +`scripts/maskinrommet-env.sh` med Docker container-IPs for PG og STDB. +Ved oppstart laster maskinrommet hele grafen fra PG inn i STDB (warmup). +Caddy (Docker) proxyer `api.sidelinja.org` til `host.docker.internal:3100`. + +Dockerfile (`maskinrommet/Dockerfile`) beholdes for referanse, men brukes +ikke i produksjon. ## 13. Verifisering etter oppsett