# weircon-front Forside og admin-portal for **weircon.dk** — et selv-hostet homelab. FastAPI-app der: - **Logger ind via Authentik (OIDC)** og viser de tjenester brugeren har adgang til (hentet fra Authentiks app-liste pr. bruger), grupperet efter app-gruppe. - **Favoritter + visnings-toggle** (grupperet/alfabetisk), gemt server-side pr. bruger. - **⌘K kommandopalette** til hurtig søgning/navigation. - **Lys/mørkt tema** (ført videre fra asger.weirsoe.dk). - **Admin** (kun for medlemmer af `ADMIN_GROUP`), udvidbare moduler: - IP -> label & land (skrives til NPMplus ip_labels.json) - Cookie-tekster - Matomo-statistik - App-beskrivelser & grupper (skriver tilbage til Authentik) ## Erindringer (interview + dagbog) `/erindringer`: familien fortæller minder til en AI-interviewer. Claude (Anthropic Messages API, `ANTHROPIC_API_KEY`, model `ERINDRINGER_MODEL`) stiller ét spørgsmål ad gangen og følger op på det sidste svar; spørgsmålet læses op af ElevenLabs (`ELEVEN_API_KEY`, stemme `ERINDRINGER_VOICE`, cachet pr. tekst), svaret optages i browseren (MediaRecorder, webm/mp4), konverteres med ffmpeg til mp3 og transskriberes (ElevenLabs STT). Alt gemmes pr. person under `PORTAL_DATA/erindringer/` (persondata, aldrig i git). - Indloggede i familiegrupperne har altid emnet "Dagbog"; admin inviterer til andre emner. - Gæster uden login får et hemmeligt link `/erindringer/g//`, lavet i `/admin/erindringer` (kan lukkes og fornys). Nøglen sendes med i API-kald som `noegle`. - `/admin/erindringer`: emner (titel, beskrivelse, baggrund til intervieweren, startspørgsmål), personer, klip med afspiller og transskription, favoritter, zip-eksport til podcast-produktion. - Edge: gæstelink, `/erindringer/api/`, `/erindringer/tts/` og `/erindringer/klip/` skal uden om bot-udfordringen og have `client_max_body_size 50m` (lange lydsvar). - Flow: optagelsen sendes op som kladde i samme øjeblik man stopper (afskriften kører i baggrunden, mens man lytter), "Send svaret" bekræfter kun, og næste spørgsmål (tekst + oplæsning) forberedes i baggrunden, så det kommer med det samme. Dagbogen føres én dag ad gangen (samtale = datoen). Spørgsmålets oplæsning gemmes som `-sp.mp3` ved siden af svaret; "Spørgsmål og svar" afspiller begge. - Uden nøgler virker siden stadig: intervieweren bruger emnets startspørgsmål, og svar gemmes uden transskription. Røgtest uden OIDC: `PORTAL_DATA=/tmp/x python tests/erindringer_smoke.py` (kalder de rigtige API'er, koster lidt credits). ## E-bog / lydbog (`/e-pub`) Ét felt: indsæt et link, få en `.epub` eller `.m4b` at hente. Selve arbejdet laves af medfølgende kommandolinjeværktøjer (`fetch.sh`, `run.sh`, `run-audiobook.sh`, `lib.sh`), som portalen kører i en frisk mappe pr. job (under `EPUB_SCRATCH`, standard `PORTAL_DATA/e-pub-scratch`) med et minimalt env (`PATH`, `TMP`, `RP_API_KEY`, `RP_BASE_URL`, `RP_REQUIRED`). stderr vises live (siden poller `/e-pub/status/`). En færdig fil kan hentes én gang og slettes ellers efter `output_ttl_seconds`; jobs lever i hukommelsen, så en genstart/udrulning afbryder igangværende jobs, og scratch-mappen ryddes ved opstart. - Adgang: admins, plus medlemmer af den Authentik-gruppe der står i `allowed_group` (tom = kun admins). - `/admin/epub`: adgangsgruppe, samtidige jobs, timeout, TTL, værktøjsmappe, "proxy påkrævet". Siden viser også, om værktøjer, programmer og `RP_API_KEY` mangler. - **Skal være installeret hvor portalen kører:** `bash`, `curl`, `jq`, `openssl`, `ffmpeg` (`apt install jq` m.fl.) og værktøjsfilerne i `tools_dir` (standard `/opt/portal/tools/e-pub`, uden for appmappen/git, læsbare for brugeren portalen kører som). - Plads: et job kan give op til ~300 MB (plus midlertidige filer), gange antal samtidige jobs. - Test uden OIDC og med et stub-værktøj: `python tests/epub_uvicorn.py`. ## Kør ```bash python3 -m venv /opt/portal/venv /opt/portal/venv/bin/pip install -r requirements.txt cp deploy/portal.env.example /etc/portal.env # udfyld secrets cp deploy/portal.service /etc/systemd/system/ systemctl enable --now portal ``` ## Udrulning Et `v*`-tag udruller: `.gitea/workflows/cd.yml` logger ind som deploy-brugeren (repo-variablerne `DEPLOY_HOST`/`DEPLOY_USER`, secrets `DEPLOY_SSH_KEY`/`DEPLOY_KNOWN_HOSTS`) og kører `deploy/deploy.sh` fra tagget. Appmappen i drift er en git-checkout; afviger den fra git, afbrydes udrulningen, og svarer `/healthz` ikke efter genstart, rulles der tilbage. Ret aldrig filer direkte i drift. ```bash git tag v1.2.3 && git push origin v1.2.3 ``` Appen kører bag NPMplus (TLS + proxy) paa weircon.dk. Tilfoej nye admin-moduler i `ADMIN_MODULES` + en route + en template der extender `base.html`.