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.

S
Description
Basal front for weircon.dk, mine hosted services. Gemt bag authentik SSO som kun viser hvad man har adgang til jf. Authentik. Samt et administrator panel, som viser pending opdateringer af de opensource services der hostes, basal bruger administration mv.
https://weircon.dk
Readme
1.1 MiB
Languages
Python 61.5%
HTML 36%
CSS 2.2%
Shell 0.3%