Files
weircon-front/README.md
T

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

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.