Untis-Vertretungsplan: WebServer/Anzeige
  • HTML 56.6%
  • JavaScript 25.2%
  • Python 15.8%
  • Shell 1%
  • Dockerfile 1%
  • Other 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Pablo1732 d218c1162d Version 0.3.3
Weichere Uebergaenge beim Ein-/Ausblenden des Aushangs.

- Crossfade (320ms) beim Ein- und Ausblenden des Aushangs im Intervall statt hartem Umschalten.
2026-09-15 14:33:34 +02:00
design Version 0.3.3 2026-09-15 14:33:34 +02:00
scripts Version 0.1.0 2026-09-15 14:33:33 +02:00
vendor Version 0.1.0 2026-09-15 14:33:33 +02:00
.gitattributes Version 0.1.0 2026-09-15 14:33:33 +02:00
.gitignore Version 0.1.0 2026-09-15 14:33:33 +02:00
DESIGN.md Version 0.3.0 2026-09-15 14:33:34 +02:00
docker-compose.yml Version 0.3.3 2026-09-15 14:33:34 +02:00
Dockerfile Version 0.3.0 2026-09-15 14:33:34 +02:00
entrypoint.sh Version 0.3.0 2026-09-15 14:33:34 +02:00
generate_views.py Version 0.3.0 2026-09-15 14:33:34 +02:00
README.md Version 0.3.3 2026-09-15 14:33:34 +02:00
server.py Version 0.3.2 2026-09-15 14:33:34 +02:00
view.css Version 0.1.0 2026-09-15 14:33:33 +02:00
view.js Version 0.1.0 2026-09-15 14:33:33 +02:00

vplan-webserver

Zeigt den Vertretungsplan (aus vertretungen.json, geschrieben vom vplan-parser) als Webseite -- in drei Ansichten, jede unter einer eigenen Adresse:

  • …/schueler/ -- Schueleransicht (nach Klassen)
  • …/lehrer_sort_stunden/ -- Lehreransicht, nach Stunden
  • …/lehrer_sort_lehrkraft/ -- Lehreransicht, nach Lehrkraft

Laedt die JSON alle paar Sekunden neu und wechselt flackerfrei auf den neuen Stand.

Zusaetzlich gibt es eine Aushang-Verwaltung unter …/admin/ (nur fuer die Schulleitung): Bilder/PDFs/Textmeldungen als Aushang schalten, Feueralarm und Amok/Lockdown ein-/ausschalten -- serverseitig, von jedem Geraet aus bedienbar.

Setup / Installation

1. Docker vorhanden?

docker version

2. Bei der Registry anmelden (einmalig)

docker login git.pablo1732.de

3. Wo liegt die vertretungen.json?

Der Webserver erzeugt sie nicht selbst -- sie kommt vom Parser-Container. In der docker-compose.yml ist ./data/json eingehaengt; ggf. den Pfad anpassen.

4. Starten

docker compose pull
docker compose up -d

Anzeige unter http://<server>:8080/ (lokal: localhost).

Kontrolle: docker compose logs -f (mit Strg+C wieder raus).

Auf den Aula-Displays z.B. im Kiosk-Modus:

chrome.exe --kiosk http://<server>:8080/schueler/

Bedienung / Anpassung

docker compose up -d      # startet im Hintergrund
docker compose logs -f    # Live-Logs ansehen
docker compose down       # stoppt und entfernt den Container
docker compose restart    # neu starten (z.B. nach Aenderung der Einstellungen)

Einstellungen

Einstellung Standard Bedeutung
POLL_SECONDS 20 Sekunden zwischen zwei Pruefungen auf eine neue vertretungen.json.
PORT 8080 Port im Container. Muss zum Wert unter ports: passen.
JSON_DIR /data/json Ordner im Container mit der Live-vertretungen.json.
STATE_DIR /data/userdata Ordner im Container fuer Aushang-Zustand + Uploads.
SCHULNAME Johannes-Gutenberg-Gymnasium Schulname in der Kopfzeile.
ADMIN_USER schulleitung Benutzername fuers Admin-Panel.
ADMIN_PASSWORD bitte-aendern Passwort fuers Admin-Panel. Leer = Login deaktiviert.
ADMIN_PASSWORD_HASH (leer) Alternative zu ADMIN_PASSWORD: PBKDF2-Hash statt Klartext.
SESSION_HOURS 8 Wie lange eine Anmeldung gueltig bleibt.
MAX_UPLOAD_MB 25 Maximale Groesse pro hochgeladener Datei.
LOGIN_MAX_FAILS 5 Fehlversuche pro IP bis zur (ansteigenden) Sperre.
DESIGN_DIR (eingebaut) Nur fuer ein eigenes Design ohne Neubau (siehe unten).

Die drei Ansichten

Immer dieselben Daten, nur anders sortiert. Jede Ansicht ist auf 1920x1080 ausgelegt und skaliert sich automatisch auf die Fenstergroesse.

Aushang-Verwaltung (Admin-Panel)

Unter http://<server>:8080/admin/ meldet sich die Schulleitung an und kann neben dem Plan einen Aushang einblenden oder einen Alarm schalten (Platzierung links/rechts/vollbild, dauerhaft oder im Intervall, Diashow). Zustand liegt auf dem Server -- Bedienung von jedem Geraet aus moeglich.

Zugangsdaten kommen aus der docker-compose.yml (ADMIN_USER/ ADMIN_PASSWORD). Ohne gesetztes ADMIN_PASSWORD ist der Login deaktiviert -- also ein sicheres Passwort setzen.

Passwort nicht im Klartext? PBKDF2-Hash statt ADMIN_PASSWORD erzeugen:

docker run --rm --entrypoint python3 git.pablo1732.de/schule/vplan-webserver:latest /opt/vplan-web/server.py --hash 'MeinPasswort'

Ergebnis in ADMIN_PASSWORD_HASH eintragen, ADMIN_PASSWORD leer lassen.

⚠️ Kein HTTPS. Login und Sitzungs-Cookie reisen im LAN im Klartext -- nur im vertrauenswuerdigen Schul-LAN betreiben, sonst TLS-Reverse-Proxy davor.

Keine/veraltete Daten?

  • "Keine Plandaten geladen": Der Webserver findet keine vertretungen.json. Liegt sie im eingehaengten Ordner? Laeuft der Parser-Container?
  • "Plan veraltet": Die JSON enthaelt nur vergangene Tage -- normal, wenn gerade kein aktueller Plan vorliegt.

Eigenes Design ohne Neubau (optional)

  1. Designordner in der docker-compose.yml einhaengen:
    - ./mein_design:/design:ro
    
  2. Darueber unter environment: setzen: DESIGN_DIR: "/design".
  3. docker compose up -d -- kein Neubau noetig.

Wie ein Design aufgebaut sein muss und wie man eins fest einbaut: siehe DESIGN.md.

Image selbst bauen

IMAGE_TAG=0.3.3 sh scripts/build-images.sh

Baut Multi-Arch (amd64+arm64) und pusht nach git.pablo1732.de/schule/vplan-webserver. Voraussetzung: einmalig docker login git.pablo1732.de (Token-Scope "package: Lesen und Schreiben").