# 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:** ```bash # Backend .env anpassen nano backend/.env # Frontend .env anpassen nano .env ``` 2. **Docker Compose starten:** ```bash docker-compose up -d ``` 3. **Admin-Benutzer erstellen:** ```bash docker exec -it pfandsystem-backend node scripts/create-admin.js ``` 4. **Login testen:** - URL: https://pfandsystem.backdigital.de - Email: admin@pfandsystem.de - Passwort: admin123 (ÄNDERN!) ### Updates deployen ```bash ./deploy.sh ``` Oder manuell: ```bash 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):** ```javascript const { data, error } = await supabase.auth.signInWithPassword({ email, password }); ``` **Nachher (Custom API):** ```javascript const data = await api.login(email, password); ``` ### Daten abrufen **Vorher (Supabase):** ```javascript const { data } = await supabase.from('kunden').select('*'); ``` **Nachher (Custom API):** ```javascript const data = await api.getKunden(); ``` ### File Upload **Vorher (Supabase Storage):** ```javascript const { data } = await supabase.storage.from('belegfotos').upload(fileName, file); ``` **Nachher (Multer):** ```javascript await api.createLieferung({ kunde_id, artikel_id, anzahl }, foto); ``` ## 🐛 Bekannte Probleme & Lösungen ### Problem: Backend startet nicht **Lösung:** ```bash 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