v1.1.0: Production-readiness Release
- Backend + Frontend package.json: 1.0.0 → 1.1.0
- README:
- Version-Badge oben
- Features-Liste erweitert (Auto-Status, Monitoring, Hardening)
- Neue "Production-Deployment"-Sektion mit Pflicht-Env, Reverse-Proxy-
Hinweis, Default-Passwort-Warnung und Verweisen auf TESTING.md +
SECURITY-HARDENING.md
- Changelog für 1.1.0 + 1.0.0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a8d42dd36d
commit
d57a9d01c1
91
README.md
91
README.md
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
Web-basiertes CRM-System für Kundenverwaltung mit Verträgen (Energie, Telekommunikation, KFZ-Versicherung).
|
||||
|
||||
**Version: 1.1.0** ([Changelog](#changelog))
|
||||
|
||||
## Features
|
||||
|
||||
- **Kundenverwaltung**: Privat- und Geschäftskunden mit Stammdaten
|
||||
|
|
@ -11,6 +13,9 @@ Web-basiertes CRM-System für Kundenverwaltung mit Verträgen (Energie, Telekomm
|
|||
- **Zähler**: Strom-/Gaszähler mit Zählerstandhistorie
|
||||
- **Rechnungen**: Rechnungsverwaltung für Energieverträge mit Dokumenten-Upload
|
||||
- **Vertrags-Cockpit**: Dashboard zur Überwachung offener Aufgaben (fehlende Dokumente, Rechnungen)
|
||||
- **Auto-Vertragsstatus**: Lieferbestätigung-Upload setzt `DRAFT` → `ACTIVE` (mit Vertragsbeginn),
|
||||
Kündigungsbestätigung-Upload setzt `ACTIVE` → `CANCELLED` (mit Datum),
|
||||
nightly-Cron setzt `ACTIVE`-Verträge mit abgelaufenem `endDate` auf `EXPIRED`
|
||||
- **Verträge**:
|
||||
- Energie (Strom, Gas)
|
||||
- Telekommunikation (DSL, Glasfaser, Mobilfunk, TV)
|
||||
|
|
@ -20,7 +25,14 @@ Web-basiertes CRM-System für Kundenverwaltung mit Verträgen (Energie, Telekomm
|
|||
- **Email-Provisionierung**: Automatische E-Mail-Weiterleitung bei Plesk/cPanel/DirectAdmin
|
||||
- **Berechtigungssystem**: Admin, Mitarbeiter, Nur-Lesen, Kundenportal
|
||||
- **Verschlüsselte Zugangsdaten**: Portal-Passwörter AES-256-GCM verschlüsselt
|
||||
- **DSGVO-Compliance**: Audit-Logging, Einwilligungsverwaltung, Datenexport, Löschanfragen
|
||||
- **DSGVO-Compliance**: Audit-Logging mit Hash-Chain-Integritätsprüfung,
|
||||
Einwilligungsverwaltung, Datenexport, Löschanfragen
|
||||
- **Sicherheits-Monitoring**: Realtime-Logging von Login-Fehlversuchen, IDOR-Abwehr,
|
||||
SSRF-Blocks, JWT-Manipulation; Threshold-Detection (Brute-Force, IDOR-Probing) mit
|
||||
Sofort-E-Mail-Alerts und stündlichem Digest – siehe Einstellungen → Monitoring
|
||||
- **Production-Hardening**: 10 dokumentierte Hardening-Runden inkl. CORS, Helmet,
|
||||
IDOR-Schutz, Rate-Limiting, SSRF/DNS-Rebinding-Block, Per-File-Ownership-Check, mehr
|
||||
in [docs/SECURITY-HARDENING.md](docs/SECURITY-HARDENING.md)
|
||||
- **Developer-Tools**: Datenbank-Browser und interaktives ER-Diagramm
|
||||
|
||||
## Tech Stack
|
||||
|
|
@ -140,6 +152,39 @@ Nach dem Seed sind folgende Zugangsdaten verfügbar:
|
|||
- **E-Mail:** admin@admin.com
|
||||
- **Passwort:** admin
|
||||
|
||||
> **Wichtig:** Vor dem ersten Production-Deployment das Default-Passwort sofort
|
||||
> ändern und Secrets rotieren – siehe [Production-Deployment](#production-deployment).
|
||||
|
||||
## Production-Deployment
|
||||
|
||||
Vor dem öffentlichen Schalten der Instanz muss in der Production-`.env`:
|
||||
|
||||
```env
|
||||
NODE_ENV=production
|
||||
|
||||
# Pflicht-Rotation – per `openssl rand` neu generieren!
|
||||
JWT_SECRET=$(openssl rand -hex 64) # min. 32 Zeichen
|
||||
ENCRYPTION_KEY=$(openssl rand -hex 32) # genau 64 Hex-Zeichen
|
||||
|
||||
# Backend nur lokal lauschen lassen, public-Verkehr läuft über Reverse-Proxy
|
||||
LISTEN_ADDR=127.0.0.1
|
||||
|
||||
# Bei separatem Frontend-Host: erlaubte Origins
|
||||
CORS_ORIGINS=https://crm.deine-domain.de
|
||||
```
|
||||
|
||||
Plus:
|
||||
|
||||
- **Reverse-Proxy** (Nginx/Plesk) so konfigurieren, dass `X-Forwarded-For` hart auf
|
||||
die echte Client-IP gesetzt wird (nicht nur angefügt) – sonst Rate-Limit-Bypass möglich.
|
||||
- **Default-Admin-Passwort ändern** (admin@admin.com / admin).
|
||||
- **Manuelle Test-Checkliste** aus [docs/TESTING.md](docs/TESTING.md) einmal komplett
|
||||
durchklicken.
|
||||
- **Monitoring konfigurieren**: Einstellungen → Sicherheits-Monitoring → Alert-E-Mail
|
||||
hinterlegen, Test-Alert senden, Digest aktivieren.
|
||||
- Vollständige Hardening-Story + restliche Trade-offs:
|
||||
[docs/SECURITY-HARDENING.md](docs/SECURITY-HARDENING.md)
|
||||
|
||||
## Developer-Tools aktivieren
|
||||
|
||||
Die Developer-Tools (Datenbankstruktur, ER-Diagramm) sind standardmäßig für Admins verfügbar. Falls der Menüpunkt nicht erscheint:
|
||||
|
|
@ -1105,6 +1150,50 @@ ersetzt.
|
|||
- **Versionskontrolle**: Die entpackten JSON-Dateien unter Versionskontrolle
|
||||
stellen (außerhalb von `backend/factory-defaults/`, da der Ordner gitignored ist)
|
||||
|
||||
## Changelog
|
||||
|
||||
### 1.1.0 (2026-05-01)
|
||||
|
||||
**Production-readiness** – die Version, die wirklich öffentlich gehen darf.
|
||||
|
||||
- 🛡 **Security-Hardening**: 10 Runden statisches + dynamisches Audit, vollständig
|
||||
dokumentiert in [docs/SECURITY-HARDENING.md](docs/SECURITY-HARDENING.md)
|
||||
(CORS/Helmet/JWT, IDOR-Schutz an 30+ Endpoints, Mass-Assignment-Whitelists,
|
||||
Zip-Slip, Path-Traversal, Login-Timing-Side-Channel, XFF-Rate-Limit-Bypass,
|
||||
Customer-Liste-Leak, SSRF + DNS-Rebinding, Per-File-Ownership statt
|
||||
freiem `/api/uploads`, JWT-Logout, Audit-Log-Hash-Chain).
|
||||
- 🚨 **Sicherheits-Monitoring**: neue `SecurityEvent`-Tabelle + Hooks an Login,
|
||||
Logout, Rate-Limit-Hit, IDOR-Abwehr, SSRF-Block, Password-Reset, JWT-Reject.
|
||||
Threshold-Detection (Brute-Force, IDOR-Probing, SSRF-Probing) erzeugt
|
||||
CRITICAL-Events. **Sofort-E-Mail-Alerts** für CRITICAL + **stündlicher Digest**
|
||||
für HIGH/MEDIUM. UI in Einstellungen → Monitoring mit Filter, Pagination,
|
||||
Log-leeren (mit optionalem Tage-Filter) und Test-Alert-Button.
|
||||
- 🔄 **Auto-Vertragsstatus**:
|
||||
- Lieferbestätigung-Upload → `DRAFT` → `ACTIVE` + `startDate`
|
||||
- Kündigungsbestätigung-Upload → `ACTIVE` → `CANCELLED` + `cancellationConfirmationDate`
|
||||
(mit Datums-Modal beim Upload)
|
||||
- Nightly-Cron 02:00: alle `ACTIVE`-Verträge mit `endDate < heute` → `EXPIRED`
|
||||
- 🔐 **Lazy bcrypt-Rehash**: Bestandshashes mit Cost 10 werden beim nächsten
|
||||
Login transparent auf Cost 12 geupgradet.
|
||||
- 🚪 **Logout-Endpoint** `POST /api/auth/logout`: invalidiert JWTs serverseitig
|
||||
über `tokenInvalidatedAt`.
|
||||
- 📦 **`npm audit fix`**: 8 transitive Vulnerabilities gefixt (lodash,
|
||||
path-to-regexp, undici, minimatch).
|
||||
|
||||
### 1.0.0
|
||||
|
||||
Erste Release-Version.
|
||||
|
||||
- Kunden-, Vertrags-, Adress-, Bankkarten-, Ausweis- und Zählerverwaltung
|
||||
- Energie-/Telekommunikations-/KFZ-Verträge mit typspezifischen Details
|
||||
- Vertrags-Cockpit mit Rechnungsprüfung
|
||||
- E-Mail-Client mit Anhang-Verwaltung
|
||||
- DSGVO-Compliance: Audit-Log, Einwilligungen, Datenexport, Löschanfragen
|
||||
- PDF-Auftragsvorlagen-System mit visueller Feldzuordnung
|
||||
- Factory-Defaults für Stammdaten-Kataloge
|
||||
- Mandantenfähigkeit über `customerEmailLabel` pro Provider
|
||||
- Passwort-Reset-Flow + Rate-Limiting + Auto-Geburtstagsgrüße
|
||||
|
||||
## Lizenz
|
||||
|
||||
MIT
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "opencrm-backend",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"description": "OpenCRM Backend API",
|
||||
"main": "dist/index.js",
|
||||
"prisma": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "opencrm-frontend",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
|
|
|
|||
Loading…
Reference in New Issue