Files

87 lines
4.9 KiB
Markdown

# 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/<nøgle>/`, 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 `<id>-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/<id>`). Færdige `.epub` lægges automatisk i CWA's indbakke og `.m4b` i
Audiobookshelf (`Forfatter/Titel/`), når `auto_send` er slået til; ellers med en knap. Hvert job har en
`job.json` i sin mappe, så færdige filer overlever en genstart (jobs der var i gang, markeres som
afbrudt). Fil og job slettes `output_ttl_seconds` (standard et døgn) efter jobbet sluttede, eller filen
straks efter én download.
- 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`.