Oppdater driftsmodell: hybrid native + Docker

Dokumenterer gjeldende modell der egenutviklet kode (maskinrommet,
SvelteKit) kjører native via systemd, mens tredjepartstjenester
(PG, STDB, Authentik, Caddy, Whisper, LiteLLM) kjører i Docker.

- CLAUDE.md: ny driftsmodell-tabell, Claude-agent-seksjon
- docs/arkitektur.md: teknologivalg med kjøremodus-kolonne
- docs/setup/produksjon.md: maskinrommet native instruksjoner

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
vegard 2026-03-17 19:27:29 +00:00
parent 1dd48317af
commit ab91e5396d
3 changed files with 80 additions and 32 deletions

View file

@ -73,18 +73,45 @@ CLAUDE.md er eneste startdokument. Alt annet ligger under `docs/`:
- **Database/Graf:** PostgreSQL (+Apache AGE ved behov) - **Database/Graf:** PostgreSQL (+Apache AGE ved behov)
- **Binærlagring:** CAS (content-addressable store) - **Binærlagring:** CAS (content-addressable store)
- **AI:** Claude Code (chat-agent), LiteLLM (AI Gateway), faster-whisper (STT) - **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 ## Driftsmodell: hybrid native + Docker
- **Maskinrommet** kjører direkte på hosten som systemd-tjeneste (`maskinrommet.service`), Egenutviklet kode kjører **native på hosten** (systemd). Tredjepartstjenester
ikke i Docker. Dette gir tilgang til `claude` CLI for agent-chat. kjører i **Docker**. Prinsipp: Docker for det vi ikke bygger selv, native
Bygges med `cargo build --release`, startes med `sudo systemctl restart maskinrommet`. for det vi har full kontroll over.
- **Øvrige tjenester** (PG, STDB, Caddy, Authentik, Whisper, LiteLLM) kjører i Docker.
- **Caddy** bruker `host.docker.internal` for å nå maskinrommet på hosten. ### Native (systemd)
- **Claude som chat-deltaker:** Agent-node (`d3eebc99-...-a44`) i grafen. Legg Claude | Tjeneste | Beskrivelse | Deploy |
til som `member_of` i en kommunikasjonsnode → alle meldinger trigger `agent_respond`-jobb |----------|-------------|--------|
→ maskinrommet kaller `claude -p` → svar skrives tilbake i chatten. | **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'` - **Kill switch:** `UPDATE agent_identities SET is_active = false WHERE agent_key = 'claude-main'`
- **Detaljer:** Se `docs/infra/claude_agent.md`
## Produksjonsserver ## Produksjonsserver
- **IP:** 157.180.81.26 - **IP:** 157.180.81.26

View file

@ -150,21 +150,35 @@ Binærdata (lyd, bilde, video) lagret med hash. TTL basert på
modalitet, edges og aksesslog. Generert innhold (TTS, thumbnails) modalitet, edges og aksesslog. Generert innhold (TTS, thumbnails)
er en cache som regenereres on-demand. 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 ## Teknologivalg
| Rolle | Teknologi | Begrunnelse | | Rolle | Teknologi | Kjøremodus | Begrunnelse |
|-------|-----------|-------------| |-------|-----------|------------|-------------|
| Orkestrator | Rust | Ytelse, typesikkerhet, eier alle skrivinger | | Orkestrator | Rust | Native (systemd) | Ytelse, typesikkerhet, eier alle skrivinger, trenger host-tilgang |
| Frontend | SvelteKit | PWA, SSR, tynt lag mot STDB | | Frontend | SvelteKit | Native (systemd) | PWA, SSR, tynt lag mot STDB |
| Database | PostgreSQL | Persistent backup, pgvector, fulltekstsøk, AGE | | Database | PostgreSQL | Docker | Versjonsstyring, enkel oppgradering |
| Sanntid | SpacetimeDB | Hele grafen, WebSocket-subscriptions, ~10μs | | Sanntid | SpacetimeDB | Docker | Eksperimentelt, offisielt image |
| Binærlagring | CAS (filsystem) | Enkel, deduplisering, ingen ekstern avhengighet | | Binærlagring | CAS (filsystem) | Native | Enkel, deduplisering, ingen ekstern avhengighet |
| AI Gateway | LiteLLM | Multi-provider, BYOK, OpenRouter fallback | | AI Gateway | LiteLLM | Docker | Ferdig image, sjelden oppdatering |
| STT | faster-whisper | Lokal, god norsk kvalitet | | AI Agent | Claude Code CLI | Native | Chat-deltaker, spawnes av maskinrommet |
| TTS | ElevenLabs (→ lokal) | Kommersiell start, lokal når kvaliteten holder | | STT | faster-whisper | Docker | Modellhåndtering, ferdig image |
| Auth | Authentik | SSO, OIDC, self-hosted | | TTS | ElevenLabs (→ lokal) | — | Kommersiell start, lokal når kvaliteten holder |
| Reverse proxy | Caddy | Auto-TLS, enkel config | | Auth | Authentik | Docker | Kompleks stack (server + worker + Redis) |
| Lyd/video | LiveKit | WebRTC, self-hosted | | Reverse proxy | Caddy | Docker | Auto-TLS, kan tas native senere |
| Lyd/video | LiveKit | Docker | WebRTC, self-hosted |
## Traits — samlingsnoder med evner ## Traits — samlingsnoder med evner

View file

@ -437,20 +437,27 @@ docker compose up -d <tjeneste>
### Maskinrommet (Rust API) ### Maskinrommet (Rust API)
Maskinrommet bygges som Docker-image fra `maskinrommet/Dockerfile` og kjører Maskinrommet kjører **native på hosten** som systemd-tjeneste (ikke i Docker).
som service i docker-compose. Imaget bygges på serveren (ikke registry): Dette gir tilgang til `claude` CLI for agent-chat og hele hostens verktøy.
```bash ```bash
# Bygg image # Bygg
cd /home/vegard/synops/maskinrommet && docker build -t maskinrommet:latest . cd /home/vegard/synops/maskinrommet && cargo build --release
# Start/restart service # Start/restart
cd /srv/synops && docker compose up -d maskinrommet sudo systemctl restart maskinrommet
# Logger
sudo journalctl -u maskinrommet -f
``` ```
Maskinrommet kobler til PG og SpacetimeDB via Docker-nettverket `sidelinja-net` Env-filen (`/tmp/maskinrommet.env`) genereres automatisk av
(hostname `postgres` og `spacetimedb`). Ved oppstart laster den hele grafen `scripts/maskinrommet-env.sh` med Docker container-IPs for PG og STDB.
fra PG inn i STDB (warmup). Caddy proxyer `api.sidelinja.org` til port 3100. 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 ## 13. Verifisering etter oppsett