morz-infoboard/server/backend/README.md
Jesko Anschütz 029fa39ffd Dokumentation: Security-Features und Upload-Konsolidierung (Phase 6)
Neue Packages und Module:
- fileutil: Shared Upload-Logik mit Tenant-Isolation
- httpapi/csrf.go: Double-Submit-Cookie CSRF-Schutz
- httpapi/ratelimit.go: Rate-Limiting für /login
- httpapi/uploads.go: neuteredFileSystem (kein Directory-Listing)
- httpapi/manage/csrf_helpers.go: CSRF-Helpers für Templates
- player/agent/internal/screenshot/screenshot.go: Periodische Screenshot-Erfassung

Neue Umgebungsvariablen:
- MORZ_INFOBOARD_REGISTER_SECRET: Pre-Shared-Secret für Agent-Registrierung
- MORZ_INFOBOARD_SCREENSHOT_EVERY: Screenshot-Intervall im Player-Agent (Sekunden)

Dokumentation aktualisiert:
- server/backend/README.md: Neue Packages und Env-Variable REGISTER_SECRET
- DEVELOPMENT.md: Beide neuen Env-Variablen mit Erklärungen
- docs/API-ENDPOINTS.md: Screenshot-Endpoint als "In Vorbereitung" dokumentiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 21:01:47 +01:00

7.8 KiB

Backend

Dieses Verzeichnis enthaelt das zentrale Go-Backend fuer das Info-Board-System.

Aufgaben

  • HTTP-API und serverseitige HTML-UI (Bulma)
  • PostgreSQL-Anbindung mit automatischen Migrationen
  • Session-basierte Authentifizierung und rollenbasierte Zugriffskontrolle
  • Medienverwaltung und Playlist-Management
  • Player-Status-Ingest und Diagnose
  • MQTT-Notifizierungen bei Playlist-Aenderungen

Unterstruktur

  • cmd/api/ — Startpunkt des Backends
  • internal/app/ — App-Initialisierung und Lifecycle
  • internal/config/ — Konfiguration via Umgebungsvariablen
  • internal/db/ — PostgreSQL-Anbindung und Migrations-Runner
  • internal/store/ — Datenbankzugriff (TenantStore, ScreenStore, MediaStore, PlaylistStore, AuthStore)
  • internal/fileutil/ — Upload-Hilfsfunktionen (SaveUploadedFile mit Tenant-Isolation)
  • internal/httpapi/ — HTTP-Routing, Middleware und Handler
  • internal/httpapi/csrf.go — Double-Submit-Cookie CSRF-Schutz
  • internal/httpapi/ratelimit.go — Rate-Limiting fuer /login (Brute-Force-Schutz)
  • internal/httpapi/uploads.go — Upload-Handler konsolidiert
  • internal/httpapi/manage/ — Admin-UI und Playlist-Management-UI
  • internal/httpapi/manage/csrf_helpers.go — CSRF-Token Helpers fuer Templates
  • internal/httpapi/tenant/ — Tenant-Self-Service-Dashboard
  • internal/mqttnotifier/ — MQTT-Notifizierungen
  • internal/reqcontext/ — Context-Keys fuer authentifizierten User

Aktuelle Endpunkte

Oeffentlich (keine Auth)

Methode Pfad Beschreibung
GET /healthz Health-Check
GET /api/v1 API-Entrypoint
GET /api/v1/meta Metainformationen
POST /api/v1/player/status Status-Ingest vom Player-Agent
GET /api/v1/screens/status Uebersicht aller Screen-Status
GET /api/v1/screens/{screenId}/status Einzelner Screen-Status
DELETE /api/v1/screens/{screenId}/status Screen-Status loeschen
GET /api/v1/screens/{screenId}/playlist Playlist fuer Player (kein Auth)
POST /api/v1/screens/register Agent-Selbstregistrierung
POST /api/v1/tools/message-wall/resolve Message-Wall-Aufloesungsendpunkt
GET /status HTML-Diagnoseseite
GET /status/{screenId} HTML-Detailseite Einzelscreen
GET /uploads/{filename} Hochgeladene Dateien abrufen
GET /static/bulma.min.css Statisches CSS
GET /static/Sortable.min.js Statisches JS
GET /login Login-Formular
POST /login Login verarbeiten
POST /logout Session beenden

