# Adminpanelet — Serveradministrasjon ## Oversikt Sentralt administrasjonspanel for hele Synops-instansen. Tilgjengelig kun for server-admins (Vegard). Dekker alt som ikke er per-samling: AI-konfigurasjon, ressursstyring, systemvarsler og serverhelse. Adminpanelet er en del av SvelteKit-frontenden, bak egen tilgangskontroll (admin-edge til server-noden eller Authentik-gruppe). ## Moduler ### 1. AI Gateway-styring Konfigurasjon av LiteLLM og modellruting. Ref: `docs/infra/ai_gateway.md`. - **Modelloversikt:** Liste over tilgjengelige modeller med status, kostnad per token, latens-snitt - **API-nøkler:** Legg til, rotér og deaktiver nøkler for OpenRouter, Anthropic, Google, xAI osv. Nøkler vises aldri i klartekst etter lagring - **Ruting-regler:** Hvilken modell brukes for hvilken jobbtype (transkripsjonsanalyse, oppsummering, tagging, diktat-cleanup osv.) - **Fallback-kjeder:** Primærmodell → fallback → siste utvei. Per jobbtype - **Forbruksoversikt:** Aggregert ressursforbruk per samling, per jobbtype, per tidsperiode. Dekker AI-tokens, Whisper-tid, TTS-tegn, CAS-lagring, båndbredde og LiveKit-tid. Ref: `docs/features/ressursforbruk.md` - **Prompt Lab-tilgang:** Snarvei til testing av prompts mot faktisk data. Ref: `docs/features/prompt_lab.md` ### 2. Ressursstyring Kontroll over CPU, minne og prioritering av bakgrunnsjobber. - **Jobbkø-oversikt:** Aktive, ventende og feilede jobber. Filtrer på type, samling, status. Manuell retry/avbryt - **Prioritetsregler:** Konfigurer relativ prioritet mellom jobbtyper (f.eks. live transkripsjon > batch-transkripsjon > embedding-generering) - **Ressursgrenser:** Maks samtidige jobber per type, CPU/minne-grenser per worker-container - **Ressurs-governor:** Automatisk nedprioritering av tunge jobber (Whisper, embedding) under aktive LiveKit-sesjoner. Konfigurerbar terskel - **Disk-status:** CAS-lagring, PG-størrelse, mediefiler. Visuell oversikt med varsling ved terskelverdier (ref: pruning-logikk i `docs/retninger/maskinrommet.md`) ### 3. Systemvarsler og vedlikeholdsmodus Varsle brukere om planlagt nedetid, oppdateringer eller hendelser. Kritisk for å unngå avbrudd midt i møter, podcast-opptak eller publisering. #### Varslingsmekanisme - **Sanntidsvarsel via STDB:** Maskinrommet skriver en varslingsnode som frontend abonnerer på. Vises som banner/toast i alle aktive klienter umiddelbart - **Varslingstyper:** - `info` — generell melding (f.eks. "Ny funksjonalitet tilgjengelig") - `warning` — planlagt vedlikehold med nedtelling - `critical` — umiddelbar handling kreves - **Nedtelling:** Admin setter tidspunkt for vedlikehold. Frontend viser nedtelling: "Serveren restartes om 15 minutter" - **Aktive sesjoner-sjekk:** Før vedlikehold, vis oversikt over pågående aktivitet: - Aktive LiveKit-rom (møter, opptak) - Brukere med ulagrede endringer (collaboration-sesjoner) - Pågående jobbkø-jobber - **Graceful shutdown-sekvens:** 1. Varsel sendes X minutter i forveien (konfigurerbart, default 15 min) 2. Nye LiveKit-rom blokkeres etter varsling 3. Påminnelse ved T-5 min og T-1 min 4. Jobbkøen stopper å plukke nye jobber 5. Vent til aktive jobber fullføres (med timeout) 6. Restart #### Implementert (oppgave 15.2) - **Backend:** `maskinrommet/src/maintenance.rs` — `MaintenanceState` med atomiske flagg og bakgrunns-shutdown-koordinator - **API-endepunkter:** - `POST /intentions/initiate_maintenance` — starter nedtelling med tidspunkt - `POST /intentions/cancel_maintenance` — avbryter planlagt vedlikehold - `GET /admin/maintenance_status` — viser status + kjørende jobber - **Frontend:** `/admin` — vedlikeholdspanel med statusvisning, aktive sesjoner og initier/avbryt-knapper - **Jobbkø:** `jobs.rs` sjekker `maintenance.is_active()` før dequeue - **LiveKit:** `join_communication` blokkerer nye tokens under vedlikehold - **Shutdown-flyt:** Vent til `scheduled_at` → sett `active` → vent på jobber (5 min timeout) → `process::exit(0)` → systemd restarter #### Varslingsnode ```jsonc { "node_kind": "system_announcement", "title": "Planlagt vedlikehold", "content": "Serveren oppdateres kl. 22:00. Forventet nedetid: 10 minutter.", "metadata": { "announcement_type": "warning", "scheduled_at": "2026-03-17T22:00:00Z", "expires_at": "2026-03-17T22:30:00Z", "blocks_new_sessions": true } } ``` Vises for alle med `visibility: open`. Forsvinner automatisk etter `expires_at`. ### 4. Serverhelse Sanntidsoversikt over systemtilstand. - **Tjeneste-status:** PG, STDB, Caddy, Authentik, LiteLLM, Whisper, LiveKit — oppe/nede/degradert - **Metrikker:** CPU, minne, disk, nettverkstrafikk - **PG-helse:** Tilkoblingspool, aktive spørringer, replikerings-lag (fremtidig) - **STDB-helse:** Minnebruk, antall abonnenter, graf-størrelse - **Logg-tilgang:** Siste feil og advarsler fra alle tjenester, filtrerbart - **Backup-status:** Siste vellykkede backup per type, neste planlagte kjøring ### 5. Bruker- og tilgangsoversikt - **Aktive brukere:** Hvem er pålogget nå, siste aktivitet - **Authentik-integrasjon:** Snarvei til Authentik admin for brukerhåndtering - **Samlingsoversikt:** Alle samlinger med eier, traits, størrelse, aktivitetsnivå ## Tilgang Adminpanelet er *ikke* en trait — det er en plattformfunksjon som eksisterer utenfor samlings-modellen. Tilgang styres via: - Authentik-gruppe `synops-admin` - Eller `admin`-edge til en dedikert server-node Vanlige brukere ser aldri adminpanelet. Ruten er skjult og tilgangskontrollert server-side. ## Implementeringsstrategi Adminpanelet bygges inkrementelt. Første prioritet er det som trengs for daglig drift: 1. **Systemvarsler** — kritisk for å unngå avbrudd 2. **Jobbkø-oversikt** — nødvendig for feilsøking 3. **AI Gateway-konfigurasjon** — nødvendig når AI-features aktiveres 4. **Serverhelse** — nyttig men ikke blokkerende 5. **Ressursstyring** — optimalisering, kan vente