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
98 lines
2.7 KiB
Markdown
98 lines
2.7 KiB
Markdown
# 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
|