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

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)
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

View file

@ -437,20 +437,27 @@ docker compose up -d <tjeneste>
### 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