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.
Deputatsverwaltung (Add-on Pro)
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 Pro 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, Klasse und Elternteile zuordnen, optional als Schüler mit eigenem Login einladen. Beim CSV-Import lassen sich Kinder über die Spalte Eltern-E-Mail direkt mit bestehenden Elternteil-Konten verknüpfen.
- 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.
- Deputatsverwaltung – Soll-/Anrechnungs-/Ist-Stunden je Lehrkraft pro Schuljahr (Add-on Pro)
- DSGVO – Datenexport (Art. 15), Anonymisierung (Art. 17), Audit-Log
- Feature-Toggles – Stundenplan, Einsätze, Stundenerfassung, Schulkleidung und Deputatsverwaltung können pro Schule aktiviert oder deaktiviert werden
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}
volumes:
- schulwirken_uploads:/app/wwwroot/uniformen
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:
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
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.
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, Schulkleidungs-Katalog & Bestellperioden, DSGVO-Werkzeuge, Feature-Toggles |
| Lehrer | Einsätze & Elternsprechtage anlegen, Nachrichten senden, Abwesenheiten bearbeiten, Fähigkeiten & Werkzeuge verwalten |
| Elternteil | Einsätze anmelden, eigene Stunden eintragen, Abwesenheiten melden, Elternsprechtag buchen, Schulnachrichten bestätigen, Schulkleidung bestellen, Kinder verwalten, Profil pflegen |
| Schüler | Einsätze anmelden, eigene Stunden eintragen, Stundenplan 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.
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.