4.7 KiB
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 somnoegle. /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 haveclient_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.mp3ved 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>). 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 ogRP_API_KEYmangler.- Skal være installeret hvor portalen kører:
bash,curl,jq,openssl,ffmpeg(apt install jqm.fl.) og værktøjsfilerne itools_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
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.
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.