Files
pfandsystem-demo/dokumentationen/MIGRATION.md
christian d86c898455 chore: initial scaffold (Whitelabel-Fork von Pfandsystem)
- Source-Copy von /root/entwicklung/pfandsystem
- docker-compose.yml umgeschrieben: pfandsystem-demo-* Container, Ports 3308/8083/3003 (alle localhost)
- Traefik-Label fuer pfandsystem.dockly.de
- Erweitertes Multi-Tenant-Schema (tenants, tenant_id auf allen Tabellen)
- Neue Tabellen: kunden_bilder, geraete
- Neue Spalten: kunden.anlieferungshinweis, kunden.lieferzeit_bis
- Rollen: superadmin, admin, user, fahrer
- .env.example + README

Code-Refactor (Tailwind, Multi-Tenant-Middleware, Erweiterungen) folgt.
2026-05-26 12:39:17 +00:00

5.9 KiB

Migration von Supabase zu MySQL - Zusammenfassung

Durchgeführte Änderungen

1. Backend (Node.js/Express)

Neu erstellt:

  • /backend/server.js - Hauptserver mit Express
  • /backend/config/database.js - MySQL-Verbindung
  • /backend/middleware/auth.js - JWT-Authentifizierung
  • /backend/middleware/upload.js - Multer File-Upload
  • /backend/routes/ - Alle API-Routen (auth, kunden, artikel, lieferungen, ruecknahmen, mitarbeiter)
  • /backend/database/schema.sql - MySQL-Schema (konvertiert von PostgreSQL)
  • /backend/scripts/create-admin.js - Admin-Benutzer erstellen

Features:

  • JWT-basierte Authentifizierung (ersetzt Supabase Auth)
  • Bcrypt Passwort-Hashing
  • Rollen-basierte Zugriffskontrolle (user/admin)
  • File-Upload mit Multer (ersetzt S3/Supabase Storage)
  • Resend Email-Integration
  • MySQL2 mit Connection Pooling

2. Frontend (React)

Geänderte Dateien:

  • /src/api/client.js - Neuer API-Client (ersetzt Supabase Client)
  • /src/App.jsx - Auth-Flow angepasst
  • /src/components/Auth/Login.jsx - Login mit neuem API
  • /src/components/Auth/Logout.jsx - Logout angepasst
  • /src/components/KundenVerwaltung.jsx - API-Calls angepasst
  • /src/components/MitarbeiterVerwaltung.jsx - API-Calls + Passwort-Feld
  • /src/components/Eingabe/VorgangForm.jsx - File-Upload angepasst
  • /src/components/Dashboard/VorgangsListe.jsx - Datenstruktur angepasst
  • /src/components/Dashboard/AdminDashboard.jsx - API-Calls angepasst

Entfernt:

  • @supabase/supabase-js Dependency
  • /src/supabase/client.js (bleibt für Referenz, wird nicht mehr verwendet)

3. Datenbank

MySQL-Schema:

  • mitarbeiter - Mit email/password_hash statt supabase_user_id
  • kunden - Unverändert
  • artikel - Unverändert
  • lieferungen - Foto-URL zeigt auf lokalen Upload-Ordner
  • ruecknahmen - Foto-URL zeigt auf lokalen Upload-Ordner

Wichtige Änderungen:

  • UUID → CHAR(36) mit UUID()
  • SERIAL → INT AUTO_INCREMENT
  • timestamp with time zone → TIMESTAMP
  • Foreign Keys auf auth.users entfernt

4. Docker & Deployment

docker-compose.yml:

  • MySQL 8.0 Container
  • phpMyAdmin Container
  • Backend API Container
  • Frontend nginx Container
  • Volumes für Datenbank und Uploads

nginx.conf:

  • Proxy für /api/ → Backend
  • Proxy für /uploads/ → Backend
  • HTTPS-Konfiguration beibehalten
  • Let's Encrypt Integration

5. Umgebungsvariablen

Frontend (.env):

VITE_API_URL=https://pfandsystem.backdigital.de/api

Backend (.env):

DB_HOST=mysql
DB_PORT=3306
DB_USER=pfandsystem
DB_PASSWORD=***
DB_NAME=pfandsystem
JWT_SECRET=***
RESEND_API_KEY=re_6BE6Hv6U_H7ggkAT4ApbiSZ5SCo2Cf1qA

🚀 Deployment-Anleitung

Erstmaliges Setup

  1. Umgebungsvariablen konfigurieren:

    # Backend .env anpassen
    nano backend/.env
    
    # Frontend .env anpassen
    nano .env
    
  2. Docker Compose starten:

    docker-compose up -d
    
  3. Admin-Benutzer erstellen:

    docker exec -it pfandsystem-backend node scripts/create-admin.js
    
  4. Login testen:

Updates deployen

./deploy.sh

Oder manuell:

npm run build
node fix-manifest-link.cjs
docker-compose build
docker-compose up -d

🔐 Sicherheit

Wichtige Änderungen

  1. Passwörter: Alle Passwörter werden mit bcrypt gehasht (10 Rounds)
  2. JWT: Tokens sind 24h gültig
  3. File Upload: Nur Bilder erlaubt, max 10MB
  4. CORS: Konfiguriert für Frontend-Domain

Zu ändern vor Produktion

  • JWT_SECRET in backend/.env
  • MySQL Root-Passwort in docker-compose.yml
  • MySQL User-Passwort in docker-compose.yml und backend/.env
  • Admin-Passwort nach erstem Login
  • HTTPS-Zertifikate prüfen

📊 API-Änderungen

Authentifizierung

Vorher (Supabase):

const { data, error } = await supabase.auth.signInWithPassword({ email, password });

Nachher (Custom API):

const data = await api.login(email, password);

Daten abrufen

Vorher (Supabase):

const { data } = await supabase.from('kunden').select('*');

Nachher (Custom API):

const data = await api.getKunden();

File Upload

Vorher (Supabase Storage):

const { data } = await supabase.storage.from('belegfotos').upload(fileName, file);

Nachher (Multer):

await api.createLieferung({ kunde_id, artikel_id, anzahl }, foto);

🐛 Bekannte Probleme & Lösungen

Problem: Backend startet nicht

Lösung:

docker-compose logs backend
# Prüfe Datenbank-Verbindung
docker-compose restart mysql

Problem: Frontend zeigt keine Daten

Lösung:

  1. API-URL in .env prüfen
  2. Browser-Cache leeren
  3. Service Worker deregistrieren

Problem: Login funktioniert nicht

Lösung:

  1. Admin-Benutzer erstellen: docker exec -it pfandsystem-backend node scripts/create-admin.js
  2. JWT_SECRET in backend/.env prüfen
  3. Backend-Logs prüfen: docker-compose logs backend

📝 Nächste Schritte

Sofort

  • Alle Passwörter ändern
  • Admin-Login testen
  • Daten aus Supabase exportieren und importieren
  • Funktionstest aller Features

Optional

  • Email-Benachrichtigungen mit Resend testen
  • Backup-Strategie einrichten
  • Monitoring einrichten
  • CI/CD Pipeline aufsetzen

📧 Support

Bei Fragen zur Migration:

  • Backend-Logs: docker-compose logs -f backend
  • Frontend-Logs: Browser DevTools Console
  • Datenbank: phpMyAdmin auf http://localhost:8081

🎉 Fertig!

Die Migration ist abgeschlossen. Das System ist jetzt vollständig unabhängig von Supabase und läuft mit:

  • MySQL Datenbank
  • Node.js/Express Backend
  • React Frontend
  • Docker Compose
  • HTTPS/SSL
  • phpMyAdmin
  • Lokaler File Storage