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
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-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 inCOMPANYTOOL_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:
- neuen Key als
COMPANYTOOL_DATA_KEY_IDbereitstellen - neue Schreibvorgänge mit neuem Key speichern
- Re-Encryption-Job für alte Datensätze implementieren und ausführen
- 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