Les konfigurasjon fra config.toml, med env-overstyring
Alt som gjorde appen «Sauda Gathering» – tittel, undertittel, aksentfarge, hurtigfraser – var hardkodet i index.html. Dette legger grunnlaget for å flytte det ut, så samme kode kan brukes på et annet arrangement uten å redigere HTML. Tre lag, siste vinner: DEFAULTS -> config.toml -> ANNOUNCER_* config.toml er valgfri. Uten den gjelder DEFAULTS, som er dagens oppførsel bit for bit. Det er et krav, ikke en forglemmelse: tjenesten skal kunne settes opp på en kveld uten at noe må konfigureres først. Hemmeligheter hører i env-laget, så de kan stå i systemd-enheten istedenfor i en fil i repoet. config.toml er gitignorert; config.example.toml er malen. Egen modul og ikke en del av announcer.py fordi auth-koden som kommer trenger den også, og det ville blitt en import-sirkel. Ingenting bruker den ennå – det skjer i neste commit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
f191fb2b90
commit
87066bb8c2
3 changed files with 402 additions and 0 deletions
123
config.example.toml
Normal file
123
config.example.toml
Normal file
|
|
@ -0,0 +1,123 @@
|
|||
# Kopier til config.toml og endre det du vil ha annerledes. Alt er valgfritt:
|
||||
# uten fila kjører appen med standardverdiene nedenfor, uten innlogging.
|
||||
#
|
||||
# cp config.example.toml config.toml
|
||||
#
|
||||
# Hver nøkkel kan overstyres av en miljøvariabel, se tabellen i AGENTS.md.
|
||||
# Hemmeligheter bør settes slik istedenfor å stå her, f.eks. i systemd-enheten:
|
||||
# Environment=ANNOUNCER_JWT_SECRET=...
|
||||
# config.toml er i .gitignore.
|
||||
|
||||
[app]
|
||||
title = "Announcer"
|
||||
subtitle = "Skriv meldingen, forhåndslytt, og send den ut på anlegget."
|
||||
accent = "#4fd1c5"
|
||||
idle_text = "Stille · ingenting i kø"
|
||||
message_placeholder = "Skriv meldingen som skal leses opp …"
|
||||
max_chars = 600
|
||||
default_voice = "finn"
|
||||
default_chime = "dingdong"
|
||||
|
||||
# Knapper over tekstfeltet. Tom liste = ingen knapper.
|
||||
quick_phrases = [
|
||||
"Pizzaen er kommet. Hent i kantina!",
|
||||
"Turneringen starter om ti minutter.",
|
||||
"Husk å rydde rundt plassen din. Takk!",
|
||||
]
|
||||
|
||||
[server]
|
||||
host = "0.0.0.0"
|
||||
port = 8090
|
||||
# Slå på bare når appen står bak HTTPS. Setter Secure på sesjonscookien; på
|
||||
# rå HTTP ville ingen klart å logge inn med den på.
|
||||
behind_tls = false
|
||||
# Trengs bare bak en omvendt proxy, for at OIDC-redirect skal peke riktig.
|
||||
# public_url = "https://announcer.example.no"
|
||||
# Tom = nøkkel genereres én gang og lagres i instance/secret_key.
|
||||
# secret_key = ""
|
||||
|
||||
[paths]
|
||||
# Kommenter inn hvis noe skal ligge et annet sted enn ved siden av koden.
|
||||
# voices = "voices"
|
||||
# cache = "cache"
|
||||
# chimes = "chimes"
|
||||
# log = "logs/announcements.jsonl"
|
||||
# state = "instance"
|
||||
|
||||
[audio]
|
||||
# pw-play --target / paplay --device. Tom = systemets standardutgang.
|
||||
# Finn navnet med: pactl list short sinks
|
||||
sink = ""
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Innlogging
|
||||
# --------------------------------------------------------------------------
|
||||
# Tom liste her og ingen av blokkene under utfylt = alt er åpent. Det er
|
||||
# standarden, og helt greit på et lukket nett.
|
||||
#
|
||||
# En metode er aktiv når den står i providers *eller* når den er ferdig
|
||||
# konfigurert nedenfor. Derfor holder det å sette en PIN for å slå på PIN.
|
||||
# Rekkefølgen her bestemmer hvilken som prøves først.
|
||||
|
||||
[auth]
|
||||
providers = []
|
||||
# providers = ["oidc", "jwt", "pin"]
|
||||
|
||||
# --- PIN: én delt kode. Virker uten nett, så den er verdt å ha i reserve. ---
|
||||
[auth.pin]
|
||||
pin = ""
|
||||
role = "admin"
|
||||
label = "PIN"
|
||||
hint = "Spør vaktleder"
|
||||
|
||||
# --- JWT: crew-panelet signerer et token. Se docs/crew-integration.md. -----
|
||||
[auth.jwt]
|
||||
issuer = "https://crew.example.no"
|
||||
audience = "announcer"
|
||||
# Ett av disse to. Delt hemmelighet er enklest; JWKS er bedre fordi
|
||||
# announcer da aldri ser en nøkkel som kan lage tokens.
|
||||
# secret = "sett-via-ANNOUNCER_JWT_SECRET"
|
||||
# jwks_url = "https://crew.example.no/.well-known/jwks.json"
|
||||
# Tom = HS256 med secret, RS256/ES256 med jwks_url.
|
||||
algorithms = []
|
||||
# Hvor rollene står i tokenet. Punktum for nestet, f.eks. "realm_access.roles".
|
||||
role_claim = "roles"
|
||||
# Hvilken rolle alle med gyldig token får hvis tokenet ikke sier noe.
|
||||
default_role = ""
|
||||
# Hvor lenge sesjonen fra /auth/token varer, hvis tokenet ikke har kortere exp.
|
||||
session_seconds = 43200
|
||||
# Slingringsmonn på exp/nbf i sekunder, for klokker som ikke står helt likt.
|
||||
# En maskin på et arrangement har ikke alltid NTP i orden.
|
||||
leeway = 30
|
||||
|
||||
# --- OIDC: vanlig innlogging i nettleseren, autorisasjonskode med PKCE. ----
|
||||
[auth.oidc]
|
||||
issuer = "https://crew.example.no"
|
||||
client_id = ""
|
||||
# client_secret = "sett-via-ANNOUNCER_OIDC_CLIENT_SECRET"
|
||||
scopes = ["openid", "profile", "email"]
|
||||
role_claim = "roles"
|
||||
default_role = ""
|
||||
label = "Logg inn med crew-kontoen"
|
||||
# Bare hvis panelet mangler .well-known/openid-configuration:
|
||||
# authorization_endpoint = "https://crew.example.no/oauth/authorize"
|
||||
# token_endpoint = "https://crew.example.no/oauth/token"
|
||||
# jwks_url = "https://crew.example.no/.well-known/jwks.json"
|
||||
# end_session_endpoint = "https://crew.example.no/logout"
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Roller
|
||||
# --------------------------------------------------------------------------
|
||||
# Rollenavnene kommer fra tokenet (role_claim). Handlinger:
|
||||
# view se køen og hva som spilles nå
|
||||
# preview forhåndslytte (synteser lyd)
|
||||
# announce sende ut på anlegget
|
||||
# stop stoppe det som spilles
|
||||
# clear tømme køen
|
||||
# "*" betyr alt.
|
||||
|
||||
[roles]
|
||||
# Alle som ikke er innlogget. ["view"] er nyttig for en statusskjerm på veggen.
|
||||
anonymous = []
|
||||
crew = ["view", "preview", "announce"]
|
||||
admin = ["*"]
|
||||
Loading…
Add table
Add a link
Reference in a new issue