Nur eingeloggte Benutzer (RequireAuth)

Methode Pfad Beschreibung
GET /manage/{screenSlug} Playlist-Management-UI
POST /manage/{screenSlug}/upload Medium fuer Screen hochladen
POST /manage/{screenSlug}/items Item zur Playlist hinzufuegen
POST /manage/{screenSlug}/items/{itemId} Item aktualisieren
POST /manage/{screenSlug}/items/{itemId}/delete Item loeschen
POST /manage/{screenSlug}/reorder Items reordnen
POST /manage/{screenSlug}/media/{mediaId}/delete Medium loeschen
GET /api/v1/playlists/{screenId} Playlist mit Metadaten abrufen
POST /api/v1/playlists/{playlistId}/items Item zur Playlist hinzufuegen (API)
PATCH /api/v1/items/{itemId} Item aktualisieren (API)
DELETE /api/v1/items/{itemId} Item loeschen (API)
PUT /api/v1/playlists/{playlistId}/order Items reordnen (API)
PATCH /api/v1/playlists/{playlistId}/duration Standard-Dauer setzen (API)
DELETE /api/v1/media/{id} Medium loeschen (API)

Nur Admins (RequireAuth + RequireAdmin)

Methode Pfad Beschreibung
GET /admin Admin-Uebersicht
POST /admin/screens/provision Provisionierungs-Job starten
POST /admin/screens Neuen Screen anlegen
POST /admin/screens/{screenId}/delete Screen loeschen

Tenant-scoped (RequireAuth + RequireTenantAccess)

Methode Pfad Beschreibung
GET /tenant/{tenantSlug}/dashboard Tenant-Self-Service-Dashboard
POST /tenant/{tenantSlug}/upload Medium hochladen
POST /tenant/{tenantSlug}/media/{mediaId}/delete Medium loeschen
GET /api/v1/tenants/{tenantSlug}/screens Screens eines Tenants auflisten
POST /api/v1/tenants/{tenantSlug}/screens Screen anlegen
GET /api/v1/tenants/{tenantSlug}/media Medien eines Tenants auflisten
POST /api/v1/tenants/{tenantSlug}/media Medium hochladen (API)

Konfiguration

Alle Werte per Umgebungsvariable:

Variable Bedeutung Standard
MORZ_INFOBOARD_HTTP_ADDR HTTP-Listen-Adresse :8080
DATABASE_URL PostgreSQL-Connection-String
MORZ_INFOBOARD_UPLOAD_DIR Verzeichnis fuer hochgeladene Medien /tmp/morz-uploads
MORZ_INFOBOARD_STATUS_STORE_PATH Pfad zur JSON-Persistenz-Datei fuer Status-Store leer (in-memory)
MORZ_INFOBOARD_ADMIN_PASSWORD Passwort des initialen Admin-Users (leer = kein Anlegen) leer
MORZ_INFOBOARD_DEFAULT_TENANT Slug des Tenants, dem der Admin zugeordnet wird morz
MORZ_INFOBOARD_DEV_MODE true = Session-Cookie ohne Secure-Flag (nur lokal) false
MORZ_INFOBOARD_REGISTER_SECRET Pre-Shared-Secret fuer POST /api/v1/screens/register leer
MORZ_INFOBOARD_MQTT_BROKER MQTT-Broker-URL (leer = kein MQTT) leer
MORZ_INFOBOARD_MQTT_USERNAME MQTT-Benutzername leer
MORZ_INFOBOARD_MQTT_PASSWORD MQTT-Passwort leer

Detailliertere Beschreibung und lokale Startbeispiele: DEVELOPMENT.md.