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

2.7 KiB

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:

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:

pg_dump --format=custom --file=companytool.dump "$DATABASE_URL"
pg_restore --clean --if-exists --dbname "$DATABASE_URL" companytool.dump

Dokumente:

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:

docker compose up -d postgres

PostgreSQL und Backend:

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:

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