199 lines
6.3 KiB
Markdown
199 lines
6.3 KiB
Markdown
# Was ist neu in MeshDD-Dashboard 0.9.x
|
||
|
||
> Aktueller Stand: **v0.09.00** · Release-Datum: 2026-02-20
|
||
|
||
---
|
||
|
||
## Übersicht
|
||
|
||
Release 0.9 bündelt alle seit v0.08.15 eingeführten Erweiterungen. Schwerpunkte sind
|
||
das neue **Rollensystem** (Mitarbeiter statt User), eine vollständige
|
||
**Konfigurationsseite** im Dashboard, eine erweiterte **Paket-Log-Filterzeile**
|
||
sowie eine Reihe struktureller Bereinigungen (Konfiguration, Datenbank, Benennung).
|
||
|
||
---
|
||
|
||
## Neues Rollensystem: Mitarbeiter
|
||
|
||
### Rollenhierarchie
|
||
|
||
```
|
||
Public → Mitarbeiter → Admin
|
||
```
|
||
|
||
Die bisherige Rolle `user` entfällt vollständig. Alle bestehenden `user`-Accounts
|
||
werden automatisch per DB-Migration zu `mitarbeiter` umgeschrieben.
|
||
|
||
| Bereich | Public | Mitarbeiter | Admin |
|
||
|---|---|---|---|
|
||
| Dashboard, Karte, Pakete, Nachrichten | Ja | Ja | Ja |
|
||
| Nachrichten senden | Nein | Ja | Ja |
|
||
| Scheduler, NINA, Einstellungen lesen | Nein | Ja | Ja |
|
||
| Scheduler, NINA, Einstellungen bearbeiten | Nein | Nein | Ja |
|
||
| Benutzerverwaltung `/admin` | Nein | Nein | Ja |
|
||
|
||
### Einladungs-Workflow
|
||
|
||
1. Admin öffnet `/admin` → „Mitarbeiter einladen"
|
||
2. Modal: Name + E-Mail eingeben
|
||
3. Backend generiert automatisch ein 12-stelliges Passwort
|
||
4. Einladungsmail mit Login-URL und Passwort wird versendet
|
||
5. Erster Login: Weiterleitung zu `/auth/change-password` (Pflichtänderung)
|
||
6. Nach dem Passwortwechsel: normaler Zugang
|
||
|
||
### Sidebar: staff-sichtbare Einträge
|
||
|
||
Scheduler, NINA und Einstellungen sind jetzt in einer Gruppe **„Konfigurationen"**
|
||
zusammengefasst und für alle Mitarbeiter (und Admins) sichtbar. Reine Admin-Links
|
||
(Benutzerverwaltung) sind davon getrennt.
|
||
|
||
### Read-only-Modus für Mitarbeiter
|
||
|
||
Mitarbeiter sehen Scheduler-Jobs und NINA-Konfiguration, können aber nicht bearbeiten:
|
||
- **Scheduler**: Schaltflächen „Neuer Job", „Bearbeiten", „Löschen" deaktiviert;
|
||
Badge „Nur Lesezugriff" in der Aktionen-Spalte.
|
||
- **NINA**: Alle Eingabefelder und der Speichern-Button sind disabled.
|
||
|
||
---
|
||
|
||
## Neue Konfigurationsseite (`/config`)
|
||
|
||
Eine neue Admin-Seite ermöglicht die Bearbeitung der Bot-Konfiguration direkt
|
||
im Dashboard — ohne SSH-Zugriff auf den Server.
|
||
|
||
### Bearbeitbare Bereiche
|
||
|
||
| Abschnitt | Felder |
|
||
|---|---|
|
||
| **Bot** | Name, Kommando-Präfix |
|
||
| **Meshtastic** | Host, Port |
|
||
| **Web** | Port, Online-Schwellwert (s) |
|
||
| **Links** | Liste mit URL + Bezeichnung (hinzufügen/entfernen) |
|
||
|
||
Die Konfiguration wird direkt in `config/config.yaml` geschrieben.
|
||
Der Live-Reload-Mechanismus übernimmt Änderungen ohne Neustart.
|
||
|
||
---
|
||
|
||
## Paket-Log: Erweiterte Filterzeile
|
||
|
||
Unterhalb des bestehenden Typ-Filter-Balkens steht jetzt eine zweite Filterzeile:
|
||
|
||
```
|
||
[ Von: __ ] [ An: __ ] [ Kanal: [Alle ▾] ] [ Hops ≤: __ ] [ 🔍 Freitext ] [ ✕ ]
|
||
```
|
||
|
||
| Filter | Funktion |
|
||
|---|---|
|
||
| **Von** | Teilstring auf Node-ID, Langname oder Kurzname |
|
||
| **An** | Teilstring; `alle`/`broadcast` für Broadcast-Pakete |
|
||
| **Kanal** | Dropdown mit bekannten Kanälen (aus WS-`channels`-Event) |
|
||
| **Hops ≤** | Zahl; filtert auf berechneten Hop-Wert (`hop_start − hop_limit`) |
|
||
| **Freitext** | Suche über alle Spalten (Von, An, Typ, Kanal, Info) |
|
||
| **✕** | Alle Zusatzfilter zurücksetzen |
|
||
|
||
Alle Filter wirken kombiniert (AND-Logik). Typ-Filter und Zusatzfilter greifen
|
||
unabhängig voneinander.
|
||
|
||
Die Filterung erfolgt rein im DOM – `buildRow()` befüllt beim Rendern
|
||
`data-from/to/channel/hops/search` für maximale Performance ohne Re-Render.
|
||
|
||
---
|
||
|
||
## NINA-Verbesserungen
|
||
|
||
### Quellenkennung im Mesh
|
||
|
||
Meldungen tragen jetzt die Quelle als Präfix:
|
||
|
||
```
|
||
[DWD@NINA] Schwerwiegend: Sturmböen (Dresden, Stadt)
|
||
[KATWARN@NINA] Mäßig: Starkregen (Meißen)
|
||
[NINA] Aufgehoben: ...
|
||
```
|
||
|
||
### UI-Verbesserungen
|
||
|
||
- **Schalter nebeneinander**: „Aktiviert" und „Ins Mesh senden" in einer Zeile
|
||
- **Intervalle in Minuten**: Eingabe und Anzeige in Minuten (intern weiter Sekunden)
|
||
- **Zuletzt gesendet**: Zeitstempel der letzten Mesh-Aussendung sichtbar
|
||
|
||
---
|
||
|
||
## Konfiguration: Strukturelle Bereinigung
|
||
|
||
### Verzeichnisstruktur
|
||
|
||
```
|
||
config/
|
||
config.yaml ← zentrale Konfiguration (Bot, Web, Auth, SMTP, Links)
|
||
scheduler.yaml ← Scheduler-Jobs
|
||
nina.yaml ← NINA-Konfiguration
|
||
data/
|
||
meshdd.db ← SQLite-Datenbank
|
||
*.db-wal ← WAL-Journal (gitignored)
|
||
*.db-shm ← Shared Memory (gitignored)
|
||
```
|
||
|
||
### `.env` abgeschafft
|
||
|
||
Alle Konfigurationswerte (`auth.secret_key`, `smtp.*`) sind direkt in
|
||
`config/config.yaml` – keine separate Secrets-Datei mehr nötig.
|
||
|
||
### Datenbank robuster
|
||
|
||
- WAL-Checkpoint (`PRAGMA wal_checkpoint(FULL)`) vor dem Schließen –
|
||
keine Daten bleiben im Journal
|
||
- Jeder Shutdown-Schritt ist einzeln mit `try/except` gekapselt –
|
||
`db.close()` wird auch bei Fehlern in anderen Komponenten immer ausgeführt
|
||
|
||
---
|
||
|
||
## Umbenennung: MeshDD-Bot → MeshDD-Dashboard
|
||
|
||
Alle Seiten-Titel (`<title>`) und Navbar-Texte wurden von „MeshDD-Bot" auf
|
||
„MeshDD-Dashboard" umgestellt.
|
||
|
||
---
|
||
|
||
## API-Änderungen
|
||
|
||
### Neue Endpunkte
|
||
|
||
| Methode | Pfad | Beschreibung | Auth |
|
||
|---|---|---|---|
|
||
| `GET` | `/api/config` | Bot-/Web-/Link-Konfiguration lesen | Admin |
|
||
| `PUT` | `/api/config` | Konfiguration speichern | Admin |
|
||
| `POST` | `/api/admin/invite` | Mitarbeiter einladen (Passwort auto-generiert) | Admin |
|
||
| `GET` | `/auth/change-password` | Pflicht-Passwortänderungs-Seite | — |
|
||
| `POST` | `/auth/change-password` | Neues Passwort setzen | Login |
|
||
|
||
### Auth-Änderungen bestehender Endpunkte
|
||
|
||
| Endpunkt | Vorher | Jetzt |
|
||
|---|---|---|
|
||
| `POST /api/send` | `require_user_api` | `require_staff_api` |
|
||
| `GET /api/node/config` | `require_admin_api` | `require_staff_api` |
|
||
| `GET /api/nina/config` | `require_admin_api` | `require_staff_api` |
|
||
| `GET /api/nina/alerts` | `require_admin_api` | `require_staff_api` |
|
||
| `GET /api/scheduler/jobs` | ohne Auth | `require_staff_api` |
|
||
|
||
---
|
||
|
||
## Sonstige Fixes
|
||
|
||
- **`upsert_node` Race-Condition** behoben: `INSERT OR IGNORE` + `UPDATE` statt
|
||
SELECT → INSERT – kein `UNIQUE constraint failed` mehr bei parallelen Node-Updates.
|
||
- **Karte: Legende theme-aware** (closes #5): CSS-Variablen + JS-Inline-Styles
|
||
für zuverlässige Light/Dark-Umschaltung im Leaflet-Control-Kontext.
|
||
- **Dashboard**: `channelBreakdown`-Card entfernt; Nachrichten-Trenner stärker
|
||
(Padding + Border-Breite), closes #1.
|
||
|
||
---
|
||
|
||
## Versionshistorie 0.9.x
|
||
|
||
| Version | Datum | Schwerpunkt |
|
||
|---|---|---|
|
||
| 0.09.00 | 2026-02-20 | Mitarbeiter-Rolle, /config-Seite, Paket-Log-Filter, Bereinigungen |
|