Schulwirken in 10 Minuten einrichten
Schulwirken läuft als Docker-Container auf jedem Linux-Server. Du brauchst keine .NET-Kenntnisse – nur Docker und einen Lizenzkey.
Funktionsübersicht
Schulwirken koordiniert den Schulalltag – von der Einsatzplanung über Abwesenheitsmeldungen bis zum Elternsprechtag.
Übersicht & Dashboard
Konfigurierbares Widget-Dashboard: Widgets können per Drag & Drop umsortiert und individuell ein- oder ausgeblendet werden. Verfügbare Widgets: kommende Einsätze, eigene Anmeldungen, bestätigte Stunden, Nachrichten, Elternsprechtag, Benutzerübersicht, Abwesenheiten und Meine Kinder. Die Konfiguration wird pro Nutzer gespeichert.
Einsätze & Veranstaltungen
Lehrer und Admins legen Einsätze und Veranstaltungen an – z. B. Schulbazaar, Aufräumaktion oder Kuchen backen. Pro Einsatz können folgende Bedarfe hinterlegt werden:
- Maximale Teilnehmerzahl (oder unbegrenzt)
- Veranstaltungs-Typ (z. B. Frühstück, Ausflug)
- Einladungsbasiert: Veranstaltung ist nur für eingeladene Nutzer sichtbar
- Benötigte Fähigkeiten (z. B. Tischlern, Erste Hilfe)
- Benötigte Werkzeuge mit Anzahl (z. B. 2× Bohrmaschine)
- Sachspenden / Materialien mit Anzahl (z. B. 20× Kuchen, 5× Nutella)
Häufig wiederkehrende Einsätze können als Vorlage gespeichert werden – beim Anlegen eines neuen Termins werden Titel, Typ, Beschreibung und weitere Felder automatisch vorausgefüllt.
Eltern und Schüler melden sich an und geben an, welche Werkzeuge oder Sachspenden sie mitbringen. Admins und Lehrer sehen in der Detailansicht eine Bedarfsdeckungsübersicht (grün/orange/rot) sowie die vollständige Teilnehmerliste mit Status.
Stundenerfassung
Freiwillige tragen ihre geleisteten Stunden ein (mit Einsatzbezug). Admins und Lehrer können alle Einträge einsehen und bestätigen. Bestätigte Stunden erscheinen im Übersichts-Zähler.
Abwesenheitsmeldung
Eltern melden die Abwesenheit ihrer Kinder direkt in der App – für einzelne Unterrichtsstunden, einen ganzen Tag oder mehrere aufeinanderfolgende Tage. Lehrer sehen alle offenen Meldungen nach Klasse sortiert und bestätigen oder lehnen sie ab. Die Meldungshistorie ist pro Kind einsehbar.
Schulnachrichten & Lesebestätigung
Lehrer erstellen Nachrichten und adressieren sie an einzelne Klassen oder die gesamte Schule. Nachrichten werden beim Öffnen automatisch als gelesen markiert. Zusätzlich können Eltern die Nachricht verbindlich bestätigen – pro Kind separat. Lehrer sehen jederzeit, welche Eltern noch nicht bestätigt haben.
Chat & Direktnachrichten
Direktnachrichten zwischen einzelnen Nutzern sowie Gruppen- und Klassenchats – Nachrichten werden in Echtzeit ausgeliefert (ohne externen Messenger). Der Chat ist pro Schule zentral aktivierbar bzw. deaktivierbar; Klassenchats orientieren sich an der Klassenzugehörigkeit von Lehrkräften und Eltern.
Elternsprechtag
Lehrer legen Gesprächstage mit Slots (Dauer, Pause) an. Eltern buchen einen Slot für ihr Kind direkt in der App – Doppelbuchungen werden durch einen atomaren Datenbank-Lock verhindert. Bereits gebuchte Slots können storniert werden.
Profil
Jeder Nutzer pflegt sein Profil mit eigenen Fähigkeiten und Werkzeugen. Diese Informationen werden beim Anmelden zu einem Einsatz berücksichtigt: Nur Werkzeuge, die im Profil hinterlegt sind, können beim Anmelden angeboten werden. Eltern können außerdem die Kleidungsgrößen ihrer Kinder (Oberteil, Hose/Rock, Schuhe) hinterlegen – diese werden bei der Schulkleidungsbestellung automatisch vorausgefüllt.
Stundenplan
Klassenstündenpläne als übersichtliches Wochen-Grid (Montag bis Freitag, bis zu 10 Stunden). Lehrer sehen den Plan ihrer eigenen Klassen, Eltern den Stundenplan ihrer Kinder. Admins verwalten alle Klassen sowie die Zeitdefinitionen (Start- und Endzeit je Schulstunde). Zwischenzeiten (z. B. große Pause) können als eigene Einträge hinterlegt werden.
Klassenbuch
Digitales Klassenbuch je Klasse: Zu jeder gehaltenen Stunde wird der Unterrichtsinhalt festgehalten – Fach und Lehrkraft sind aus dem Stundenplan vorbefüllt und überschreibbar. Besondere Vorkommnisse (klassen- oder kindbezogen) lassen sich notieren. Die Anwesenheit wird nicht doppelt erfasst, sondern direkt aus den Abwesenheitsmeldungen gelesen.
Hausaufgaben
Lehrkräfte stellen Hausaufgaben je Klasse und Fach mit Titel, Beschreibung und Fälligkeitsdatum. Eltern und Schüler sehen, was ansteht, und geben eine Erledigt-Rückmeldung pro Kind ab.
Noten & Zeugnisse (Add-on Leistung)
Noten: Leistungsbewertungen je Fach mit schulweit konfigurierbaren Notenskalen (Ziffern 1–6 mit Tendenz, Punkte 0–15 oder verbale Beurteilung), Gewichtung und automatischem, gewichtetem Schnitt. Für eine ganze Klassenarbeit gibt es eine Sammel-Eingabe (gemeinsame Angaben einmal, dann alle Kinder auf einmal). Eltern und Schüler sehen die Noten des eigenen Kindes; Export je Klasse/Fach als CSV.
Zeugnisse: Grundschul-Zeugnis je Kind – als Entwurf mit Noten-Schnitt, Arbeits-/Sozialverhalten und Fehltagen vorbefüllt, danach finalisieren. Ausgabe als schul-gebrandetes PDF, das Eltern und Schüler direkt in der App abrufen.
Noten und Zeugnisse sind als optionales Add-on Leistung verfügbar (+ 19 €/Monat bzw. + 190 €/Jahr) und können zu jedem SaaS-Tarif sowie zur Self-Hosted-Variante zugebucht werden. Klassenbuch und Hausaufgaben sind dagegen im Grund-Funktionsumfang enthalten.
Deputatsverwaltung (Add-on)
Soll-Wochenstunden je Lehrkraft und Schuljahr, abzüglich Anrechnungen / Ermäßigungsstunden (z. B. Personalrat, Fachleitung, Altersvermäßigung). Das Ist-Deputat ergibt sich automatisch aus den Einträgen im Stundenplan; der Saldo (Über-/Unterdeputat) wird je Lehrkraft als Chip ausgewiesen.
Die Deputatsverwaltung ist als optionales Add-on verfügbar (+ 39 €/Monat bzw. + 390 €/Jahr) und kann zu jedem SaaS-Tarif sowie zur Self-Hosted-Variante zugebucht werden.
Schulkleidung
Eltern bestellen Schulkleidung für ihre Kinder direkt in der App:
- Artikel-Katalog mit Foto, Name, Farbe, Größe und Preis
- Bestellperioden: Bestellungen sind nur innerhalb des konfigurierten Zeitfensters möglich
- Größen-Vorausbefüllung aus den im Profil hinterlegten Kleidungsgrößen des Kindes
- Notizfeld pro Bestellung
- Bestellbestätigung per Dialog und E-Mail; erneute Mail nur bei Änderungen
Admins verwalten den Katalog (Artikel anlegen, bearbeiten, deaktivieren), pflegen Bestellperioden und exportieren alle Bestellungen als Excel-Datei – aufgeteilt in eine Aggregatübersicht (je Artikel und Größe) und eine Detailtabelle (je Kind).
Verwaltung (Admin / Lehrer)
- Fähigkeiten – schulweiten Katalog pflegen (durchsuchbar)
- Werkzeuge – schulweiten Katalog pflegen (durchsuchbar)
- Klassen – Schulklassen anlegen und verwalten
- Kinder – Schüler ohne eigenen Zugang verwalten (Account haben die Eltern): einzeln anlegen oder per CSV importieren (Spalten Nachname; Vorname; Klasse), Klasse zuordnen, optional als Schüler mit eigenem Login einladen. Die Verknüpfung mit den Eltern erfolgt beim Benutzer-Import über die exportierte Kind-ID – so lassen sich Kinder und Eltern unabhängig voneinander importieren.
- QR-Eltern-Selbstregistrierung – pro Kind lässt sich ein QR-Code als PDF erzeugen (einzeln, klassenweise oder für die ganze Schule, mit Schul-Logo im Kopf). Eltern scannen den Code und legen ihr Konto selbst an – ganz ohne manuelle Einladung. Jeder Code ist 14 Tage gültig und für maximal zwei Eltern-Konten nutzbar; bei Bedarf lässt er sich jederzeit zurücksetzen.
- Benutzer – Personen mit eigenem Login (Lehrer, Eltern, Verwaltung, Schüler) per E-Mail einladen (Einzel oder CSV-Import), Rollen vergeben, Stammdaten und Klassenzuordnung bearbeiten, Passwort durch Admin setzen oder Reset-Mail auslösen, Konten sperren / entsperren. Fehlgeschlagene Anmeldungen werden protokolliert; nach mehreren Fehlversuchen sperrt das System das Konto automatisch und benachrichtigt den Admin.
- Klassenbuch & Hausaufgaben – Unterrichtsinhalte und Vorkommnisse je Stunde, Hausaufgaben mit Erledigt-Rückmeldung
- Noten & Zeugnisse – Notenskalen und Bewertungen, Zeugnis-Entwurf bis PDF (Add-on Leistung)
- Deputatsverwaltung – Soll-/Anrechnungs-/Ist-Stunden je Lehrkraft pro Schuljahr (Add-on)
- Aktivitätsprotokoll – nachvollziehbar, wer was geändert hat: jede Verwaltungsänderung (Benutzer anlegen, bearbeiten, löschen u. v. m.) wird automatisch mit Akteur, Zeitpunkt und Feld-Änderung „von → nach“ festgehalten – auf einer eigenen, filterbaren Seite (nur für Admins sichtbar).
- DSGVO – Datenexport (Art. 15), Anonymisierung (Art. 17)
- Feature-Toggles – Stundenplan, Einsätze, Stundenerfassung, Chat, Abwesenheiten, Klassenbuch, Hausaufgaben, Noten, Zeugnisse, Schulkleidung und Deputatsverwaltung können pro Schule aktiviert oder deaktiviert werden (soweit lizenziert)
PWA
Schulwirken kann direkt vom Browser als App auf dem Home-Bildschirm installiert werden (Android, iOS, Desktop). Der Browser zeigt einen Installationshinweis an.
Voraussetzungen
- Linux-Server (Ubuntu 22.04 oder neuer empfohlen)
- Docker ≥ 24 und Docker Compose ≥ 2
- Einen gültigen Schulwirken-Lizenzkey (hier kaufen)
- Eine Domain, die auf deinen Server zeigt
- Einen SMTP-Zugang für den E-Mail-Versand (Einladungen)
Installation
Arbeitsverzeichnis anlegen
mkdir schulwirken && cd schulwirken
docker-compose.yml anlegen
Erstelle eine Datei docker-compose.yml mit folgendem Inhalt:
services:
app:
image: ghcr.io/daniel-kinas/schulwirken-web-selfhosted:latest
container_name: schulwirken-app
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
environment:
- App__LicenseKey=${LICENSE_KEY}
- App__BaseUrl=${BASE_URL}
- App__SchoolName=${SCHOOL_NAME:-Meine Schule}
- App__AdminEmail=${ADMIN_EMAIL:-admin@schulwirken.local}
- App__AdminPassword=${ADMIN_PASSWORD:-}
- ConnectionStrings__Default=Server=db;Database=schulwirken;User=root;Password=${DB_PASSWORD}
- Jwt__Key=${JWT_KEY}
- Email__Host=${EMAIL_HOST}
- Email__Port=${EMAIL_PORT:-587}
- Email__Username=${EMAIL_USERNAME}
- Email__Password=${EMAIL_PASSWORD}
- Email__FromAddress=${EMAIL_FROM_ADDRESS}
- Email__FromName=${EMAIL_FROM_NAME:-Schulwirken}
- Push__PublicKey=${PUSH_PUBLIC_KEY}
- Push__PrivateKey=${PUSH_PRIVATE_KEY}
- Push__Subject=${PUSH_SUBJECT:-mailto:admin@example.com}
volumes:
- schulwirken_uploads:/app/wwwroot/uniformen
- schulwirken_logs:/app/logs
depends_on:
db:
condition: service_healthy
db:
image: mysql:8.4
container_name: schulwirken-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: schulwirken
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p${DB_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 10
volumes:
mysql_data:
schulwirken_uploads:
schulwirken_logs:
Konfiguration
Lege eine .env-Datei im selben Verzeichnis wie die docker-compose.yml an:
# Lizenzkey (erhalten nach Kauf)
LICENSE_KEY=XXXX-XXXX-XXXX-XXXX
# Deine Domain (mit https://)
BASE_URL=https://schule.meinedomain.de
# Datenbankpasswort (sicheres Passwort wählen)
DB_PASSWORD=sicheres-passwort-hier
# JWT-Schlüssel (mindestens 32 zufällige Zeichen)
JWT_KEY=ersetze-mit-mind-32-zeichen-langem-key
# ── Erststart: Admin-Konto & Schulname ────────────────────
# Nur beim ersten Start verwendet. Danach kann das Passwort
# unter “Mein Profil” geändert werden.
SCHOOL_NAME=Grundschule Musterstadt
ADMIN_EMAIL=schulleitung@muster.de
# Empfohlen: eigenes Passwort setzen. Wenn leer, wird beim
# ersten Start ein Passwort generiert und in initial-admin.txt
# im Container-Arbeitsverzeichnis gespeichert.
ADMIN_PASSWORD=sicheres-admin-passwort
# ── E-Mail (für Einladungen an Nutzer) ──────────────────
EMAIL_HOST=smtp.meinprovider.de
EMAIL_PORT=587
EMAIL_USERNAME=noreply@meinedomain.de
EMAIL_PASSWORD=email-passwort
EMAIL_FROM_ADDRESS=noreply@meinedomain.de
EMAIL_FROM_NAME=Schulwirken
# ── Push-Benachrichtigungen (Chat, optional) ─────────────────
# VAPID-Schlüsselpaar für Browser-/Handy-Push bei neuen
# Chat-Nachrichten. Leer lassen = Push deaktiviert (Chat
# funktioniert trotzdem). Erzeugen siehe Hinweis unten.
PUSH_PUBLIC_KEY=
PUSH_PRIVATE_KEY=
PUSH_SUBJECT=mailto:schulleitung@muster.de
Den JWT-Schlüssel kannst du so generieren:
openssl rand -base64 32
E-Mail-Pflicht: Schulwirken versendet Einladungslinks per E-Mail, wenn du neue Nutzer hinzufügst. Ohne gültige SMTP-Konfiguration können keine Nutzer eingeladen werden.
Push-Benachrichtigungen (optional)
Damit Nutzer bei neuen Chat-Nachrichten eine Browser- bzw. Handy-Benachrichtigung erhalten – auch bei geschlossenem Tab – brauchst du ein VAPID-Schlüsselpaar. Erzeuge es einmalig, z. B. mit Node:
npx web-push generate-vapid-keys
Trage den Public Key in PUSH_PUBLIC_KEY und den
Private Key in PUSH_PRIVATE_KEY ein. PUSH_SUBJECT
ist eine Kontakt-Adresse im Format mailto:deine@adresse.de.
Hinweise: Push funktioniert nur über https:// (deine
BASE_URL sollte also TLS nutzen). Lässt du die Schlüssel leer,
ist Push einfach deaktiviert – der Chat selbst bleibt voll funktionsfähig.
Den privaten Schlüssel niemals weitergeben. Unabhängig davon verschickt
Schulwirken bei länger ungelesenen Chat-Nachrichten (ab 4 Stunden) eine
Erinnerungs-E-Mail – dafür genügt die SMTP-Konfiguration oben.
Lizenzkey aktivieren
Schulwirken prüft beim Start automatisch deinen Lizenzkey gegen
license.schulwirken.de. Der Key wird an deine Domain gebunden –
du musst nichts weiter tun.
Läuft die Lizenz ab, wechselt die App in den Lesezugriff-Modus. Du kannst die Lizenz jederzeit unter preise.html verlängern.
Bezahlung auf Rechnung: Schulwirken wird per Rechnung mit Überweisung bezahlt (14 Tage Zahlungsziel). Keine Kreditkarte nötig. Die Aktivierung erfolgt nach Zahlungseingang. Vor Ablauf erinnert dich Schulwirken automatisch per Mail (30 / 14 / 0 Tage).
App starten
docker compose up -d
Beim ersten Start wird die Datenbank automatisch angelegt und alle Migrationen eingespielt. Das dauert einige Sekunden.
Logs ansehen:
docker compose logs -f app
Die App läuft auf Port 8080.
Erster Login
Nach dem Start erreichst du Schulwirken unter deiner konfigurierten
BASE_URL (oder zunächst über http://server-ip:8080).
Beim ersten Start wird automatisch ein Admin-Konto angelegt.
Hast du ADMIN_PASSWORD in der .env gesetzt, verwendest du dieses direkt.
Ohne ADMIN_PASSWORD wird ein Zufalls-Passwort generiert und in der Datei
initial-admin.txt im Arbeitsverzeichnis des Containers gespeichert:
docker compose exec app cat initial-admin.txt
Bitte lösche die Datei nach dem ersten Login:
docker compose exec app rm initial-admin.txt
Das Passwort kann anschließend jederzeit unter Mein Profil geändert werden.
Benutzer & Rollen
Schulwirken kennt vier Rollen:
| Rolle | Kann |
|---|---|
| Admin | Alles: Einsätze, Benutzer, Rollen, Klassen, Nachrichten, Abwesenheiten bestätigen, Stundenplan verwalten, Klassenbuch, Hausaufgaben, Noten & Zeugnisse, Schulkleidungs-Katalog & Bestellperioden, DSGVO-Werkzeuge, Feature-Toggles |
| Lehrer | Einsätze & Elternsprechtage anlegen, Nachrichten senden, Abwesenheiten bearbeiten, Klassenbuch führen, Hausaufgaben stellen, Noten & Zeugnisse der eigenen Klassen pflegen, Fähigkeiten & Werkzeuge verwalten |
| Elternteil | Einsätze anmelden, eigene Stunden eintragen, Abwesenheiten melden, Elternsprechtag buchen, Schulnachrichten bestätigen, Hausaufgaben, Noten & Zeugnisse des eigenen Kindes einsehen, Schulkleidung bestellen, Kinder verwalten, Profil pflegen |
| Schüler | Einsätze anmelden, eigene Stunden eintragen, Stundenplan einsehen, eigene Hausaufgaben, Noten & Zeugnisse einsehen, Profil pflegen |
Neue Nutzer werden per E-Mail eingeladen: Verwaltung → Benutzer → Einladen. Der Eingeladene erhält einen Link, über den er sein Passwort festlegt und sich direkt anmelden kann. Die Rollenzuweisung erfolgt ebenfalls in der Benutzerverwaltung.
Updates einspielen
Schulwirken-Updates werden als neue Docker-Images veröffentlicht. Einspielen:
docker compose pull
docker compose up -d
Datenbank-Migrationen laufen beim App-Start automatisch.
Deine Daten bleiben im benannten Volume mysql_data erhalten.
Reverse Proxy (HTTPS)
Schulwirken lauscht auf Port 8080. Stelle einen Reverse Proxy davor,
der HTTPS terminiert.
Nginx
server {
listen 443 ssl;
server_name schule.meinedomain.de;
ssl_certificate /etc/letsencrypt/live/schule.meinedomain.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/schule.meinedomain.de/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
Backup
Datenbank
# Backup erstellen
docker compose exec db mysqldump -u root -p"$DB_PASSWORD" schulwirken \
> backup_$(date +%Y%m%d).sql
# Backup einspielen
docker compose exec -T db mysql -u root -p"$DB_PASSWORD" schulwirken \
< backup_20250101.sql
Hochgeladene Dateien (Schulkleidungs-Katalog)
Bilder aus dem Schulkleidungs-Katalog werden im Docker-Volume schulwirken_uploads
gespeichert und überleben Neustarts und Updates. Für ein vollständiges Backup
solltest du dieses Volume zusätzlich sichern:
# Uploads-Volume sichern
docker run --rm \
-v schulwirken_uploads:/data \
-v "$(pwd)":/backup \
busybox tar czf /backup/uploads_$(date +%Y%m%d).tar.gz -C /data .
# Uploads-Volume wiederherstellen
docker run --rm \
-v schulwirken_uploads:/data \
-v "$(pwd)":/backup \
busybox tar xzf /backup/uploads_20250101.tar.gz -C /data
Troubleshooting
Ein Nutzer hat sein Passwort vergessen
Die App startet nicht
docker compose logs app. Häufige Ursachen:
falscher DB_PASSWORD, MySQL noch nicht bereit (kurz warten und erneut starten),
oder ungültiger JWT_KEY.
Wo finde ich die Anwendungs-Logs?
docker compose logs -f app.
Zusätzlich schreibt die App rollende Tagesdateien nach /app/logs im Container.
Dieses Verzeichnis liegt im Docker-Volume schulwirken_logs und
überdauert Neustarts und Updates. Auf den Host kopieren z. B. mit
docker compose cp app:/app/logs ./logs. Alte Dateien werden automatisch nach
31 Tagen aufgeräumt (anpassbar über Logging__RetainedFileCountLimit).
Einladungs-E-Mails kommen nicht an
.env: Host, Port (meist 587 für STARTTLS),
Benutzername und Passwort. Viele Provider erfordern App-Passwörter statt des normalen Passworts.
Logs: docker compose logs app | grep -i mail.
Lizenz ungültig / Lesezugriff-Modus
LICENSE_KEY und BASE_URL in der .env
korrekt sind. Der Server muss ausgehende HTTPS-Verbindungen zu
license.schulwirken.de erlauben.
Port 8080 ist bereits belegt
docker-compose.yml den Host-Port:
- "127.0.0.1:8081:8080" und passe deinen Reverse Proxy entsprechend an.
Werkzeuge / Fähigkeiten tauchen beim Anmelden nicht auf
Eltern sehen keine Abwesenheits- oder Nachrichtenfunktion
Elternsprechtag-Slots sind nicht buchbar
Weitere Fragen? Schreib uns an hallo@schulwirken.de.