feat: Add password reset functionality with request and reset forms
feat: Implement price list import feature with preview and apply options feat: Create price rules management page with CRUD operations feat: Develop quotes management page with itemized quotes and status tracking feat: Introduce organization registration page for new users feat: Build suppliers management page with detailed supplier information feat: Create users management page for inviting and managing roles chore: Add TypeScript configuration for improved type checking chore: Set up Vite configuration for development server and API proxy chore: Add Vite environment type definitions for better TypeScript support
This commit is contained in:
97
BETRIEB.md
Normal file
97
BETRIEB.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# Betrieb
|
||||
|
||||
## Authentifizierung
|
||||
|
||||
- Passwörter werden mit Argon2id gehasht.
|
||||
- Initialpasswörter erzwingen `must_change_password`.
|
||||
- Passwort-Reset erfolgt über kurzlebige Tokens aus `password_reset_tokens`.
|
||||
- Firmen-Einladungen verwenden Tokens aus `user_invitations.token_hash`.
|
||||
- Nach Passwort-Reset werden bestehende Sessions widerrufen.
|
||||
|
||||
## E-Mail
|
||||
|
||||
E-Mail-Inhalte werden in `email_outbox` verschlüsselt gespeichert. Im
|
||||
Entwicklungsmodus werden Tokens zusätzlich in API-Antworten ausgegeben. Im
|
||||
Produktivbetrieb werden keine Passwörter oder Tokens in API-Antworten geliefert.
|
||||
|
||||
Transportmodi:
|
||||
|
||||
- `COMPANYTOOL_EMAIL_TRANSPORT=outbox`: nur verschlüsselte Ablage in PostgreSQL.
|
||||
- `COMPANYTOOL_EMAIL_TRANSPORT=file`: zusätzliche Zustellung als JSON-Datei in
|
||||
`COMPANYTOOL_EMAIL_FILE_DIR`.
|
||||
|
||||
SMTP kann später als weiterer Transport hinter demselben Outbox-Modell ergänzt
|
||||
werden.
|
||||
|
||||
## Verschlüsselungsschlüssel
|
||||
|
||||
Produktiv müssen gesetzt sein:
|
||||
|
||||
```env
|
||||
COMPANYTOOL_DATA_KEY_ID=prod-data-key-v1
|
||||
COMPANYTOOL_DATA_KEY_BASE64=<32-byte-key-base64>
|
||||
```
|
||||
|
||||
Der Key muss außerhalb der Datenbank gesichert werden. Ohne diesen Key können
|
||||
verschlüsselte Firmen-, Dokument- und Kommunikationsdaten nicht wiederhergestellt
|
||||
werden.
|
||||
|
||||
Key-Rotation ist vorbereitet über `*_key_id`-Spalten. Ablauf:
|
||||
|
||||
1. neuen Key als `COMPANYTOOL_DATA_KEY_ID` bereitstellen
|
||||
2. neue Schreibvorgänge mit neuem Key speichern
|
||||
3. Re-Encryption-Job für alte Datensätze implementieren und ausführen
|
||||
4. alten Key erst nach verifiziertem Backup entfernen
|
||||
|
||||
## Backup und Restore
|
||||
|
||||
PostgreSQL:
|
||||
|
||||
```bash
|
||||
pg_dump --format=custom --file=companytool.dump "$DATABASE_URL"
|
||||
pg_restore --clean --if-exists --dbname "$DATABASE_URL" companytool.dump
|
||||
```
|
||||
|
||||
Dokumente:
|
||||
|
||||
```bash
|
||||
tar -C storage -czf companytool-documents.tar.gz documents
|
||||
tar -C storage -xzf companytool-documents.tar.gz
|
||||
```
|
||||
|
||||
Für einzelne Firmen müssen das jeweilige `company_*`-Schema und der passende
|
||||
Ordner unter `storage/documents/<schema>` gemeinsam gesichert werden.
|
||||
|
||||
## Docker
|
||||
|
||||
Nur PostgreSQL:
|
||||
|
||||
```bash
|
||||
docker compose up -d postgres
|
||||
```
|
||||
|
||||
PostgreSQL und Backend:
|
||||
|
||||
```bash
|
||||
docker compose --profile backend up -d
|
||||
```
|
||||
|
||||
## TLS und Reverse Proxy
|
||||
|
||||
Das Backend bleibt intern auf HTTP/WSS hinter einem Reverse Proxy. Öffentlich
|
||||
muss ausschließlich HTTPS/WSS erreichbar sein. Ein nginx-Beispiel liegt unter:
|
||||
|
||||
```text
|
||||
deploy/nginx-companytool.conf
|
||||
```
|
||||
|
||||
## Lokale Einzelkunden-Installation
|
||||
|
||||
Für lokale Installationen bleibt `dev_bootstrap-local` als Entwicklungs- und
|
||||
Installationshelfer vorgesehen. Ein späteres Installationsprogramm soll:
|
||||
|
||||
- PostgreSQL-Verbindung prüfen
|
||||
- lokale Firma anlegen
|
||||
- ersten Besitzer anlegen
|
||||
- Backend- und Client-Konfiguration schreiben
|
||||
- Dokumentenordner und Schlüsseldatei vorbereiten
|
||||
Reference in New Issue
Block a user