# 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
