Doku ergänzt
This commit is contained in:
47
README.md
47
README.md
@@ -17,6 +17,8 @@ Browserbasiertes Digital-Signage-System für interne Info-Screens.
|
||||
- **Custom-URL-Button**: pro Screen konfigurierbarer Aktions-Button mit frei wählbarer Position (9 Positionen) im Player (öffnet URL in iframe-Overlay mit Zurück-Button oder per Direkt-Weiterleitung)
|
||||
- **Digital Voice Agent**: global konfigurierbarer Voice-Agent-Button pro Screen (9 Positionen, iframe-Overlay mit positionsgetreuem Zurück-Button, Typewriter-Tagline mit mehrsprachigen Wechseltexten, optionales Bild über dem Button)
|
||||
- **Stay-on-First**: Screen kann auf erstem Playlist-Element stehen bleiben (kein automatischer Refresh)
|
||||
- **User-Verwaltung**: Mehrere User mit Rollen (Admin / Superuser / User), E-Mail als Login, Passwort-Hashing (scrypt), Berechtigungen pro Standort
|
||||
- **Passwort-Workflow**: First-Login-Änderung, Admin-Reset mit temporärem Passwort, Notfall-Login bei fehlendem Hash
|
||||
- Tab-basierte Admin-UI pro Screen: Playlist, Einstellungen, Aktionen, Digital Voice Agent, Medien (Tabler Tabs)
|
||||
- Priority-Seite ebenfalls mit Tabs: Playlist und Medien
|
||||
- Dark Mode (localStorage-persistiert)
|
||||
@@ -35,6 +37,7 @@ Flask App (Server)
|
||||
├── Player UI /player/<site>/<screen>
|
||||
├── Priority-Seite /admin/<site>/priority
|
||||
├── config.json
|
||||
├── users.json
|
||||
├── media/
|
||||
│ ├── <site>/
|
||||
│ │ ├── <screen>/
|
||||
@@ -59,6 +62,7 @@ signage/
|
||||
├── app.py # Flask-App (alle Routen)
|
||||
├── generate_welcome_page.py # Logo-Suche + Willkommensseite-Generierung
|
||||
├── config.json # Persistente Konfiguration
|
||||
├── users.json # User-Datenbank (gehashte Passwörter)
|
||||
├── media/
|
||||
│ ├── <site>/
|
||||
│ │ ├── lobby/
|
||||
@@ -71,6 +75,10 @@ signage/
|
||||
│ ├── customer.html # Willkommensseite-Formular
|
||||
│ ├── player.html # Player-Ansicht
|
||||
│ ├── login.html
|
||||
│ ├── change_password.html # Passwort ändern (First-Login / Reset)
|
||||
│ ├── user_list.html # User-Liste (Admin)
|
||||
│ ├── user_create.html # User anlegen (Admin)
|
||||
│ ├── user_edit.html # User bearbeiten (Admin)
|
||||
│ ├── _header.html # Gemeinsamer Header
|
||||
│ ├── _footer.html # Gemeinsamer Footer
|
||||
│ └── _styles.html # Zentrale CSS (Variablen, Dark Mode)
|
||||
@@ -140,6 +148,14 @@ docker compose up -d
|
||||
| `GET /playlist/<site>/<screen>/hash` | Playlist-Checksumme (für Auto-Reload) |
|
||||
| `GET /willkommen?site=<site>` | Willkommensseite-Formular (GET + POST) |
|
||||
| `POST /api/customer` | API-Endpunkt für Willkommensseite (JSON) |
|
||||
| `GET /change-password` | Passwort ändern (First-Login / nach Admin-Reset) |
|
||||
| `GET /admin/users` | User-Liste (Admin) |
|
||||
| `GET /admin/users/create` | User anlegen (Admin) |
|
||||
| `GET /admin/users/edit/<email>` | User bearbeiten (Admin) |
|
||||
| `POST /admin/users/create` | User anlegen (Admin) |
|
||||
| `POST /admin/users/delete/<email>` | User löschen (Admin, letzter Admin geschützt) |
|
||||
| `POST /admin/users/reset-password/<email>` | Passwort-Reset mit temporärem Passwort (Admin) |
|
||||
| `POST /admin/users/edit/<email>` | User bearbeiten speichern (Admin) |
|
||||
| `GET /media/<site>/<screen>/<file>` | Medien-Datei ausliefern |
|
||||
| `GET /media/priority/<file>` | Priority-Medien (global) |
|
||||
| `GET /media/<site>/background/<filename>` | Hintergrundbild der Willkommensseite |
|
||||
@@ -159,6 +175,7 @@ http://localhost:5005/admin/<standort>
|
||||
- Digital Voice Agent pro Screen konfigurieren (Position, Bild ein/aus, Typewriter-Tagline)
|
||||
- Stay-on-First-Modus pro Screen (kein automatischer Refresh)
|
||||
- Standorte anlegen & löschen
|
||||
- **Userverwaltung**: User anlegen, bearbeiten, löschen, Passwort-Reset (temporäres Passwort wird angezeigt)
|
||||
|
||||
### Player-URL
|
||||
|
||||
@@ -181,7 +198,25 @@ Maximal 3 Kunden eingeben → Logos werden via OpenAI + Brandfetch gesucht → `
|
||||
|
||||
---
|
||||
|
||||
### Globale Konfiguration
|
||||
### Globale Konfiguration (config.json)
|
||||
|
||||
| Feld | Typ | Beschreibung |
|
||||
|------|-----|-------------|
|
||||
| `server_url` | string | Öffentliche Server-URL für Player-Links |
|
||||
| `voice_agent_url` | string | URL des Digital Voice Agents (global, read-only im Admin) |
|
||||
|
||||
### User-Rollen (users.json)
|
||||
|
||||
| Rolle | Zugriff | Userverwaltung |
|
||||
|-------|---------|----------------|
|
||||
| **Admin** | Alle Standorte | Ja (anlegen/bearbeiten/löschen/Reset) |
|
||||
| **Superuser** | Alle Standorte | Nein |
|
||||
| **User** | Nur freigegebene Standorte | Nein |
|
||||
|
||||
- Usernamen sind E-Mail-Adressen
|
||||
- Passwörter werden als scrypt-Hash gespeichert
|
||||
- `users.json` wird beim ersten Start aus `config.json.admin` befüllt
|
||||
- **Notfall**: `users.json` löschen → Server-Neustart erzeugt neuen Admin aus `config.json`
|
||||
|
||||
| Feld | Typ | Beschreibung |
|
||||
|------|-----|-------------|
|
||||
@@ -269,6 +304,10 @@ Maximal 3 Kunden eingeben → Logos werden via OpenAI + Brandfetch gesucht → `
|
||||
- `load_priority_files()` – Priority-Playlist + Dateien laden
|
||||
- `prio_redirect(site)` – Redirect-Pfad zur Priority-Seite
|
||||
- `get_background_url(site)` – URL zum benutzerdefinierten Hintergrundbild oder `None`
|
||||
- `load_users()` / `save_users()` / `get_user()` – User aus `users.json`
|
||||
- `init_user_db()` – initialen Admin aus `config.json` anlegen
|
||||
- `get_accessible_sites(cfg, user)` – Standorte nach User-Berechtigung filtern
|
||||
- `admin_required` / `site_access_required` – Zugriffs-Dekoratoren
|
||||
|
||||
---
|
||||
|
||||
@@ -280,7 +319,11 @@ Wird über `localStorage("signage-theme")` persistiert. Umschalt-Button im Heade
|
||||
|
||||
## Sicherheit
|
||||
|
||||
- Admin-Bereich per Flask-Login geschützt
|
||||
- Admin-Bereich per Flask-Login geschützt (E-Mail + Passwort)
|
||||
- Passwörter gehasht (scrypt) in `users.json`
|
||||
- Drei Rollen: Admin (alle Standorte + Userverwaltung), Superuser (alle Standorte), User (nur zugewiesene Standorte)
|
||||
- Zugriffskontrolle per Decorator (`@admin_required`, `@site_access_required`)
|
||||
- Letzter Admin kann nicht gelöscht werden
|
||||
- Player-Seiten Read-Only
|
||||
- Externe Nutzung via Reverse Proxy + TLS empfohlen
|
||||
|
||||
|
||||
Reference in New Issue
Block a user