No description
  • JavaScript 83.1%
  • CSS 16.2%
  • HTML 0.4%
  • Shell 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
mstemplinger 44139435b7 JGG-Webapp (Demo) und Plan für den Neuaufbau
Stand der Demo-Webapp, wie sie unter jgg-w.schuelerinfo.de läuft, dazu
der bisher gemeinsam erarbeitete Plan für das produktionsreife Backend
(Docker, Sicherheit, Performance), die Code-Erklärung und Arbeitsnotizen,
damit auf einem anderen Rechner nahtlos weitergearbeitet werden kann.

Zugangsdaten und das Sicherheitsaudit bleiben außerhalb des Repos.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 12:41:58 +01:00
deploy JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
docs JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
public JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
seed JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
.gitignore JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
CLAUDE.md JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
mail.js JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
README.md JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
schulfrei.js JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
server.js JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00
webpush.js JGG-Webapp (Demo) und Plan für den Neuaufbau 2026-10-26 12:41:58 +01:00

JGG Schülerinfo – Webapp (jgg-w.schuelerinfo.de)

Installierbare Webapp im Stil der iOS-App: Stundenplan, Vertretungsplan, Hausaufgabenheft, Verfassungsviertelstunde (Padlet je Klasse und Tag), Aktionstag-Wahl mit Platzgrenzen, Schülerzeitung (JGG-Bladl) und Notenrechner.

  • server.js – Node ohne Abhängigkeiten: liefert public/ aus und eine JSON-API unter /api/.
  • seed/schule.json – Schulinhalte (Raster, Pläne, Räume, Vertretungen, Aktionstage, Zeitung). Wird bei jedem Start gelesen.
  • seed/start.json – Startdaten für Padlet und Wahlen, nur beim allerersten Start kopiert.
  • Laufende Daten: /var/lib/jgg-webapp/daten.json auf dem Server (nicht im Deploy).
  • Konten: Kürzel + Passwort (scrypt), freiwillig E-Mail für „Passwort vergessen" (mail.js, SMTP über STARTTLS, Konfiguration SMTP_*/MAIL_FROM in /etc/jgg-webapp.env). Erstes Konto „verwaltung" mit ADMIN_CODE als Startpasswort; Verwaltung legt Schülerkonten in der App an (Mehr → Schülerkonten). Freiwilliger Vorname (Mehr → Konto, auch durch die Verwaltung) für die Begrüßung „Hallo, …!"; ohne ihn das Kürzel.
  • Hausaufgaben: lokal zuerst, Abgleich mit dem Konto (/api/hausaufgaben/abgleich, jüngere Änderung gewinnt).
  • Noten: wie die Hausaufgaben lokal zuerst und mit dem Konto abgeglichen (/api/noten/abgleich, Datensätze einst/fach/note, jüngere Änderung gewinnt). Aufbau wie Notus: Fach → Noten mit Art, Halbjahr, Gewicht, Ziel. Fächer kommen automatisch aus dem Stundenplan der Klasse (jedes nur einmal, gelöschte bleiben weg). Q-Klassen: Punkte 0–15 und vier Semester 12/1–13/2 (hj 1–4); Gesamt = Mittel der Semesterschnitte. Alte Gerätenoten (noten_faecher) werden beim ersten Start einmalig ins Konto übernommen.
  • Einführungen (TUTORIALS in app.js): kurze App-Einführung beim ersten Start, eigene je Bereich (Plan, Hausaufgaben, Viertelstunde, Aktionstage, Noten) beim ersten Öffnen; alle unter Mehr → Einführungen.
  • Gewählte Klasse liegt nur im Browser (localStorage).

Betrieb

Server: Hetzner, SSH-Alias jgg-server (IP im Passwort-Manager), pm2-Prozess jgg-w, Port 3400, nginx-vhost /etc/nginx/sites-available/jgg-w (Certbot-TLS). Geheimnisse in /etc/jgg-webapp.env (ACCESS_CODE, ADMIN_CODE, SESSION_SECRET). DNS: A-Record jgg-w bei IONOS.

Ausliefern: ./deploy/deploy.sh. Versionen laufen automatisch: Der Server bildet beim Start einen Fingerabdruck aller Dateien in public/ und setzt ihn als __VERSION__ in index.html und sw.js ein. Nichts von Hand hochzählen.

Offline und Updates

  • Service Worker (public/sw.js): App-Hülle cache-first, Daten erst Netz und nach 2,5 s (oder bei 5xx) der gespeicherte Stand – nicht in den 30 s nach einer eigenen Änderung. Zeitungs-PDFs und Titelbilder cache-first unter ?v=<Stand>, damit getauschte Dateien ankommen. Nach dem Login lädt die App alles Nötige vor. Abmelden, Anmelden und abgelaufene Sitzungen leeren den Daten-Cache.
  • Abgleich: Der Client schickt seinen ganzen Bestand (Limit 1 MB) und räumt lokal mit denselben Fristen auf wie der Server (Grabsteine 60 Tage, Erledigtes 120 Tage).
  • Die App fragt /api/version beim Start, beim Zurückkehren in den Vordergrund, wenn wieder Netz da ist, und alle 15 Minuten ab. Bei neuer Version: neuen Worker laden, aktivieren, neu laden. Dauert es länger als 0,8 s, erscheint „Neue Version wird geladen …". Ein offenes Formular wird nicht unterbrochen.
  • Konnte die App 10 Tage lang nicht prüfen, erscheint ein wegklickbarer Hinweis (nach 24 h wieder).

Lokal: siehe docs/NOTIZEN.md.

Plan für den Neuaufbau: docs/PLAN-NEUAUFBAU.md.