Files
opencrm/docker
duffyduck cf8c6c84c2 Security-Hardening Runde 15: Pentest Runde 12 Folge-Fixes
M2-Reste – XSS-Strings + Mass-Assignment-Settings noch in DB:
Idempotentes Cleanup-Script prisma/cleanup-xss-and-mass-assignment.ts.
Strippt HTML aus Customer/User-String-Feldern, entfernt AppSettings
ohne Whitelist-Eintrag. Wird im entrypoint.sh nach Migrations + Seed
einmalig pro Container-Start ausgeführt.

User-Update + password-Feld:
password aus USER_UPDATABLE_FIELDS raus (CREATE behält es), neuer
dedizierter Endpoint POST /api/users/:id/password mit Audit-Log
"Passwort … durch Admin gesetzt" und Komplexitäts-Check.

JS-Runtime-Fehler-Leak:
ORM_LEAK_PATTERNS um TypeError/ReferenceError/SyntaxError/RangeError +
"Cannot read properties of undefined/null" + "is not a function/
defined" erweitert. Greift im globalen res.json()-Wrapper.

POST /contracts substring-Crash:
Controller validiert type/customerId, sonst 400. generateContractNumber
fängt nullish type ab (Fallback "CON").

Seed-Admin-Passwort:
Default "admin" verletzte 12-Zeichen-Policy. Jetzt 16-char
Zufallspasswort (alle 4 Klassen garantiert via Fisher-Yates) oder per
SEED_ADMIN_PASSWORD-ENV überschreibbar. BCRYPT-Cost 12 (war 10).
Passwort wird einmalig in stdout ausgegeben mit Warnung.

AppSettings-Whitelist: companyName + defaultEmailDomain ergänzt
(kamen aus seed.ts, in 1. Whitelist vergessen).

Live-verifiziert:
- POST /contracts {} → 400 "Vertrags-Typ erforderlich" (vorher
  TypeError-Stack)
- PUT /users/6 {password:"HackerPW2026!"} → 200 aber Login mit altem
  PW geht weiter
- POST /users/6/password mit "kurz" → 400 mit Komplexitäts-Fehlern
- Cleanup-Script: planted XSS bereinigt, hackerSetting+debugMode
  entfernt, idempotenter Re-Lauf

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:09:13 +02:00
..
2026-02-08 19:59:49 +01:00
2026-02-08 19:59:49 +01:00
2026-02-08 19:59:49 +01:00
2026-02-08 19:59:49 +01:00
2026-02-08 19:59:49 +01:00

OpenCRM Docker Deployment

Schnellstart

  1. Umgebungsvariablen konfigurieren:

    cd docker
    cp .env.example .env
    nano .env  # Sichere Werte setzen
    
  2. Container starten (erster Start mit RUN_SEED=true):

    docker compose up -d
    

    Beim ersten Start wird automatisch:

    • Auf die Datenbank gewartet
    • Migrationen ausgeführt
    • Seed-Daten geladen (wenn RUN_SEED=true)
  3. Nach erfolgreicher Installation:

    # RUN_SEED in .env auf false setzen
    sed -i 's/RUN_SEED=true/RUN_SEED=false/' .env
    
  4. Anwendung aufrufen:

    • Mit Domain: https://your-domain.com
    • Lokal: http://localhost
  5. Login:

    • E-Mail: admin@admin.com
    • Passwort: admin

Architektur

                    ┌─────────────┐
                    │   Caddy     │
                    │  (SSL/TLS)  │
                    │   :80/:443  │
                    └──────┬──────┘
                           │
                    ┌──────▼──────┐
                    │   OpenCRM   │
                    │   (Node.js) │
                    │    :3001    │
                    └──────┬──────┘
                           │
                    ┌──────▼──────┐
                    │   MariaDB   │
                    │    :3306    │
                    └─────────────┘

Befehle

Container verwalten

# Starten
docker compose up -d

# Stoppen
docker compose down

# Logs anzeigen
docker compose logs -f app

# Neustart
docker compose restart app

Datenbank

# Migration ausführen
docker compose exec app npx prisma migrate deploy

# Seed-Daten laden
docker compose exec app npx tsx prisma/seed.ts

# Prisma Studio (Datenbank-UI)
docker compose exec app npx prisma studio

Backup & Restore

# Backup-Verzeichnis ist unter /app/backups gemountet
# Backups werden über die Anwendung erstellt/wiederhergestellt

Update

# Image neu bauen und Container aktualisieren
docker compose build --no-cache
docker compose up -d
# Migrationen werden automatisch beim Start ausgeführt

Volumes

Volume Beschreibung
mariadb_data Datenbank-Dateien
uploads_data Hochgeladene Dokumente
backups_data Backup-Dateien
caddy_data SSL-Zertifikate
caddy_config Caddy-Konfiguration

SSL-Zertifikat

Caddy holt automatisch ein Let's Encrypt Zertifikat wenn:

  • Die Domain in .env korrekt gesetzt ist
  • Port 80 und 443 von außen erreichbar sind
  • DNS auf den Server zeigt

Für lokale Entwicklung mit DOMAIN=localhost wird ein selbstsigniertes Zertifikat verwendet.

Troubleshooting

Container startet nicht

docker compose logs app

Datenbank-Verbindung fehlgeschlagen

# Warten bis MariaDB bereit ist
docker compose logs db

SSL-Zertifikat Probleme

docker compose logs caddy
# Caddy-Daten zurücksetzen
docker compose down
docker volume rm opencrm_caddy_data opencrm_caddy_config
docker compose up -d