beta. Modbus fixed and tested
This commit is contained in:
@@ -1,45 +1,798 @@
|
||||
# SE Local Trenddata.
|
||||
# SE Local Trenddata
|
||||
|
||||
Modernisierte Trendoberfläche für Wago-Bestandsdatenbanken mit React, Node.js, MariaDB, Redis, Dockhand und vorbereitetem Collector-Service.
|
||||
SE Local Trenddata ist eine webbasierte Trend-, Dashboard- und Quellenverwaltung fuer lokale Anlagen- und WAGO-Daten. Das Projekt besteht aus einem React-Frontend, einer Node.js/Express-API, MariaDB, Redis und einem Collector-Service fuer Protokollquellen wie Modbus TCP, OPC UA, BACnet IP und KNX IP.
|
||||
|
||||
## Enthalten
|
||||
- React-Frontend mit System-, Hell- und Dunkelmodus
|
||||
- Username-Login, Rollen, Passwortwechsel und Benutzerverwaltung
|
||||
- Alias-Verwaltung für `Wert1` bis `Wert200` je Trendtabelle
|
||||
- CSV-Import und CSV-Export für Aliasdaten
|
||||
- Gespeicherte Auswahlen über mehrere ISPs hinweg
|
||||
- Dashboard mit Graph-, Zahl- und Zeigermanometer-Widgets
|
||||
- Fokusansicht für den Trendgraph statt Browser-Vollbild
|
||||
- Export des Trendgraphs als CSV, XLSX, PNG, JPG, SVG und PDF
|
||||
- SQL-Import für vorhandene Langzeitdaten
|
||||
- Redis für Metadaten, Auswahlen, Dashboard und Benutzerpräferenzen
|
||||
- MariaDB-Init für `isp01` bis `isp20` plus `app_users`
|
||||
- Dockhand im Compose-Stack
|
||||
- Collector-Gerüst für spätere Modbus-, OPC-UA-, BACnet- und KNX-Anbindung
|
||||
Das Ziel ist, bestehende breite Trendtabellen wie `isp01`, `isp02` usw. weiter nutzen zu koennen und zusaetzlich neue Quellen sauber ueber eine Weboberflaeche anzulegen, zu scannen, zu loggen und im Dashboard oder in der Trendansicht auszuwerten.
|
||||
|
||||
## Starten
|
||||
1. Optional `.env.example` nach `.env` kopieren und Werte anpassen.
|
||||
2. `docker compose up -d --build`
|
||||
3. Frontend: `http://localhost:5173`
|
||||
4. API: `http://localhost:18080/api`
|
||||
5. Dockhand: `http://localhost:3000`
|
||||
6. Collector: `http://localhost:18110/health`
|
||||
---
|
||||
|
||||
## Standard-Login
|
||||
- Username: `admin`
|
||||
- Passwort: `ChangeMe123!`
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
## Datenbank-Kompatibilität
|
||||
- Bestehende Anlagen können weiter mit `root` und Passwort `SE3112` auf die MariaDB gehen.
|
||||
- Die API versucht zusätzlich als Fallback noch das ältere Root-Passwort `root`, damit vorhandene Entwicklungs-Volumes nicht sofort umgebaut werden müssen.
|
||||
- [Projektaufbau](#projektaufbau)
|
||||
- [Architektur](#architektur)
|
||||
- [Services und Ports](#services-und-ports)
|
||||
- [Schnellstart mit Docker Compose](#schnellstart-mit-docker-compose)
|
||||
- [Lokale Entwicklung](#lokale-entwicklung)
|
||||
- [Konfiguration](#konfiguration)
|
||||
- [Login, Benutzer und Rollen](#login-benutzer-und-rollen)
|
||||
- [Frontend-Funktionen](#frontend-funktionen)
|
||||
- [API-Funktionen](#api-funktionen)
|
||||
- [Collector-Funktionen](#collector-funktionen)
|
||||
- [Datenbank und Speicher](#datenbank-und-speicher)
|
||||
- [WAGO- oder SD-Karten-Betrieb](#wago--oder-sd-karten-betrieb)
|
||||
- [Backup und Restore](#backup-und-restore)
|
||||
- [Deployment-Hinweise](#deployment-hinweise)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Sicherheits-Checkliste](#sicherheits-checkliste)
|
||||
|
||||
## Wago / SD-Karte
|
||||
- Für Wago-Systeme liegt mit [docker-compose.wago.yml](/C:/Projects/SeLTD/docker-compose.wago.yml) ein Override bereit.
|
||||
- Start auf Wago mit SD-Karte: `docker compose -f docker-compose.yml -f docker-compose.wago.yml up -d --build`
|
||||
- Dabei landen die großen Daten unter `/media/sd/seltd/...`.
|
||||
---
|
||||
|
||||
## Hinweise
|
||||
- Vorhandene SQL-Dumps können im Admin-Bereich direkt importiert werden.
|
||||
- Leere Trendtabellen tauchen nicht im Trend-Dropdown auf, aber weiter im Admin-Bereich.
|
||||
- Der Collector ist bewusst erst als technisches Gerüst enthalten; Protokoll-Scan und Feldbus-Importe sind noch nicht vollständig implementiert.
|
||||
- Für Dockhand wurde der Container ergänzt. Eine sichere automatische Vorbelegung eines lokalen Admin-Users war ohne offizielle Initialisierungsdokumentation nicht belastbar genug und wurde deshalb nicht blind in die SQLite-Datenbank geschrieben.
|
||||
## Projektaufbau
|
||||
|
||||
```text
|
||||
SeLTD/
|
||||
├── .env.example
|
||||
├── docker-compose.yml
|
||||
├── docker-compose.wago.yml
|
||||
├── docker/
|
||||
│ └── redis/
|
||||
│ └── redis.conf
|
||||
├── api/
|
||||
│ ├── Dockerfile
|
||||
│ ├── package.json
|
||||
│ └── src/
|
||||
│ ├── index.js
|
||||
│ ├── auth.js
|
||||
│ ├── config.js
|
||||
│ ├── db.js
|
||||
│ ├── redis.js
|
||||
│ └── lib/
|
||||
│ ├── isp.js
|
||||
│ └── store.js
|
||||
├── collector/
|
||||
│ ├── Dockerfile
|
||||
│ ├── package.json
|
||||
│ └── src/
|
||||
│ └── index.js
|
||||
└── web/
|
||||
├── Dockerfile
|
||||
├── package.json
|
||||
├── vite.config.js
|
||||
├── public/
|
||||
│ └── logo.png
|
||||
└── src/
|
||||
├── App.jsx
|
||||
├── api.js
|
||||
├── main.jsx
|
||||
├── styles.css
|
||||
└── components/
|
||||
├── Gauge.jsx
|
||||
└── TrendChart.jsx
|
||||
```
|
||||
|
||||
### Hauptbereiche
|
||||
|
||||
| Bereich | Aufgabe |
|
||||
| --- | --- |
|
||||
| `web/` | React/Vite-Frontend fuer Login, Dashboard, Trends, Admin-Bereich, Quellen, Rollen und Benutzer |
|
||||
| `api/` | Express-API fuer Auth, Rollen, Aliase, Trendabfragen, Dashboard, SQL-Import und Benutzerverwaltung |
|
||||
| `collector/` | HTTP-Service fuer Protokollquellen, Datenpunkte, Scans, Imports und zyklisches Logging |
|
||||
| `mariadb` | Persistente Trenddaten und Benutzer-Tabelle |
|
||||
| `redis` | Metadaten, Aliase, Rollen, Einheiten, Dashboards, Auswahlen und User-Praeferenzen |
|
||||
| `dockhand` | Docker-Verwaltung ueber Weboberflaeche |
|
||||
| `cadvisor` | Container-Metriken fuer Monitoring |
|
||||
|
||||
---
|
||||
|
||||
## Architektur
|
||||
|
||||
```text
|
||||
Browser
|
||||
│
|
||||
│ http://localhost:5173
|
||||
▼
|
||||
React/Vite Frontend (web)
|
||||
│
|
||||
├── API-Aufrufe: http://localhost:18080/api/...
|
||||
│ ▼
|
||||
│ Express API (api, intern Port 8080)
|
||||
│ ├── MariaDB: Benutzer, Trendtabellen, SQL-Daten
|
||||
│ └── Redis: Rollen, Einheiten, Aliase, Dashboard, Auswahlen
|
||||
│
|
||||
└── Collector-Aufrufe: http://localhost:18110/...
|
||||
▼
|
||||
Collector-Service
|
||||
├── sources.json unter /app/data
|
||||
├── Modbus TCP / OPC UA / BACnet / KNX
|
||||
└── schreibt aktive Datenpunkte in MariaDB-Trendtabellen
|
||||
```
|
||||
|
||||
Wichtig: Die API laeuft im Container intern auf Port `8080`, wird aber nach aussen auf `18080` gemappt. Das Frontend muss deshalb im Browser auf `http://localhost:18080/api` zugreifen.
|
||||
|
||||
---
|
||||
|
||||
## Services und Ports
|
||||
|
||||
| Service | Container | Interner Port | Host-Port | Zweck |
|
||||
| --- | --- | ---: | ---: | --- |
|
||||
| Web | `seltd-web` | 5173 | 5173 | React/Vite-Oberflaeche |
|
||||
| API | `seltd-api` | 8080 | 18080 | REST-API |
|
||||
| Collector | `seltd-collector` | 18110 | 18110 | Quellen, Datenpunkte, Scans, Polling |
|
||||
| MariaDB | `seltd-mariadb` | 3306 | 3306 | Trend- und Benutzerdaten |
|
||||
| Redis | `seltd-redis` | 6379 | 6379 | Metadaten und App-State |
|
||||
| Dockhand | `dockhand` | 3000 | 3000 | Docker-Webverwaltung |
|
||||
| cAdvisor | `cadvisor_ltd` | 8080 | 9090 | Container-Metriken |
|
||||
|
||||
---
|
||||
|
||||
## Schnellstart mit Docker Compose
|
||||
|
||||
### 1. Repository vorbereiten
|
||||
|
||||
```powershell
|
||||
cd C:\Projects\SeLTD
|
||||
copy .env.example .env
|
||||
```
|
||||
|
||||
Passe danach mindestens diese Werte an:
|
||||
|
||||
```env
|
||||
JWT_SECRET=bitte-langen-zufaelligen-wert-setzen
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=ChangeMe123!
|
||||
MARIADB_ROOT_PASSWORD=SE3112
|
||||
CORS_ORIGIN=http://localhost:5173
|
||||
VITE_API_PORT=18080
|
||||
```
|
||||
|
||||
### 2. Stack bauen und starten
|
||||
|
||||
```powershell
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Bei groesseren Aenderungen am Code oder wenn der Browser alten Code anzeigt:
|
||||
|
||||
```powershell
|
||||
docker compose down
|
||||
docker compose build --no-cache web api collector
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### 3. Aufrufen
|
||||
|
||||
| Anwendung | URL |
|
||||
| --- | --- |
|
||||
| Frontend | `http://localhost:5173` |
|
||||
| API Healthcheck | `http://localhost:18080/api/health` |
|
||||
| Collector Healthcheck | `http://localhost:18110/health` |
|
||||
| Dockhand | `http://localhost:3000` |
|
||||
| cAdvisor | `http://localhost:9090` |
|
||||
|
||||
### 4. Standard-Login
|
||||
|
||||
```text
|
||||
Username: admin
|
||||
Passwort: ChangeMe123!
|
||||
```
|
||||
|
||||
Das Passwort sollte nach dem ersten Login geaendert werden.
|
||||
|
||||
---
|
||||
|
||||
## Lokale Entwicklung
|
||||
|
||||
### Frontend lokal starten
|
||||
|
||||
```powershell
|
||||
cd C:\Projects\SeLTD\web
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Das Frontend laeuft dann auf:
|
||||
|
||||
```text
|
||||
http://localhost:5173
|
||||
```
|
||||
|
||||
### API lokal starten
|
||||
|
||||
```powershell
|
||||
cd C:\Projects\SeLTD\api
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Die API liest ihre Konfiguration aus `.env`. Wenn du die API lokal ohne Docker laufen laesst, muss `DB_HOST` auf den erreichbaren MariaDB-Host zeigen.
|
||||
|
||||
### Collector lokal starten
|
||||
|
||||
```powershell
|
||||
cd C:\Projects\SeLTD\collector
|
||||
npm install
|
||||
npm start
|
||||
```
|
||||
|
||||
Der Collector braucht Zugriff auf MariaDB und schreibt seine lokale Konfiguration in `collector/data/sources.json`.
|
||||
|
||||
---
|
||||
|
||||
## Konfiguration
|
||||
|
||||
Die wichtigsten Variablen liegen in `.env`.
|
||||
|
||||
| Variable | Beispiel | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `JWT_SECRET` | `change-me` | Signatur fuer Login-Tokens. In Produktion unbedingt aendern. |
|
||||
| `ADMIN_USERNAME` | `admin` | Initialer Admin-Username |
|
||||
| `ADMIN_EMAIL` | `admin@example.com` | Initiale Admin-E-Mail |
|
||||
| `ADMIN_PASSWORD` | `ChangeMe123!` | Initiales Admin-Passwort |
|
||||
| `ADMIN_NAME` | `System Admin` | Anzeigename des Admins |
|
||||
| `MARIADB_ROOT_PASSWORD` | `SE3112` | MariaDB-Root-Passwort |
|
||||
| `DB_PASSWORD_FALLBACK` | `root` | Fallback fuer alte Entwicklungsvolumes |
|
||||
| `CORS_ORIGIN` | `http://localhost:5173` | Erlaubter Browser-Ursprung fuer API-Aufrufe |
|
||||
| `VITE_API_PORT` | `18080` | API-Port, den das Frontend im Browser nutzt |
|
||||
| `POLL_TICK_MS` | `1000` | Collector-Tick fuer Polling-Pruefung |
|
||||
|
||||
### CORS
|
||||
|
||||
Wenn das Frontend lokal auf `http://localhost:5173` laeuft, muss in der API stehen:
|
||||
|
||||
```env
|
||||
CORS_ORIGIN=http://localhost:5173
|
||||
```
|
||||
|
||||
Bei mehreren erlaubten Origins kann eine kommaseparierte Liste genutzt werden:
|
||||
|
||||
```env
|
||||
CORS_ORIGIN=http://localhost:5173,https://trend.example.local
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Login, Benutzer und Rollen
|
||||
|
||||
Die API legt beim Start automatisch einen Admin-Benutzer an oder aktualisiert den vorhandenen Admin.
|
||||
|
||||
### Systemrollen
|
||||
|
||||
| Rolle | Rechte |
|
||||
| --- | --- |
|
||||
| `viewer` | Dashboard anzeigen, Trendansicht anzeigen |
|
||||
| `technician` | Dashboard, Trends, Aliase, Quellen, Debug |
|
||||
| `admin` | Alle Rechte inkl. Benutzer- und Rollenverwaltung |
|
||||
|
||||
### Rechtekatalog
|
||||
|
||||
| Recht | Bedeutung |
|
||||
| --- | --- |
|
||||
| `view_dashboard` | Dashboard anzeigen und speichern |
|
||||
| `view_trends` | Trends anzeigen, Auswahlen nutzen |
|
||||
| `edit_aliases` | Aliase und Einheiten bearbeiten |
|
||||
| `manage_sources` | Quellen und Datenpunkte verwalten |
|
||||
| `manage_users` | Benutzer anlegen und bearbeiten |
|
||||
| `manage_roles` | Rollen und Rechte verwalten |
|
||||
| `view_debug` | Collector-Debug sehen |
|
||||
|
||||
Benutzer, Rollen und Passwoerter werden ueber den Admin-Bereich verwaltet.
|
||||
|
||||
---
|
||||
|
||||
## Frontend-Funktionen
|
||||
|
||||
### Login
|
||||
|
||||
- Username-basierter Login
|
||||
- JWT-Token wird im Browser gespeichert
|
||||
- Passwortwechsel ueber Einstellungen
|
||||
- Rollenbasierte Navigation
|
||||
|
||||
### Dashboard
|
||||
|
||||
- Widgets aus aktueller Auswahl oder gespeicherter Auswahl
|
||||
- Widget-Typen:
|
||||
- Graph
|
||||
- Zahl
|
||||
- Zeigermanometer
|
||||
- Dashboard wird pro Benutzer gespeichert
|
||||
|
||||
### Trendansicht
|
||||
|
||||
- Datenpunkte aus mehreren Trendtabellen kombinierbar
|
||||
- Auswahl speicherbar und optional fuer andere Benutzer freigebbar
|
||||
- Zeitraeume als Presets von 5 Minuten bis 30 Tage
|
||||
- Eigener Start-/Endzeitraum moeglich
|
||||
- Aktuelle Werte werden separat angezeigt
|
||||
- Fokusmodus fuer den Graphen
|
||||
|
||||
### Trend-Export
|
||||
|
||||
Der Trendgraph kann exportiert werden als:
|
||||
|
||||
- CSV
|
||||
- XLSX
|
||||
- PNG
|
||||
- JPG
|
||||
- SVG
|
||||
- PDF
|
||||
|
||||
### Admin: Aliase
|
||||
|
||||
- Anzeigename und Beschreibung pro Trendtabelle
|
||||
- Alias, Einheit, Faktor, Typ, Min/Max und Farbe pro Wert
|
||||
- CSV-Import und CSV-Export
|
||||
- Encoding-/Grad-Celsius-Bereinigung
|
||||
|
||||
### Admin: Einheiten
|
||||
|
||||
- Systemeinheiten wie `°C`, `%`, `K`, `V`, `A`, `Pa`
|
||||
- Eigene Einheiten wie `bar`, `m³/h`, `Hz` usw.
|
||||
- Einheitenauswahl bei Aliasen und Datenpunkten
|
||||
|
||||
### Admin: Quellen
|
||||
|
||||
- Protokollquellen anlegen und bearbeiten
|
||||
- Unterstuetzte Protokolle in der UI:
|
||||
- Modbus TCP
|
||||
- OPC UA
|
||||
- BACnet IP
|
||||
- KNX IP
|
||||
- Poll-Intervall und Schreibmodus konfigurierbar
|
||||
- Scan-Ergebnisse und importierte Punkte koennen ins Logging uebernommen werden
|
||||
- Manuelle Datenpunkte koennen erstellt und bearbeitet werden
|
||||
|
||||
---
|
||||
|
||||
## API-Funktionen
|
||||
|
||||
Die API laeuft unter:
|
||||
|
||||
```text
|
||||
http://localhost:18080/api
|
||||
```
|
||||
|
||||
### Authentifizierung
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `POST` | `/api/auth/login` | Login mit Username/Passwort |
|
||||
| `GET` | `/api/auth/me` | Aktuellen Benutzer lesen |
|
||||
| `POST` | `/api/auth/change-password` | Passwort aendern |
|
||||
|
||||
### Trends und ISPs
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `GET` | `/api/isps` | Verfuegbare Trendtabellen lesen |
|
||||
| `GET` | `/api/isps/:isp/aliases` | Alias-Metadaten lesen |
|
||||
| `PUT` | `/api/isps/:isp/aliases` | Alias-Metadaten speichern |
|
||||
| `POST` | `/api/trend-tables` | Neue Trendtabelle anlegen |
|
||||
| `POST` | `/api/trends/query` | Trenddaten abfragen |
|
||||
| `POST` | `/api/points/latest` | Letzte Werte lesen |
|
||||
|
||||
### Einheiten
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `GET` | `/api/units` | Einheiten lesen |
|
||||
| `POST` | `/api/units` | Einheit anlegen |
|
||||
| `PATCH` | `/api/units/:symbol` | Einheit bearbeiten |
|
||||
|
||||
### Benutzer und Rollen
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `GET` | `/api/users` | Benutzerliste |
|
||||
| `POST` | `/api/users` | Benutzer anlegen |
|
||||
| `PATCH` | `/api/users/:id` | Benutzer bearbeiten |
|
||||
| `GET` | `/api/roles` | Rollenliste inkl. Rechtekatalog |
|
||||
| `POST` | `/api/roles` | Rolle anlegen |
|
||||
| `PATCH` | `/api/roles/:name` | Rolle bearbeiten |
|
||||
|
||||
### Auswahlen und Dashboard
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `GET` | `/api/selections` | Gespeicherte Auswahlen lesen |
|
||||
| `POST` | `/api/selections` | Auswahl speichern |
|
||||
| `PUT` | `/api/selections/:selectionId` | Auswahl aktualisieren |
|
||||
| `DELETE` | `/api/selections/:selectionId` | Auswahl loeschen |
|
||||
| `GET` | `/api/dashboard` | Dashboard laden |
|
||||
| `PUT` | `/api/dashboard` | Dashboard speichern |
|
||||
| `POST` | `/api/dashboard/data` | Widget-Daten laden |
|
||||
| `GET` | `/api/preferences` | Benutzerpraeferenzen laden |
|
||||
| `PUT` | `/api/preferences` | Benutzerpraeferenzen speichern |
|
||||
|
||||
---
|
||||
|
||||
## Collector-Funktionen
|
||||
|
||||
Der Collector laeuft unter:
|
||||
|
||||
```text
|
||||
http://localhost:18110
|
||||
```
|
||||
|
||||
Er verwaltet Quellen und Datenpunkte in einer JSON-Datei (`/app/data/sources.json`) und schreibt aktive Punkte zyklisch in MariaDB.
|
||||
|
||||
### Collector-Endpunkte
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
| --- | --- | --- |
|
||||
| `GET` | `/health` | Healthcheck |
|
||||
| `GET` | `/capabilities` | Unterstuetzte Protokolle/Funktionen |
|
||||
| `GET` | `/sources` | Quellen lesen |
|
||||
| `POST` | `/sources` | Quelle anlegen |
|
||||
| `PUT` | `/sources/:id` | Quelle bearbeiten |
|
||||
| `DELETE` | `/sources/:id` | Quelle loeschen |
|
||||
| `GET` | `/datapoints` | Datenpunkte lesen |
|
||||
| `POST` | `/datapoints/manual` | Datenpunkt manuell anlegen |
|
||||
| `PATCH` | `/datapoints/:id` | Datenpunkt bearbeiten, aktivieren, deaktivieren |
|
||||
| `POST` | `/datapoints/:id/read` | Live-Wert lesen |
|
||||
| `POST` | `/imports/modbus-csv` | Modbus-CSV importieren |
|
||||
| `POST` | `/imports/knx-xml` | KNX-XML importieren |
|
||||
| `POST` | `/scan/opcua` | OPC-UA-Scan starten |
|
||||
| `POST` | `/scan/bacnet` | BACnet-Scan starten |
|
||||
| `GET` | `/debug` | Debugdaten lesen |
|
||||
|
||||
### Schreibmodus
|
||||
|
||||
| Modus | Bedeutung |
|
||||
| --- | --- |
|
||||
| `interval` | Jeder Poll wird geschrieben |
|
||||
| `cov` | Nur bei Wertaenderung wird geschrieben |
|
||||
|
||||
### Aktive vs. inaktive Datenpunkte
|
||||
|
||||
- Inaktive Datenpunkte sind gefunden/importiert, werden aber nicht geloggt.
|
||||
- Aktive Datenpunkte werden vom Collector gepollt und in die zugehoerige Trendtabelle geschrieben.
|
||||
- In der Weboberflaeche entspricht das der Trennung zwischen „Gefunden / importiert“ und „Wird geloggt“.
|
||||
|
||||
---
|
||||
|
||||
## Datenbank und Speicher
|
||||
|
||||
### MariaDB
|
||||
|
||||
MariaDB speichert:
|
||||
|
||||
- `app_users`
|
||||
- bestehende `isp...` Tabellen
|
||||
- neue `trend_...` Tabellen
|
||||
- Registry-Tabellen fuer Quellen und Datenpunkte, falls vom Collector/API genutzt
|
||||
|
||||
Die API kann bestehende breite Tabellen mit `Wert1`, `Wert2`, ... lesen. Neue lokale Trendtabellen koennen bis zu 2000 Werte unterstuetzen.
|
||||
|
||||
### Redis
|
||||
|
||||
Redis speichert:
|
||||
|
||||
- Rollen
|
||||
- Einheiten
|
||||
- Aliase und Tabellen-Metadaten
|
||||
- Auswahlen
|
||||
- Dashboard-Konfiguration
|
||||
- Benutzerpraeferenzen
|
||||
|
||||
Redis sollte deshalb ebenfalls gebackupt werden, nicht nur MariaDB.
|
||||
|
||||
---
|
||||
|
||||
## WAGO- oder SD-Karten-Betrieb
|
||||
|
||||
Fuer Systeme, bei denen persistente Daten auf SD-Karte liegen sollen, gibt es ein Override:
|
||||
|
||||
```powershell
|
||||
docker compose -f docker-compose.yml -f docker-compose.wago.yml up -d --build
|
||||
```
|
||||
|
||||
Dabei werden grosse Daten nach `/media/sd/seltd/...` gelegt:
|
||||
|
||||
```text
|
||||
/media/sd/seltd/mariadb
|
||||
/media/sd/seltd/redis
|
||||
/media/sd/seltd/collector
|
||||
/media/sd/seltd/dockhand
|
||||
```
|
||||
|
||||
Vorher sicherstellen:
|
||||
|
||||
```bash
|
||||
mkdir -p /media/sd/seltd/mariadb /media/sd/seltd/redis /media/sd/seltd/collector /media/sd/seltd/dockhand
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Backup und Restore
|
||||
|
||||
### MariaDB Backup
|
||||
|
||||
```powershell
|
||||
docker exec seltd-mariadb mariadb-dump -uroot -pSE3112 --all-databases > seltd-mariadb-backup.sql
|
||||
```
|
||||
|
||||
Restore:
|
||||
|
||||
```powershell
|
||||
type .\seltd-mariadb-backup.sql | docker exec -i seltd-mariadb mariadb -uroot -pSE3112
|
||||
```
|
||||
|
||||
### Redis Backup
|
||||
|
||||
Redis nutzt ein Docker-Volume. Fuer ein einfaches Dateibackup:
|
||||
|
||||
```powershell
|
||||
docker run --rm -v seltd_redis_data:/data -v ${PWD}:/backup alpine tar czf /backup/seltd-redis-backup.tar.gz -C /data .
|
||||
```
|
||||
|
||||
### Collector Backup
|
||||
|
||||
```powershell
|
||||
docker run --rm -v seltd_collector_data:/data -v ${PWD}:/backup alpine tar czf /backup/seltd-collector-backup.tar.gz -C /data .
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Deployment-Hinweise
|
||||
|
||||
### Nach Code-Aenderungen
|
||||
|
||||
Wenn Frontend oder API geaendert wurden:
|
||||
|
||||
```powershell
|
||||
docker compose build --no-cache web api collector
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Wenn nur `.env` geaendert wurde:
|
||||
|
||||
```powershell
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Browsercache
|
||||
|
||||
Bei alten JavaScript-Fehlern nach einem Fix:
|
||||
|
||||
```text
|
||||
Strg + F5
|
||||
```
|
||||
|
||||
oder Vite/Docker neu bauen.
|
||||
|
||||
### Nginx Proxy Manager
|
||||
|
||||
Wenn das Frontend hinter Nginx laeuft, muessen die API- und Collector-URLs sauber erreichbar sein. Entweder:
|
||||
|
||||
- Frontend, API und Collector unter eigenen Subdomains veroeffentlichen, oder
|
||||
- Nginx so konfigurieren, dass `/api` zur API und `/collector` zum Collector weitergeleitet wird.
|
||||
|
||||
In diesem Fall kann `VITE_API_URL` statt `VITE_API_PORT` gesetzt werden:
|
||||
|
||||
```env
|
||||
VITE_API_URL=https://trend-api.example.local/api
|
||||
VITE_COLLECTOR_URL=https://trend-collector.example.local
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Fehler: `NetworkError when attempting to fetch resource`
|
||||
|
||||
Ursachen:
|
||||
|
||||
- API-Container laeuft nicht
|
||||
- falscher Port im Frontend
|
||||
- CORS nicht korrekt
|
||||
- Browser ruft alte Version auf
|
||||
|
||||
Pruefen:
|
||||
|
||||
```powershell
|
||||
docker ps
|
||||
curl http://localhost:18080/api/health
|
||||
```
|
||||
|
||||
Wenn Frontend lokal auf `localhost:5173` laeuft:
|
||||
|
||||
```env
|
||||
CORS_ORIGIN=http://localhost:5173
|
||||
```
|
||||
|
||||
Danach API neu starten:
|
||||
|
||||
```powershell
|
||||
docker compose restart api
|
||||
```
|
||||
|
||||
### Fehler: Browser zeigt alte React-Fehler nach Fix
|
||||
|
||||
Sehr wahrscheinlich wurde das Docker-Image nicht neu gebaut.
|
||||
|
||||
```powershell
|
||||
docker compose down
|
||||
docker compose build --no-cache web api collector
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Danach im Browser `Strg + F5`.
|
||||
|
||||
### Fehler: `ReferenceError: editingCollectorPointId is not defined`
|
||||
|
||||
In `web/src/App.jsx` muss folgender State vorhanden sein:
|
||||
|
||||
```jsx
|
||||
const [editingCollectorPointId, setEditingCollectorPointId] = useState("");
|
||||
```
|
||||
|
||||
Wenn die Zeile vorhanden ist, der Fehler aber weiterhin erscheint, laeuft noch altes Build-/Container-Material.
|
||||
|
||||
### Fehler: `SyntaxError: missing ) after argument list` in `isp.js`
|
||||
|
||||
Bei SQL-Template-Strings muessen Backticks im String escaped werden:
|
||||
|
||||
```js
|
||||
missing.push(`ADD COLUMN \`${columnName}\` TEXT NULL`);
|
||||
```
|
||||
|
||||
### Fehler: `Rollup failed to resolve import "jspdf"`
|
||||
|
||||
Abhaengigkeiten im Frontend installieren:
|
||||
|
||||
```powershell
|
||||
cd web
|
||||
npm install jspdf xlsx recharts
|
||||
```
|
||||
|
||||
Bei Docker danach neu bauen.
|
||||
|
||||
### Source-Map-Warnungen im Browser
|
||||
|
||||
Warnungen wie diese sind in der Regel nicht kritisch:
|
||||
|
||||
```text
|
||||
Source map error: JSON.parse: unexpected character...
|
||||
```
|
||||
|
||||
Sie kommen oft aus Devtools/React-Devtools oder externen Source-Maps und koennen ignoriert werden, solange keine roten Laufzeitfehler auftreten.
|
||||
|
||||
### MariaDB Login oder DB-Verbindung fehlgeschlagen
|
||||
|
||||
Logs ansehen:
|
||||
|
||||
```powershell
|
||||
docker logs seltd-api --tail 100
|
||||
docker logs seltd-mariadb --tail 100
|
||||
```
|
||||
|
||||
Pruefen, ob MariaDB healthy ist:
|
||||
|
||||
```powershell
|
||||
docker ps
|
||||
```
|
||||
|
||||
### Redis-Probleme
|
||||
|
||||
```powershell
|
||||
docker exec seltd-redis redis-cli ping
|
||||
```
|
||||
|
||||
Erwartet:
|
||||
|
||||
```text
|
||||
PONG
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Nuetzliche Befehle
|
||||
|
||||
### Alle Container anzeigen
|
||||
|
||||
```powershell
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
### Logs live verfolgen
|
||||
|
||||
```powershell
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
Nur API:
|
||||
|
||||
```powershell
|
||||
docker logs seltd-api -f
|
||||
```
|
||||
|
||||
Nur Frontend:
|
||||
|
||||
```powershell
|
||||
docker logs seltd-web -f
|
||||
```
|
||||
|
||||
Nur Collector:
|
||||
|
||||
```powershell
|
||||
docker logs seltd-collector -f
|
||||
```
|
||||
|
||||
### Komplett neu starten
|
||||
|
||||
```powershell
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
### Komplett neu bauen
|
||||
|
||||
```powershell
|
||||
docker compose down
|
||||
docker compose build --no-cache
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### Volumes loeschen
|
||||
|
||||
Achtung: Dadurch gehen Daten verloren.
|
||||
|
||||
```powershell
|
||||
docker compose down -v
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Sicherheits-Checkliste
|
||||
|
||||
Vor produktiver Nutzung:
|
||||
|
||||
- [ ] `JWT_SECRET` auf langen zufaelligen Wert setzen
|
||||
- [ ] Admin-Passwort aendern
|
||||
- [ ] MariaDB-Root-Passwort aendern
|
||||
- [ ] `CORS_ORIGIN` nicht auf `*` lassen, sondern feste Domain setzen
|
||||
- [ ] MariaDB-Port `3306` nicht ungeschuetzt ins Internet veroeffentlichen
|
||||
- [ ] Redis-Port `6379` nicht ungeschuetzt ins Internet veroeffentlichen
|
||||
- [ ] Dockhand absichern oder nur intern bereitstellen
|
||||
- [ ] Backups fuer MariaDB, Redis und Collector-Daten einrichten
|
||||
- [ ] Reverse Proxy mit HTTPS verwenden
|
||||
|
||||
---
|
||||
|
||||
## Bekannte Hinweise
|
||||
|
||||
- Leere Trendtabellen erscheinen nicht in der Trendauswahl, aber im Admin-Bereich.
|
||||
- Bestehende breite `isp...` Tabellen bleiben kompatibel.
|
||||
- Neue lokale Tabellen koennen als `trend_...` Tabellen angelegt werden.
|
||||
- Der Collector speichert seine Quellen/Datenpunkte aktuell dateibasiert in `sources.json`.
|
||||
- Fuer vollstaendige Protokollintegration muessen je nach Feldbus noch Details wie Adressierung, Datentyp, Byteorder und Authentifizierung sauber projektspezifisch gepflegt werden.
|
||||
|
||||
---
|
||||
|
||||
## Kurzfassung fuer Betrieb
|
||||
|
||||
```powershell
|
||||
cd C:\Projects\SeLTD
|
||||
copy .env.example .env
|
||||
notepad .env
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Dann aufrufen:
|
||||
|
||||
```text
|
||||
http://localhost:5173
|
||||
```
|
||||
|
||||
Login:
|
||||
|
||||
```text
|
||||
admin / ChangeMe123!
|
||||
```
|
||||
|
||||
Bei Code-Aenderungen:
|
||||
|
||||
```powershell
|
||||
docker compose build --no-cache web api collector
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user