Zum Hauptinhalt springen

Uni-Verein 1.10.1 – Ersteinrichtung, Hinweis bei neuem Gerät und Vorbereitung auf Mandanten 🛡️

· 5 Minuten Lesezeit
René Herrmann
Senior developer

Veröffentlicht am 3. November 2026

Uni-Verein 1.10.1 schafft das bekannte Standardpasswort ab: Eine neue Installation legt den ersten Administrator über eine geschützte Ersteinrichtung an. Außerdem schickt Uni-Verein jetzt eine Mail bei der Anmeldung auf einem neuen Gerät. Unter der Haube bereitet das Update die Datenbank auf mehrere Mandanten vor und bringt fast alle Abhängigkeiten auf den neuesten Stand.

Highlights​

  • 🔑 Ersteinrichtung (UV-72): Kein Benutzer Admin mit admin123 mehr, der erste Administrator wird beim ersten Aufruf mit einem Einrichtungs-Token angelegt
  • 📧 Hinweis bei neuem Gerät (UV-69): Eine Mail informiert, wenn sich jemand auf einem unbekannten Gerät anmeldet
  • 🏢 Vorbereitung auf Mandanten (UV-71): Alle Daten gehören jetzt zu einem Standard-Mandanten, eine einzelne Installation verhält sich unverändert
  • ⬆️ Abhängigkeiten: ASP.NET Core 10.0.14, React 19, MUI 9, Vite 8 und weitere

Neue Funktionen​

  • 🔑 Ersteinrichtung (UV-72): Eine frische Installation hat keinen Benutzer. Beim ersten Aufruf zeigt das Frontend die Seite Ersteinrichtung (GET /setup/status, POST /setup), auf der der erste Administrator mit Benutzername, E-Mail-Adresse und Passwort (10 bis 50 Zeichen) angelegt wird. Die Anfrage braucht den SETUP_TOKEN aus der .env, den docker-compose-ini.yml erzeugt und als Setup__Token an das Backend reicht. Ohne Token ist die Einrichtung gesperrt, so kann niemand einen frisch gestarteten Server übernehmen. Beide Endpunkte haben ein eigenes Rate-Limit (RateLimiting__Setup__PermitLimit, RateLimiting__SetupStatus__PermitLimit), POST /setup antwortet mit 409, sobald irgendein Benutzer existiert, auch ein gelöschter
  • 📧 Hinweis bei neuem Gerät (UV-69): Meldet sich jemand in einem Browser an, der das langlebige Cookie uv_device noch nicht hat, bekommt der Benutzer eine Mail mit Browser, Betriebssystem, IP-Adresse und Zeitpunkt (auf Deutsch und Englisch). Gespeichert wird nur der Hash des Cookies in der neuen Tabelle UserDevices. Mit Zwei-Faktor-Authentifizierung geht die Mail direkt nach dem richtigen Passwort raus. Für das erste Gerät eines Benutzers, für Benutzer ohne E-Mail-Adresse oder ohne hinterlegte Mail-Einstellungen wird nichts verschickt, und pro Benutzer höchstens alle 15 Minuten eine Mail. IP-Adresse und Browserkennung werden weder gespeichert noch protokolliert, eine Standortabfrage gibt es nicht

Änderungen​

  • 👤 Kein Standardadministrator mehr (UV-72): Der Benutzer Admin mit dem Passwort admin123 wird nicht mehr angelegt. Bestehende Installationen behalten ihre Benutzer und werden nicht mehr zu einem Passwortwechsel gezwungen, ein noch gesetztes Standardpasswort musst du unter "Profileinstellungen" selbst ändern. Der Demo-Modus behält seine erzeugten Benutzer
  • 🏢 Vorbereitung auf mehrere Mandanten (UV-71): Eine neue Tabelle Tenants mit einem festen Standard-Mandanten, jede Tabelle außer FirmwareVersions und FirmwareVersionNotifications bekommt die Spalte tenant_id. Die Migration weist alle vorhandenen Daten dem Standard-Mandanten zu, ältere Backups lassen sich weiter einspielen. Abfragen werden nach dem aktuellen Mandanten gefiltert, neue Zeilen erhalten ihn, Belegnummern und Quittungen sind pro Mandant eindeutig, Hintergrundjobs laufen einmal pro Mandant und das Login-Token enthält den Claim tenant_id (Tokens ohne ihn bleiben gültig). Aktuell ist der Mandant immer der Standard-Mandant, das Auflösen und Verwalten von Mandanten sind nicht Teil dieser Änderung
  • 🗄️ Entity Framework Core 10 und Npgsql 10 (UV-71): Nötig für benannte Abfragefilter
  • ⬆️ Abhängigkeiten: Backend und Frontend wurden aktualisiert, unter anderem ASP.NET Core / EF Core 10.0.14, MailKit 4.18.2, Markdig 1.5.1, React 19, MUI 9, MUI X 9, Vite 8, vite-plugin-pwa 2, pdfjs-dist 6, tesseract.js 7, uuid 14 und TipTap 3.32.2. Die mitgelieferten Worker in frontend/public/pdfjs und frontend/public/tesseract wurden ersetzt und müssen immer zur Bibliotheksversion passen. Bewusst nicht aktualisiert wurden CsvHelper 33.1.0, @fullcalendar/* 6.1.22 und typescript 6.0.3
  • 🧰 Datenbank-Migrator entfernt (UV-71): UniVerein.DbMigrator (Kopierer von MariaDB nach PostgreSQL) wurde entfernt, weil der MySQL-Treiber keine Version für Entity Framework Core 10 hat. Das Image ghcr.io/uni-verein/univerein-db-migrator:1.4.0 bleibt verfügbar, neue Versionen erscheinen nicht. Der Update-Weg von MariaDB (v1.3.1 und älter) liegt jetzt in legacy-update/ mit eigener docker-compose-update.yml und README. Die docker-compose-update.yml im Hauptordner kennt nur noch PostgreSQL und verweist auf legacy-update/README.md, wenn die Compose-Datei noch MariaDB nutzt

⚠️ Hinweise zum Update​

  • Immer mit docker-compose-update.yml aktualisieren, wie in der README beschrieben
  • Standardpasswort prüfen: Es gibt keinen Zwang zum Passwortwechsel mehr. Hat noch ein Konto das Passwort admin123, ändere es unter "Profileinstellungen"
  • Neue Installationen brauchen den Einrichtungs-Token (SETUP_TOKEN in der .env), siehe Ersteinrichtung. Die Datei .env.example und docker-compose-ini.yml kennen die Variable
  • API-Clients und Tests, die sich als Admin mit admin123 angemeldet haben, müssen den Administrator über POST /setup anlegen. Die E2E-Tests nutzen dafür TEST_SETUP_TOKEN, TEST_ADMIN_PASS und TEST_ADMIN_EMAIL
  • Von MariaDB (v1.3.1 und älter) aktualisierst du über den Ordner legacy-update/

Warum diese Updates wichtig sind​

Ein allgemein bekanntes Standardpasswort ist für jede neu installierte Instanz ein Risiko, bis jemand es ändert. Mit der geschützten Ersteinrichtung gibt es dieses Zeitfenster nicht mehr. Der Hinweis bei neuen Geräten macht gestohlene Passwörter sichtbar, bevor Schaden entsteht, und die Vorbereitung auf Mandanten legt das Fundament für künftige Funktionen, ohne dass sich für bestehende Installationen etwas ändert.

Wie geht es weiter?​

Weiteres Feedback aus der Praxis ist wie immer herzlich willkommen, gerne über GitHub Issues. Schaut auch weiterhin gerne hier vorbei!