# 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/` 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