christian 43c75e5dd3 feat(backend): multi-tenant refactor + Geraete + Kundenbilder
Middleware:
- requireTenant prueft tenant_id, Status und Demo-Ablauf (autom. Status-Update)
- requireSuperAdmin fuer cross-tenant Endpoints
- JWT enthaelt jetzt tenant_id

Auth:
- Login: SuperAdmin (tenant_id=NULL) ODER tenant-scoped User
- Demo-Ablaufs-Check beim Login

Neue Routes:
- /api/tenants  (SuperAdmin: Demo-Accounts anlegen mit 30-Tage-Default,
                 Mail-Invite via Resend, Sample-Daten-Seed automatisch,
                 verlaengern, deaktivieren)
- /api/geraete  (Seriennummern-Verwaltung mit Kunde-Zuordnung)
- /api/kunden-bilder/:kunde_id (Foto-Upload, max 5/Kunde)

Bestehende Routes:
- alle tenant_id-scoped (SELECT/UPDATE/DELETE)
- kunden: anlieferungshinweis + lieferzeit_bis Felder
- Cross-tenant-Refs (kunde_id/artikel_id) werden gegen Tenant validiert

Lib:
- lib/mail.js (Resend, mit Dev-Fallback)
- lib/seed.js (5 Kunden, 3 Artikel, 6 Lieferungen, 2 Geraete)
- scripts/bootstrap.js (legt SuperAdmin aus env-Vars beim Start an)

server.js: neue Routes + bootstrap-Call
2026-05-26 12:47:17 +00:00

Pfandsystem Demo (Whitelabel)

Whitelabel-Demo des Pfandsystems mit Multi-Tenant-Verwaltung für 30-Tage Demo-Accounts. Basis: borbaecker-pfand.dockly.de — neu aufgesetzt mit Tailwind-UI, ohne Branding.

  • Domain: pfandsystem.dockly.de
  • Server: 51.15.249.253 (Scaleway, borbaecker-pfand.dockly.de Instanz)
  • Pfad auf Server: /root/pfandsystem-demo
  • Gitea: ssh://git@49.13.154.75:2244/christian/pfandsystem-demo.git

Architektur

  • Frontend: React 18 + Vite + Tailwind, PWA-fähig
  • Backend: Node.js (Express) + MySQL 8 + JWT
  • Reverse-Proxy: Traefik v3 (geteilt mit borbaecker + pfandsystem-dev)
  • Container: pfandsystem-demo-{mysql,phpmyadmin,backend,frontend}
  • Ports (alle 127.0.0.1): MySQL 3308, phpMyAdmin 8083, Backend 3003

Multi-Tenant-Modell

Eine MySQL-DB, jede Datentabelle hat eine tenant_id. Mitarbeiter sind einem Tenant zugeordnet — Ausnahme: rolle='superadmin' mit tenant_id=NULL, darf neue Demo-Tenants anlegen.

Demo-Tenants haben typ='demo' + demo_expires_at (default +30 Tage). Nach Ablauf wird status='abgelaufen' gesetzt (Cron).

Erweiterungen (Iteration 1)

  1. Kundenbilder & Anlieferungshinweisekunden_bilder-Tabelle + kunden.anlieferungshinweis
  2. Seriennummern-Verwaltunggeraete-Tabelle (Typ, SN, Status, Kunde-Zuordnung)
  3. Tourenplanung Stufe 1 — Navi-Button (Maps-Link), kunden.lieferzeit_bis

BBN-Schnittstelle vorerst nicht enthalten (klärungsbedürftig).

Deployment

ssh -i ~/.ssh/id_rsa root@51.15.249.253
cd /root/pfandsystem-demo
cp .env.example .env  # Werte setzen!
docker-compose up -d --build
# Traefik in das Netzwerk joinen (einmalig):
docker network connect pfandsystem-demo_pfandsystem-demo-net pfandsystem-traefik
Description
Pfandsystem Whitelabel Demo (Multi-Tenant, Tailwind UI)
Readme 440 KiB
Languages
JavaScript 95.7%
Shell 2.2%
CSS 1.2%
Dockerfile 0.5%
HTML 0.4%