Files
company-tool/BETRIEB.md
Torsten Schulz (local) 0e539710c0 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
2026-06-02 15:28:38 +02:00

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