diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md deleted file mode 100755 index ea2d32b..0000000 --- a/DEPLOYMENT.md +++ /dev/null @@ -1,323 +0,0 @@ -# 🚀 NeoNail DB - Deployment Guide - -## 📋 Schnellstart (5 Minuten) - -### Option A: SQLite (Einfacher - Empfohlen) -- ✅ Keine MySQL-Installation nötig -- ✅ Einfache Datei-basierte Datenbank -- ✅ Perfekt für kleinere bis mittlere Anwendungen -- ✅ Einfaches Backup (nur eine Datei) - -### Option B: MySQL/MariaDB -- ✅ Für größere Anwendungen -- ✅ Mehrere gleichzeitige Benutzer -- ✅ Erweiterte Datenbank-Features - ---- - -## 🗄️ SQLite Deployment (Empfohlen) - -### 1. Webspace vorbereiten -- PHP 8.1+ installiert -- SQLite3 PHP-Erweiterung aktiviert -- Composer verfügbar (falls möglich) - -### 2. .env für SQLite konfigurieren -```env -APP_ENV=production -APP_DEBUG=false -APP_URL=https://ihre-domain.de - -# SQLite Konfiguration -DB_CONNECTION=sqlite -DB_DATABASE=/path/to/database.sqlite -# DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD nicht nötig! -``` - -### 3. SQLite-Datenbank erstellen -```bash -# Auf dem Server: -touch database.sqlite -chmod 664 database.sqlite -chown www-data:www-data database.sqlite # Falls verfügbar -``` - -### 4. Deployment ausführen -```bash -composer install --optimize-autoloader --no-dev -php artisan migrate --force -php artisan storage:link -php artisan config:cache -``` - -### 5. Admin-User erstellen -```bash -php artisan tinker -``` -```php -use App\Models\User; -User::create([ - 'name' => 'Admin', - 'email' => 'admin@neonail.com', - 'password' => bcrypt('ihr_sicheres_passwort') -]); -``` - -## 🗄️ MySQL/MariaDB Deployment - -### 1. Webspace vorbereiten -- PHP 8.1+ installiert -- MySQL/MariaDB Datenbank erstellt -- Composer verfügbar (falls möglich) - -### 2. Dateien hochladen -```bash -# Alle Dateien außer: -# - node_modules/ (falls vorhanden) -# - vendor/ (wird auf Server installiert) -# - .git/ (nicht nötig) -``` - -### 3. .env konfigurieren -```env -APP_ENV=production -APP_DEBUG=false -APP_URL=https://ihre-domain.de - -DB_CONNECTION=mysql -DB_HOST=localhost -DB_PORT=3306 -DB_DATABASE=ihre_datenbank -DB_USERNAME=ihr_username -DB_PASSWORD=ihr_passwort -``` - -### 4. Deployment ausführen -```bash -# Falls SSH verfügbar: -chmod +x deploy.sh -./deploy.sh - -# Oder manuell: -composer install --optimize-autoloader --no-dev -php artisan storage:link -php artisan migrate --force -php artisan config:cache -``` - -### 5. Admin-User erstellen -```bash -php artisan tinker -``` -```php -use App\Models\User; -User::create([ - 'name' => 'Admin', - 'email' => 'admin@neonail.com', - 'password' => bcrypt('ihr_sicheres_passwort') -]); -``` - -## 🔧 Detaillierte Anleitung - -### SQLite vs MySQL Vergleich - -| Feature | SQLite | MySQL | -|---------|--------|-------| -| Installation | ✅ Einfach | ❌ Komplexer | -| Konfiguration | ✅ Minimal | ❌ Mehr Aufwand | -| Backup | ✅ Eine Datei | ❌ Dump nötig | -| Performance | ✅ Gut (klein/mittel) | ✅ Sehr gut (groß) | -| Gleichzeitige User | ✅ Bis ~100 | ✅ Unbegrenzt | -| Wartung | ✅ Minimal | ❌ Regelmäßig | - -### Voraussetzungen prüfen - -**SQLite PHP-Erweiterungen:** -```bash -php -m | grep -E "(sqlite3|pdo_sqlite)" -``` - -**MySQL PHP-Erweiterungen:** -```bash -php -m | grep -E "(mysql|pdo_mysql)" -``` - -**Composer installieren (falls nicht verfügbar):** -```bash -curl -sS https://getcomposer.org/installer | php -mv composer.phar /usr/local/bin/composer -``` - -### Datei-Struktur (SQLite) -``` -public_html/ -├── public/ # Web-Root -├── storage/ # Schreibrechte erforderlich -├── bootstrap/cache/ # Schreibrechte erforderlich -├── database.sqlite # SQLite-Datenbank -└── .env # Konfiguration -``` - -### Datei-Struktur (MySQL) -``` -public_html/ -├── public/ # Web-Root -├── storage/ # Schreibrechte erforderlich -├── bootstrap/cache/ # Schreibrechte erforderlich -└── .env # Konfiguration -``` - -### Berechtigungen (SQLite) -```bash -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -chmod 664 database.sqlite -chmod 644 .env -``` - -### Berechtigungen (MySQL) -```bash -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -chmod 644 .env -``` - -## 🛡️ Sicherheit - -### Wichtige Einstellungen -- `APP_DEBUG=false` in Produktion -- Starke Passwörter verwenden -- HTTPS aktivieren -- `.env` nicht öffentlich zugänglich - -### SQLite-spezifische Sicherheit -```apache -# .htaccess - SQLite-Datei schützen - - Order allow,deny - Deny from all - -``` - -### MySQL-spezifische Sicherheit -```apache -# .htaccess bereits konfiguriert -# Zusätzliche Sicherheit: - - Order allow,deny - Deny from all - -``` - -## 📱 Mobile Optimierung - -### PWA-Features (optional) -- Manifest.json hinzufügen -- Service Worker für Offline-Funktionalität -- App-Icons erstellen - -### Performance -- Bilder komprimieren -- CDN für statische Assets -- Browser-Caching aktivieren - -## 🔄 Backup-Strategie - -### SQLite Backup -```bash -#!/bin/bash -# backup_sqlite.sh -DATE=$(date +%Y%m%d_%H%M%S) -cp database.sqlite backup_sqlite_$DATE.sqlite -tar -czf storage_backup_$DATE.tar.gz storage/ -``` - -### MySQL Backup -```bash -#!/bin/bash -# backup_mysql.sh -DATE=$(date +%Y%m%d_%H%M%S) -mysqldump -u username -p database > backup_mysql_$DATE.sql -tar -czf storage_backup_$DATE.tar.gz storage/ -``` - -### Cron-Job (täglich) -```bash -0 2 * * * /path/to/backup_sqlite.sh -``` - -## 🐛 Troubleshooting - -### SQLite-spezifische Probleme - -**1. "Database is locked"** -```bash -chmod 664 database.sqlite -chown www-data:www-data database.sqlite -``` - -**2. "SQLite3 not found"** -```bash -# PHP-Erweiterung aktivieren -php -m | grep sqlite -``` - -**3. Berechtigungsfehler** -```bash -chmod 664 database.sqlite -chmod -R 755 storage/ -``` - -### MySQL-spezifische Probleme - -**1. "Class not found" Fehler** -```bash -composer dump-autoload -``` - -**2. Berechtigungsfehler** -```bash -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -``` - -**3. Datenbank-Verbindung** -- Host, Port, Credentials prüfen -- MySQL-Service läuft - -**4. Bilder werden nicht angezeigt** -```bash -php artisan storage:link -``` - -### Logs prüfen -```bash -tail -f storage/logs/laravel.log -``` - -## 📞 Support - -Bei Problemen: -1. Logs prüfen (`storage/logs/laravel.log`) -2. Debug-Modus temporär aktivieren -3. Browser-Entwicklertools prüfen -4. Server-Error-Logs prüfen - -## 🎯 Nach dem Deployment - -### Testen -- [ ] Login funktioniert -- [ ] Neuen Lack erstellen -- [ ] Bild-Upload funktioniert -- [ ] Mobile-Ansicht prüfen -- [ ] Admin-Funktionen testen - -### Monitoring -- Server-Ressourcen überwachen -- Datenbank-Performance prüfen -- User-Feedback sammeln - ---- - -**Viel Erfolg beim Deployment! 🎉** diff --git a/NEONAIL_PROJECT_PROMPT.md b/NEONAIL_PROJECT_PROMPT.md deleted file mode 100755 index 13ce683..0000000 --- a/NEONAIL_PROJECT_PROMPT.md +++ /dev/null @@ -1,483 +0,0 @@ -# 🎨 NeoNail DB - Projekt Prompt - -## 📋 Projekt-Übersicht - -**NeoNail DB** ist eine Laravel-basierte Webanwendung zur Verwaltung von NeoNail-Nagellack-Sammlungen. - -### 🎯 Hauptfunktionen -- ✅ Kollaborative Nagellack-Datenbank -- ✅ User können eigene Lacke hinzufügen (werden automatisch zum Hauptkatalog hinzugefügt) -- ✅ Hersteller-Verwaltung für alle User (flexibel und kollaborativ) -- ✅ Mobile-optimiert für Handy-Nutzung im Laden -- ✅ Admin-Interface für User-Verwaltung -- ✅ Bild-Upload mit automatischer Optimierung -- ✅ Suchfunktion nach Name/Nummer -- ✅ SQLite-Datenbank (einfach zu deployen) - -## 🏗️ Technische Architektur - -### Framework & Versionen -- **Laravel 12.22.1** (PHP 8.4.11) -- **Bootstrap 5** (Responsive Design) -- **Intervention Image** (Bildverarbeitung) -- **SQLite** (Datenbank) - -### Datenbank-Schema -```sql --- users (Laravel Standard + is_admin Spalte) --- manufacturers (Name, Description, Website, Country) --- nail_polishes (Name, Number, Manufacturer_ID, Image) --- user_nail_polishes (Pivot-Tabelle für User-Sammlungen) -``` - -### Wichtige Models -- `User` - Benutzer mit `nailPolishes()` Relationship -- `Manufacturer` - Hersteller mit `nailPolishes()` Relationship -- `NailPolish` - Nagellacke mit `users()` und `manufacturer()` Relationship - -## 🔧 Aktuelle Deployment-Situation - -### Webspace-Status -- **URL:** http://192.168.30.81/ -- **Struktur:** Direkt im HTML-Verzeichnis -- **Status:** Neue .env Datei erstellt, Setup bereit - -### Datei-Struktur auf Webspace -``` -/html/ (oder /var/www/html/) -├── .htaccess ← Umleitung auf public/ -├── index.php ← Fallback-Umleitung -├── .env ← Konfiguration (neu erstellt) -├── database.sqlite ← SQLite-Datenbank im Hauptverzeichnis -├── public/ ← Laravel Document Root -├── app/ ← Laravel App -├── bootstrap/ ← Laravel Bootstrap -├── config/ ← Laravel Config -├── database/ ← Migrationen -├── resources/ ← Views, Assets -├── routes/ ← Routen -├── storage/ ← Speicher (777 Berechtigungen) -├── vendor/ ← Composer Dependencies -├── test.php ← PHP-Diagnose -├── laravel-test.php ← Laravel-Diagnose -├── fix-permissions.sh ← Berechtigungs-Script -├── setup-html-directory.sh ← Neues Setup-Script -└── env-production-example.txt ← Neue .env Vorlage -``` - -### Aktuelle .env Konfiguration -```env -APP_NAME="NeoNail DB" -APP_ENV=production -APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs= -APP_DEBUG=false -APP_URL=http://192.168.30.81 - -DB_CONNECTION=sqlite -DB_DATABASE=database.sqlite # ✅ Korrekt - Datenbank im Hauptverzeichnis - -# Weitere Standard-Laravel-Einstellungen... -``` - -## 🚨 Offene Probleme - -### 1. ✅ DB_DATABASE Pfad geklärt -**Status:** Datenbank liegt im Hauptverzeichnis -- **Pfad:** `/html/database.sqlite` (oder `/var/www/html/database.sqlite`) -- **Konfiguration:** `DB_DATABASE=database.sqlite` ✅ - -### 2. ✅ Mail-System Problem behoben -**Status:** SMTP-Konfiguration korrigiert und getestet -- **SMTP-Server:** mail.selfhost.de:465 (SSL) -- **Credentials:** postmaster@hjzyyqdm.mail.selfhost.de / Ikmyra -- **From-Address:** neonail@vogt.de.com -- **Test:** Erfolgreich an oliver@vogt.de.com gesendet -- **Status:** User-Registrierung und Admin-Benachrichtigungen funktionieren - -### 3. Deployment-Status -- ✅ Berechtigungen korrigiert (777 für storage/, bootstrap/cache/) -- ✅ APP_KEY generiert und gesetzt -- ✅ .htaccess Umleitung funktioniert -- ✅ SQLite-Datenbank-Pfad geklärt -- ✅ Composer install ausgeführt -- ✅ Migrationen ausgeführt (inkl. Hersteller-Feature) -- ✅ is_admin Spalte zur users Tabelle hinzugefügt -- ✅ Admin-User erstellt (admin@neonail.com / admin123) -- ✅ Hersteller-Feature vollständig implementiert und deployed -- ✅ Production-Probleme behoben (schwarzer Bildschirm, Login) -- ✅ Mail-System vollständig funktionsfähig - -## 🔄 Nächste Schritte - -### Sofortige Aktionen -1. ✅ **DB_DATABASE Pfad geklärt** - Datenbank im Hauptverzeichnis -2. ✅ **Composer install** ausgeführt -3. ✅ **Migrationen** ausgeführt: `php artisan migrate --force` -4. ✅ **is_admin Spalte** zur users Tabelle hinzugefügt -5. ✅ **Admin-User** erstellt (admin@neonail.com / admin123) -6. ✅ **Anwendung getestet** - Hersteller-Feature funktioniert -7. ✅ **HTTPS-Sicherheit** für alle Hersteller-Forms implementiert -8. ✅ **Production-Probleme** behoben (schwarzer Bildschirm, Login) -9. ✅ **Mail-System** konfiguriert und getestet (SMTP funktioniert) - -### Admin-User erstellen -```bash -php artisan tinker -``` -```php -use App\Models\User; -User::create([ - 'name' => 'Admin', - 'email' => 'admin@neonail.com', - 'password' => bcrypt('admin123'), - 'is_admin' => true -]); -``` - -### Standard-Login-Daten -**Email:** `admin@neonail.com` -**Passwort:** `admin123` - -## 📱 Anwendungs-Features - -### User-Features -- **Meine Sammlung** - Eigene Lacke anzeigen/verwalten -- **Verfügbare Lacke** - Alle Lacke aus Hauptkatalog -- **Neuen Lack hinzufügen** - Erstellt Lack im Hauptkatalog + fügt zur eigenen Sammlung hinzu -- **Hersteller verwalten** - Hersteller erstellen, bearbeiten, löschen (für alle User) -- **Bild-Upload** - Handykamera-Unterstützung, automatische Optimierung -- **Suche** - Nach Name oder Nummer - -### Admin-Features -- **Dashboard** - Übersicht über User, Lacke und Hersteller -- **User-Verwaltung** - User erstellen, bearbeiten, löschen -- **Nagellack-Verwaltung** - Alle Lacke verwalten -- **Hersteller-Verwaltung** - Alle Hersteller verwalten -- **Statistiken** - Anwendungs-Statistiken inkl. Hersteller -- **User-Sammlungen** - Sammlungen anderer User einsehen - -## 🛠️ Wichtige Dateien - -### Controllers -- `UserNailPolishController` - User-Sammlungen verwalten (erweitert um Hersteller) -- `NailPolishController` - Admin-Nagellack-Verwaltung -- `ManufacturerController` - Hersteller-Verwaltung für alle User -- `AdminController` - Admin-Dashboard und User-Verwaltung (erweitert um Hersteller-Statistiken) -- `LoginController` - Authentifizierung - -### Views -- `user-nail-polishes/` - User-Sammlungs-Views (erweitert um Hersteller-Anzeige) -- `nail-polishes/` - Admin-Nagellack-Views (erweitert um Hersteller-Anzeige) -- `manufacturers/` - Hersteller-Verwaltungs-Views (index, create, edit, show) -- `admin/` - Admin-Interface-Views -- `auth/` - Login-Views - -### Routes -```php -// User-Routes -/my-collection - Eigene Sammlung -/available - Verfügbare Lacke -/create-nail-polish - Neuen Lack erstellen -/add-to-collection/{id} - Lack zur Sammlung hinzufügen -/remove-from-collection/{id} - Lack aus Sammlung entfernen - -// Hersteller-Routes (für alle User) -/manufacturers - Hersteller-Übersicht -/manufacturers/create - Neuen Hersteller erstellen -/manufacturers/{id} - Hersteller anzeigen -/manufacturers/{id}/edit - Hersteller bearbeiten -/manufacturers-search - AJAX-Suche nach Herstellern - -// Admin-Routes -/admin/dashboard - Admin-Dashboard -/admin/users - User-Verwaltung -/nail-polishes - Nagellack-Verwaltung -/admin/statistics - Statistiken -``` - -## 🔒 Sicherheit - -### Admin-Zugang -- **Email:** admin@neonail.com -- **Passwort:** Muss noch gesetzt werden - -### Middleware -- `auth` - Authentifizierung erforderlich -- `admin` - Nur für admin@neonail.com -- `guest` - Nur für nicht-eingeloggte User - -## 📊 Datenbank-Beziehungen - -### Datenbank-Beziehungen -```php -// User Model -public function nailPolishes() { - return $this->belongsToMany(NailPolish::class, 'user_nail_polishes'); -} - -// Manufacturer Model -public function nailPolishes() { - return $this->hasMany(NailPolish::class); -} - -// NailPolish Model -public function users() { - return $this->belongsToMany(User::class, 'user_nail_polishes'); -} - -public function manufacturer() { - return $this->belongsTo(Manufacturer::class); -} -``` - -### Pivot-Tabelle -```sql -user_nail_polishes (user_id, nail_polish_id, timestamps) -``` - -### Hersteller-Feature -- **Flexibilität:** Jeder User kann neue Hersteller erstellen -- **Eindeutigkeit:** Hersteller-Namen müssen eindeutig sein -- **Globale Verfügbarkeit:** Alle User können alle Hersteller nutzen -- **Automatische Erstellung:** Beim Nagellack-Erstellen falls nicht vorhanden -- **Referentielle Integrität:** Hersteller können nicht gelöscht werden, wenn Nagellacke zugeordnet sind - -## 🎨 UI/UX Features - -### Mobile-Optimierung -- Responsive Bootstrap 5 Design -- Touch-freundliche Buttons -- Handykamera-Integration (`capture="environment"`) -- Optimierte Bildgrößen (400x400px) -- Intelligente Hersteller-Auswahl mit JavaScript - -### Design-Elemente -- Gradient-Hintergrund -- Glassmorphism-Effekte -- Font Awesome Icons -- Bootstrap Cards und Grid-System - -## 🔧 Deployment-Scripts - -### fix-permissions.sh -```bash -# Berechtigungen korrigieren -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ -chmod 664 database.sqlite -chmod 644 .env -``` - -### deploy-manufacturer-feature.sh -```bash -# Hersteller-Feature Deployment -# - Migration-Reihenfolge korrigieren -# - Migrationen ausführen -# - Cache leeren -# - Autoload aktualisieren -# - Berechtigungen setzen -``` - -### fix-production-issues.sh -```bash -# Production-Issues Fix -# - Migration-Reihenfolge korrigieren -# - Migrationen ausführen -# - Cache leeren -# - Autoload aktualisieren -# - Berechtigungen setzen -``` - -### fix-webspace-production.sh -```bash -# Webspace Production Fix -# - Migration-Reset und Neuausführung -# - Cache komplett leeren -# - Autoload optimieren -# - Datenbank-Tabellen prüfen -``` - -### fix-black-screen.sh -```bash -# Schwarzer Bildschirm Fix -# - Debug temporär aktivieren -# - Cache komplett leeren -# - Autoload neu generieren -# - Datenbank-Verbindung testen -``` - -### fix-user-login.sh -```bash -# User Login Fix -# - is_admin Spalte hinzufügen -# - Admin-User erstellen -# - Cache leeren -``` - -### test-mail-connection.sh -```bash -# Mail Connection Test -# - SMTP-Verbindung testen -# - Test-Mail an oliver@vogt.de.com senden -# - Mail-Konfiguration prüfen -# - Fehler-Diagnose -``` - -### fix-mail-config.sh -```bash -# Mail Configuration Fix -# - Mail-Konfiguration auf log-Modus setzen -# - Backup der .env erstellen -# - Cache leeren -# - Test-Mail senden -``` - -### setup-webspace.sh -```bash -# Vollständiges Setup -# - .env erstellen -# - Berechtigungen setzen -# - Composer install -# - Laravel Setup -``` - -### deploy-sqlite.sh -```bash -# SQLite-spezifisches Deployment -# - SQLite-Datenbank erstellen -# - Optimierte Einstellungen -``` - -## 🐛 Bekannte Probleme & Lösungen - -### 1. "Permission denied" Fehler -**Lösung:** `chmod -R 777 storage/ bootstrap/cache/` - -### 2. "APP_KEY" Fehler -**Lösung:** `php artisan key:generate` oder manueller Key - -### 3. "Database connection failed" -**Lösung:** SQLite-Datei erstellen, Berechtigungen prüfen - -### 4. "Class not found" -**Lösung:** `composer install` oder `composer dump-autoload` - -### 5. "Images not displayed" -**Lösung:** `php artisan storage:link` - -### 6. "no such table: manufacturers" -**Lösung:** Migrationen ausführen: `php artisan migrate --force` - -### 7. "Migration-Reihenfolge Fehler" -**Lösung:** Migration `add_manufacturer_id_to_nail_polishes_table` nach `create_nail_polishes_table` verschieben - -### 8. "Schwarzer Bildschirm in Production" -**Lösung:** `fix-black-screen.sh` ausführen oder manuell Debug aktivieren und Cache leeren - -### 9. "User-Login funktioniert nicht nach Migrationen" -**Lösung:** `is_admin` Spalte zur users Tabelle hinzufügen und Admin-User erstellen - -### 10. "E-Mails werden nicht versendet" -**Lösung:** SMTP-Konfiguration in .env prüfen und `test-mail-connection.sh` ausführen - -## 🌐 Production-Deployment - -### Production-Einstellungen (.env) -```env -APP_ENV=production -APP_DEBUG=false -APP_URL=https://neonail.vogt.de.com -``` - -### Standard-Login-Daten -**Email:** `admin@neonail.com` -**Passwort:** `admin123` - -### Production-Fix Scripts -- `fix-production-issues.sh` - Allgemeine Production-Probleme -- `fix-webspace-production.sh` - Webspace-spezifische Probleme -- `fix-black-screen.sh` - Schwarzer Bildschirm Problem -- `fix-user-login.sh` - User-Login Problem -- `test-mail-connection.sh` - Mail-Verbindung testen -- `fix-mail-config.sh` - Mail-Konfiguration reparieren - -### Manuelle Production-Fixes -```bash -# Schwarzer Bildschirm -sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env -php artisan config:clear -# Cache leeren, Fehler beheben, dann APP_DEBUG=false setzen - -# User-Login Problem -php artisan tinker --execute="use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; Schema::table('users', function (Blueprint \$table) { \$table->boolean('is_admin')->default(false)->after('password'); });" -php artisan tinker --execute="use App\Models\User; use Illuminate\Support\Facades\Hash; User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => Hash::make('admin123'), 'is_admin' => true]);" - -# Mail-System Problem -# .env korrekte SMTP-Daten: -MAIL_MAILER=smtp -MAIL_HOST=mail.selfhost.de -MAIL_PORT=465 -MAIL_USERNAME=postmaster@hjzyyqdm.mail.selfhost.de -MAIL_PASSWORD=Ikmyra -MAIL_ENCRYPTION=SSL -MAIL_FROM_ADDRESS="neonail@vogt.de.com" -MAIL_FROM_NAME="${APP_NAME}" - -# Cache leeren nach .env Änderung -php artisan config:clear - -# Mail-Verbindung testen -php artisan tinker --execute="use Illuminate\Support\Facades\Mail; Mail::raw('Test-Mail von NeoNail DB - ' . now(), function(\$message) { \$message->to('oliver@vogt.de.com')->subject('NeoNail DB - SMTP Test')->from('neonail@vogt.de.com', 'NeoNail DB'); }); echo 'Test-Mail gesendet';" -``` - -## 📞 Support-Informationen - -### Logs -- `storage/logs/laravel.log` - Laravel-Logs -- `storage/logs/` - Weitere Logs - -### Debug-Modus -```env -APP_DEBUG=true # Für Fehlerdiagnose -``` - -### Test-Dateien -- `test.php` - PHP-Diagnose -- `laravel-test.php` - Laravel-spezifische Diagnose -- `test-mail-connection.sh` - Mail-Verbindung testen -- `smtp-mail-setup.md` - Mail-Konfiguration Anleitung -- `mail-configuration-fix.md` - Mail-Problem Lösung - -## 🎯 Projekt-Ziele - -### Erreicht ✅ -- Kollaborative Datenbank -- Mobile-Optimierung -- Admin-Interface -- Bild-Upload -- Suchfunktion -- SQLite-Deployment -- Hersteller-Verwaltung für alle User -- HTTPS-Sicherheit für alle Forms -- Intelligente Hersteller-Auswahl -- Production-Ready Deployment -- Vollständige User-Authentifizierung -- Fehlerbehebung für alle Production-Probleme -- Vollständiges Mail-System (SMTP funktioniert) -- User-Registrierung mit E-Mail-Benachrichtigungen -- Admin-Benachrichtigungen bei neuen Usern - -### Nächste Schritte 🚀 -1. ✅ Webspace-Deployment abgeschlossen -2. ✅ Admin-User erstellt (admin@neonail.com / admin123) -3. ✅ Anwendung getestet (inkl. Hersteller-Feature) -4. ✅ Production-Probleme behoben -5. ✅ Mail-System vollständig funktionsfähig -6. User-Feedback sammeln -7. Weitere Features entwickeln - ---- - -**Projekt-Status:** 100% abgeschlossen, Production-Ready -**Letzte Aktion:** Mail-System vollständig funktionsfähig, SMTP-Test erfolgreich -**Nächste Aktion:** User-Feedback sammeln und weitere Features entwickeln diff --git a/WEBSPACE-SETUP.md b/WEBSPACE-SETUP.md deleted file mode 100755 index db3c52a..0000000 --- a/WEBSPACE-SETUP.md +++ /dev/null @@ -1,205 +0,0 @@ -# 🌐 Webspace Setup - NeoNail DB - -## 🚨 Problem: Verzeichnisliste wird angezeigt - -Wenn Sie eine Verzeichnisliste sehen statt der Laravel-Anwendung, liegt das daran, dass der Webserver nicht auf das `public/` Verzeichnis zeigt. - -## 🔧 Lösungen je nach Hosting-Provider - -### **Option A: Shared Hosting (cPanel, Plesk, etc.)** - -**1. Document Root ändern:** -- Gehen Sie zu Ihrem Hosting-Panel -- Suchen Sie "Document Root" oder "Web Root" -- Ändern Sie von `/neonail/` zu `/neonail/public/` - -**2. Oder Unterverzeichnis erstellen:** -``` -public_html/ -└── neonail/ - └── public/ ← Hier alle Laravel-Dateien -``` - -### **Option B: VPS/Dedicated Server** - -**1. Apache Virtual Host:** -```apache - - ServerName ihre-domain.de - DocumentRoot /var/www/neonail/public - - - AllowOverride All - Require all granted - - -``` - -**2. Nginx:** -```nginx -server { - listen 80; - server_name ihre-domain.de; - root /var/www/neonail/public; - - index index.php index.html; - - location / { - try_files $uri $uri/ /index.php?$query_string; - } - - location ~ \.php$ { - fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - include fastcgi_params; - } -} -``` - -### **Option C: Automatische Umleitung (Empfohlen)** - -**1. .htaccess im Hauptverzeichnis (bereits erstellt):** -```apache -RewriteEngine On -RewriteRule ^$ public/ [L] -RewriteRule (.*) public/$1 [L] -``` - -**2. index.php im Hauptverzeichnis (bereits erstellt):** -```php - 'Admin', - 'email' => 'admin@neonail.com', - 'password' => bcrypt('ihr_passwort') -]); -``` - -## 🐛 Troubleshooting - -### **Problem: "500 Internal Server Error"** -**Lösung:** -1. `.env` Datei prüfen -2. Berechtigungen prüfen -3. PHP-Version prüfen (8.1+) -4. Logs prüfen: `storage/logs/laravel.log` - -### **Problem: "Class not found"** -**Lösung:** -```bash -composer dump-autoload -``` - -### **Problem: "Database connection failed"** -**Lösung:** -1. SQLite-Datei erstellen -2. Berechtigungen prüfen -3. Pfad in .env prüfen - -### **Problem: "Permission denied"** -**Lösung:** -```bash -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -chmod 664 database.sqlite -``` - -## 📱 Testen - -### **Nach dem Setup:** -1. **URL aufrufen:** `https://ihre-domain.de/neonail` -2. **Login testen:** `admin@neonail.com` -3. **Neuen Lack erstellen** -4. **Bild-Upload testen** -5. **Mobile-Ansicht prüfen** - -### **Erwartetes Ergebnis:** -- ✅ Login-Seite wird angezeigt -- ✅ Keine Verzeichnisliste mehr -- ✅ Laravel-Anwendung läuft -- ✅ Alle Funktionen funktionieren - -## 🆘 Support - -**Falls nichts funktioniert:** -1. Hosting-Provider kontaktieren -2. PHP-Version prüfen (8.1+) -3. mod_rewrite aktiviert? -4. .htaccess erlaubt? - ---- - -**Viel Erfolg beim Setup! 🎉** diff --git a/activate-admin-role.sh b/activate-admin-role.sh deleted file mode 100755 index cc9395a..0000000 --- a/activate-admin-role.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -echo "👑 Admin-Rolle aktivieren" -echo "========================" - -# 1. Admin-Rolle zur Datenbank hinzufügen -echo "🗄️ Füge Admin-Rolle zur Datenbank hinzu..." -sqlite3 database.sqlite "ALTER TABLE users ADD COLUMN is_admin BOOLEAN DEFAULT 0;" 2>/dev/null || echo "⚠️ Spalte existiert bereits" - -# 2. Bestehende Admin-User als Admin markieren -echo "👤 Markiere bestehende Admin-User..." -sqlite3 database.sqlite "UPDATE users SET is_admin = 1 WHERE email IN ('admin@neonail.com', 'neueradmin@neonail.com');" - -# 3. Laravel Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" - -# 4. Admin-User prüfen -echo "🔍 Prüfe Admin-User..." -sqlite3 database.sqlite "SELECT id, name, email, is_admin FROM users;" 2>/dev/null || echo "⚠️ Keine User gefunden" - -# 5. Test-Admin-User erstellen (falls gewünscht) -echo "🧪 Erstelle Test-Admin-User..." -sqlite3 database.sqlite "INSERT OR IGNORE INTO users (name, email, password, is_admin, created_at, updated_at) VALUES ('Test Admin', 'testadmin@neonail.com', '\$2y\$12\$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 1, datetime('now'), datetime('now'));" - -echo "" -echo "✅ Admin-Rolle aktiviert!" -echo "" -echo "📋 Admin-Funktionen:" -echo "1. User bearbeiten: https://neonail.vogt.de.com/admin/users" -echo "2. Admin-Rechte gewähren: Checkbox in User-Bearbeitung" -echo "3. Admin-Status anzeigen: Badge in User-Liste" -echo "" -echo "🔑 Test-Admin-Login:" -echo "Email: testadmin@neonail.com" -echo "Passwort: password" diff --git a/add-admin-role-migration.php b/add-admin-role-migration.php deleted file mode 100644 index ee1388a..0000000 --- a/add-admin-role-migration.php +++ /dev/null @@ -1,17 +0,0 @@ - diff --git a/admin-check.php b/admin-check.php deleted file mode 100755 index 5b92ec9..0000000 --- a/admin-check.php +++ /dev/null @@ -1,47 +0,0 @@ -🔍 Admin-User Check"; - -try { - // Laravel laden - require_once 'vendor/autoload.php'; - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // User Model verwenden - $users = \App\Models\User::all(); - - echo "

Benutzer in der Datenbank:

"; - if ($users->count() > 0) { - echo "

{$users->count()} Benutzer gefunden

"; - - foreach ($users as $user) { - echo "
"; - echo "ID: {$user->id}
"; - echo "Name: {$user->name}
"; - echo "Email: {$user->email}
"; - echo "Erstellt: {$user->created_at}
"; - echo "
"; - } - - // Admin-User prüfen - $admin = \App\Models\User::where('email', 'admin@neonail.com')->first(); - if ($admin) { - echo "

👑 Admin-User gefunden!

"; - echo "

Sie können sich mit admin@neonail.com anmelden.

"; - echo "

🚀 Zur Anwendung

"; - } - - } else { - echo "

❌ Keine Benutzer gefunden

"; - echo "

Admin-User erstellen:

"; - echo "php artisan tinker
"; - echo "use App\Models\User;
"; - echo "User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => bcrypt('ihr_passwort')]);"; - } - -} catch (Exception $e) { - echo "

❌ Fehler:

"; - echo "

{$e->getMessage()}

"; -} -?> diff --git a/apache-config.txt b/apache-config.txt deleted file mode 100755 index ee2f31d..0000000 --- a/apache-config.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Apache Virtual Host Konfiguration für NeoNail DB -# Datei: /etc/apache2/sites-available/neonail.conf - - - ServerName 192.168.30.81 - DocumentRoot /var/www/html/public - - - AllowOverride All - Require all granted - - - # Sicherheit - Zugriff auf sensible Dateien verhindern - - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - - - ErrorLog ${APACHE_LOG_DIR}/neonail_error.log - CustomLog ${APACHE_LOG_DIR}/neonail_access.log combined - diff --git a/apache-diagnose.sh b/apache-diagnose.sh deleted file mode 100755 index 6cdc98d..0000000 --- a/apache-diagnose.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/bin/bash - -echo "🔍 Apache Diagnose für NeoNail DB" -echo "================================" - -echo "1. 📁 Verzeichnis-Struktur prüfen:" -echo "--------------------------------" -ls -la /var/www/html/ -echo "" - -echo "2. 📁 Public-Ordner prüfen:" -echo "--------------------------" -ls -la /var/www/html/public/ -echo "" - -echo "3. 🌐 Apache DocumentRoot prüfen:" -echo "-------------------------------" -apache2ctl -S 2>/dev/null | grep "DocumentRoot" || echo "⚠️ Apache2ctl nicht verfügbar" -echo "" - -echo "4. 📋 Apache Sites prüfen:" -echo "------------------------" -ls -la /etc/apache2/sites-enabled/ -echo "" - -echo "5. 📋 Apache Sites verfügbar:" -echo "----------------------------" -ls -la /etc/apache2/sites-available/ -echo "" - -echo "6. 🔧 Apache Konfiguration prüfen:" -echo "--------------------------------" -if [ -f "/etc/apache2/sites-enabled/neonail.conf" ]; then - echo "✅ neonail.conf ist aktiviert" - cat /etc/apache2/sites-enabled/neonail.conf -else - echo "❌ neonail.conf ist NICHT aktiviert" -fi -echo "" - -echo "7. 📝 .htaccess im Hauptverzeichnis:" -echo "----------------------------------" -if [ -f "/var/www/html/.htaccess" ]; then - echo "✅ .htaccess gefunden:" - cat /var/www/html/.htaccess -else - echo "❌ .htaccess nicht gefunden" -fi -echo "" - -echo "8. 📝 .htaccess im public-Ordner:" -echo "-------------------------------" -if [ -f "/var/www/html/public/.htaccess" ]; then - echo "✅ public/.htaccess gefunden:" - cat /var/www/html/public/.htaccess -else - echo "❌ public/.htaccess nicht gefunden" -fi -echo "" - -echo "9. 🔍 Apache-Logs prüfen:" -echo "-----------------------" -tail -5 /var/log/apache2/error.log -echo "" - -echo "10. 🧪 Test-Request:" -echo "------------------" -curl -I http://192.168.30.81 2>/dev/null || echo "⚠️ curl nicht verfügbar" -echo "" - -echo "📋 Nächste Schritte:" -echo "1. Falls public/index.php fehlt: Laravel nicht vollständig" -echo "2. Falls .htaccess fehlt: Umleitung nicht konfiguriert" -echo "3. Falls Apache-Site nicht aktiviert: Virtual Host nicht konfiguriert" diff --git a/app/Http/Controllers/UserNailPolishController.php b/app/Http/Controllers/UserNailPolishController.php index 15811e2..6684257 100755 --- a/app/Http/Controllers/UserNailPolishController.php +++ b/app/Http/Controllers/UserNailPolishController.php @@ -109,7 +109,8 @@ class UserNailPolishController extends Controller "number" => "required|string|max:50", "manufacturer_id" => "required_without:new_manufacturer|exists:manufacturers,id", "new_manufacturer" => "required_without:manufacturer_id|string|max:255|unique:manufacturers,name", - "image" => "nullable|image|max:10240", // Max 10MB + "image" => "nullable|image|max:10240", + "image_url" => "nullable|url|max:500", ], [ "name.required" => "Der Name des Lackes ist erforderlich.", "number.required" => "Die Nummer des Lackes ist erforderlich.", @@ -118,6 +119,7 @@ class UserNailPolishController extends Controller "new_manufacturer.unique" => "Ein Hersteller mit diesem Namen existiert bereits.", "image.image" => "Die Datei muss ein Bild sein.", "image.max" => "Das Bild darf maximal 10MB groß sein.", + "image_url.url" => "Bitte geben Sie eine gültige URL ein (https://...).", ]); try { @@ -138,19 +140,45 @@ class UserNailPolishController extends Controller $nailPolish->number = trim($request->number); $nailPolish->manufacturer_id = $manufacturerId; - // Vereinfachte Bildverarbeitung ohne Intervention Image + // Bild per Datei-Upload if ($request->hasFile("image") && $request->file("image")->isValid()) { $image = $request->file("image"); - - // Erstelle einen eindeutigen Dateinamen $filename = "nail_polish_" . time() . "_" . uniqid() . "." . $image->getClientOriginalExtension(); $path = "nail_polishes/" . $filename; - - // Speichere das Bild direkt ohne Verarbeitung Storage::disk("public")->putFileAs("nail_polishes", $image, $filename); $nailPolish->image_path = $path; - - \Log::info("Bild erfolgreich gespeichert: " . $path); + + // Bild per URL herunterladen + } elseif ($request->filled("image_url")) { + $imageUrl = trim($request->image_url); + try { + $response = \Illuminate\Support\Facades\Http::timeout(15) + ->withHeaders(['User-Agent' => 'Mozilla/5.0']) + ->get($imageUrl); + + if (!$response->successful()) { + throw new \Exception("HTTP-Status " . $response->status()); + } + + $contentType = strtolower($response->header('Content-Type') ?? ''); + if (!str_starts_with($contentType, 'image/')) { + throw new \Exception("URL enthält kein Bild (Content-Type: {$contentType})"); + } + + $ext = 'jpg'; + if (str_contains($contentType, 'png')) $ext = 'png'; + elseif (str_contains($contentType, 'gif')) $ext = 'gif'; + elseif (str_contains($contentType, 'webp')) $ext = 'webp'; + + $filename = "nail_polish_" . time() . "_" . uniqid() . "." . $ext; + $path = "nail_polishes/" . $filename; + Storage::disk("public")->put($path, $response->body()); + $nailPolish->image_path = $path; + + } catch (\Exception $e) { + \Log::warning("Bild-URL konnte nicht geladen werden: " . $e->getMessage()); + // Lack wird ohne Bild gespeichert, kein Abbruch + } } $nailPolish->save(); diff --git a/black-screen-fix.md b/black-screen-fix.md deleted file mode 100644 index aee97d7..0000000 --- a/black-screen-fix.md +++ /dev/null @@ -1,136 +0,0 @@ -# 🖥️ Schwarzer Bildschirm in Production - Lösung - -## 🚨 **Problem:** -- Seite zeigt nur schwarzen Bildschirm -- Keine Fehlermeldung sichtbar -- Logs zeigen unvollständige Fehler - -## 🔍 **Ursache:** -Ein kritischer Fehler tritt auf, aber wird nicht angezeigt. - -## 🔧 **Lösung:** - -### **Schritt 1: Auf dem Webspace ausführen** - -```bash -# 1. Ins Laravel-Verzeichnis wechseln -cd /var/www/html - -# 2. Black Screen Fix ausführen -./fix-black-screen.sh -``` - -### **Schritt 2: Manuell (falls Script nicht funktioniert)** - -```bash -# 1. Temporär Debug aktivieren -sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env -php artisan config:clear - -# 2. Logs leeren -> storage/logs/laravel.log - -# 3. Cache komplett leeren -php artisan config:clear -php artisan route:clear -php artisan view:clear -php artisan cache:clear -php artisan optimize:clear - -# 4. Composer Autoload neu generieren -composer dump-autoload --optimize - -# 5. Berechtigungen prüfen -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ -chmod 664 database.sqlite -chmod 644 .env - -# 6. Datenbank-Verbindung testen -php artisan tinker --execute="echo 'DB Test: '; try { DB::connection()->getPdo(); echo 'OK'; } catch(Exception \$e) { echo 'FEHLER: ' . \$e->getMessage(); }" - -# 7. Routen testen -php artisan route:list | head -10 - -# 8. Storage-Link prüfen -if [ ! -L "public/storage" ]; then - php artisan storage:link -fi -``` - -### **Schritt 3: Fehlermeldung analysieren** - -1. **Seite aufrufen** - sollte jetzt Fehlermeldung zeigen -2. **Fehlermeldung notieren** -3. **Logs prüfen:** - ```bash - tail -f storage/logs/laravel.log - ``` - -### **Schritt 4: Häufige Fehler beheben** - -#### **Fehler: "Class not found"** -```bash -composer dump-autoload --optimize -``` - -#### **Fehler: "Table not found"** -```bash -php artisan migrate --force -``` - -#### **Fehler: "Permission denied"** -```bash -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ -``` - -#### **Fehler: "View not found"** -```bash -php artisan view:clear -``` - -### **Schritt 5: Production-Modus wiederherstellen** - -```bash -# Debug deaktivieren -sed -i 's/APP_DEBUG=true/APP_DEBUG=false/' .env -php artisan config:clear - -# Cache optimieren -php artisan optimize -``` - -## 🎯 **Häufige Ursachen:** - -### **1. Autoload-Probleme** -- Neue Klassen nicht gefunden -- Composer Autoload nicht aktualisiert - -### **2. Cache-Probleme** -- Alte Konfigurationen im Cache -- Route-Cache-Probleme - -### **3. Datenbank-Probleme** -- Fehlende Tabellen -- Verbindungsprobleme - -### **4. Berechtigungs-Probleme** -- Storage nicht beschreibbar -- Cache nicht beschreibbar - -## 📋 **Checklist:** - -- [ ] Debug temporär aktiviert -- [ ] Cache geleert -- [ ] Autoload aktualisiert -- [ ] Berechtigungen korrekt -- [ ] Datenbank getestet -- [ ] Fehlermeldung analysiert -- [ ] Fehler behoben -- [ ] Debug deaktiviert - -## 🚀 **Nach dem Fix:** - -Die Seite sollte jetzt funktionieren! - diff --git a/check-admin-user.php b/check-admin-user.php deleted file mode 100755 index 97581f5..0000000 --- a/check-admin-user.php +++ /dev/null @@ -1,53 +0,0 @@ -make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - echo "

🔍 Admin-User Status

"; - - // Alle User anzeigen - $users = User::all(); - - if ($users->count() > 0) { - echo "

✅ Benutzer gefunden:

"; - echo ""; - echo ""; - - foreach ($users as $user) { - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - } - echo "
IDNameEmailErstellt
{$user->id}{$user->name}{$user->email}{$user->created_at}
"; - - // Admin-User finden - $admin = User::where('email', 'admin@neonail.com')->first(); - if ($admin) { - echo "

👑 Admin-User gefunden:

"; - echo "

Name: {$admin->name}

"; - echo "

Email: {$admin->email}

"; - echo "

ID: {$admin->id}

"; - } - - } else { - echo "

❌ Keine Benutzer gefunden

"; - echo "

Bitte Admin-User erstellen:

"; - echo "php artisan tinker
"; - echo "use App\Models\User;
"; - echo "User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => bcrypt('ihr_passwort')]);"; - } - -} catch (Exception $e) { - echo "

❌ Fehler:

"; - echo "

{$e->getMessage()}

"; -} -?> diff --git a/check-laravel-logs.sh b/check-laravel-logs.sh deleted file mode 100755 index 423725d..0000000 --- a/check-laravel-logs.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -echo "🔍 Laravel Logs prüfen" -echo "=====================" - -echo "1. 📝 Laravel Log-Datei:" -echo "----------------------" -if [ -f "storage/logs/laravel.log" ]; then - echo "✅ Laravel Log gefunden" - echo "Letzte 20 Zeilen:" - tail -20 storage/logs/laravel.log -else - echo "❌ Laravel Log nicht gefunden" -fi -echo "" - -echo "2. 📝 Apache Error Log:" -echo "---------------------" -if [ -f "/var/log/apache2/neonail_error.log" ]; then - echo "✅ NeoNail Error Log gefunden" - echo "Letzte 10 Zeilen:" - tail -10 /var/log/apache2/neonail_error.log -else - echo "❌ NeoNail Error Log nicht gefunden" - echo "Standard Apache Error Log:" - tail -10 /var/log/apache2/error.log -fi -echo "" - -echo "3. 🔧 Laravel Debug aktivieren:" -echo "-----------------------------" -echo "Setze APP_DEBUG=true in .env..." -sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env -echo "✅ Debug aktiviert" -echo "" - -echo "4. 🧪 Test-Request mit Debug:" -echo "---------------------------" -curl -I http://192.168.30.81 -echo "" - -echo "📋 Nächste Schritte:" -echo "1. Browser öffnen: http://192.168.30.81" -echo "2. Fehlermeldung anzeigen lassen" -echo "3. Logs prüfen für Details" diff --git a/check-user-collection.php b/check-user-collection.php deleted file mode 100644 index 4132901..0000000 --- a/check-user-collection.php +++ /dev/null @@ -1,77 +0,0 @@ -make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - echo "

🔍 User-Sammlung prüfen

"; - - // Admin-User finden - $admin = User::where('email', 'admin@neonail.com')->first(); - - if ($admin) { - echo "

👑 Admin-User gefunden:

"; - echo "

Name: {$admin->name}

"; - echo "

Email: {$admin->email}

"; - echo "

ID: {$admin->id}

"; - - // Sammlung prüfen - $collection = $admin->nailPolishes; - - echo "

📦 Sammlung ({$collection->count()} Lacke):

"; - - if ($collection->count() > 0) { - echo ""; - echo ""; - - foreach ($collection as $polish) { - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - } - echo "
IDNameNummerBild
{$polish->id}{$polish->name}{$polish->number}" . ($polish->image_path ? "✅" : "❌") . "
"; - } else { - echo "

❌ Keine Lacke in der Sammlung

"; - } - - // Alle Lacke prüfen - echo "

🗄️ Alle Lacke in der Datenbank:

"; - $allPolishes = NailPolish::all(); - - if ($allPolishes->count() > 0) { - echo ""; - echo ""; - - foreach ($allPolishes as $polish) { - $inCollection = $admin->nailPolishes()->where('nail_polish_id', $polish->id)->exists(); - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - } - echo "
IDNameNummerBildIn Sammlung
{$polish->id}{$polish->name}{$polish->number}" . ($polish->image_path ? "✅" : "❌") . "" . ($inCollection ? "✅" : "❌") . "
"; - } else { - echo "

❌ Keine Lacke in der Datenbank

"; - } - - } else { - echo "

❌ Admin-User nicht gefunden

"; - } - -} catch (Exception $e) { - echo "

❌ Fehler:

"; - echo "

{$e->getMessage()}

"; -} -?> diff --git a/clear-route-cache.sh b/clear-route-cache.sh deleted file mode 100755 index 1925be9..0000000 --- a/clear-route-cache.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -echo "🧹 Route-Cache leeren" -echo "====================" - -# 1. Laravel Cache leeren -echo "1. Laravel Cache leeren..." -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen" - -# 2. Bootstrap Cache leeren -echo "2. Bootstrap Cache leeren..." -rm -f bootstrap/cache/*.php 2>/dev/null || echo "⚠️ bootstrap/cache/*.php nicht gefunden" - -# 3. Route-Test ausführen -echo "3. Route-Test ausführen..." -php test-route-fix.php - -# 4. Debug-Modus aktivieren -echo "4. Debug-Modus aktivieren..." -if [ -f .env ]; then - sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env - sed -i 's/APP_ENV=production/APP_ENV=local/' .env - echo "✅ Debug-Modus aktiviert" -else - echo "❌ .env Datei nicht gefunden" -fi - -echo "" -echo "✅ Route-Cache geleert!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. https://neonail.vogt.de.com/create-nail-polish" -echo "2. Versuchen Sie einen neuen Lack zu erstellen" -echo "3. Falls Problem besteht: php artisan route:list | grep create" diff --git a/complete-fix.sh b/complete-fix.sh deleted file mode 100755 index c36c51d..0000000 --- a/complete-fix.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - -echo "🔧 NeoNail DB - Vollständige Reparatur" -echo "=====================================" - -# 1. SQLite-Treiber installieren -echo "🗄️ Installiere SQLite-Treiber..." -apt update -apt install -y sqlite3 php-sqlite3 php-pdo-sqlite - -# 2. Cache-Dateien löschen (Pail-Problem) -echo "🧹 Lösche Cache-Dateien..." -rm -f bootstrap/cache/packages.php -rm -f bootstrap/cache/services.php -rm -f bootstrap/cache/config.php - -# 3. .env erstellen -echo "📝 Erstelle .env Datei..." -if [ ! -f ".env" ]; then - cp env-production-example.txt .env -fi - -# 4. SQLite-Datenbank erstellen -echo "🗄️ Erstelle SQLite-Datenbank..." -touch database.sqlite -chmod 664 database.sqlite - -# 5. Berechtigungen setzen -echo "🔐 Setze Berechtigungen..." -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ -chmod 644 .env - -# 6. Composer autoload neu generieren -echo "🔄 Generiere autoload neu..." -if command -v composer &> /dev/null; then - composer dump-autoload --optimize -elif [ -f "composer.phar" ]; then - php composer.phar dump-autoload --optimize -else - echo "⚠️ Composer nicht verfügbar" -fi - -# 7. Laravel Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" - -# 8. Migrationen ausführen -echo "🗃️ Führe Migrationen aus..." -php artisan migrate --force 2>/dev/null || echo "⚠️ Migrationen übersprungen" - -# 9. Storage Link erstellen -echo "🔗 Prüfe Storage Link..." -if [ ! -L "public/storage" ]; then - php artisan storage:link 2>/dev/null || echo "⚠️ Storage Link übersprungen" -else - echo "✅ Storage Link bereits vorhanden" -fi - -echo "" -echo "✅ Vollständige Reparatur abgeschlossen!" -echo "" -echo "📋 Testen Sie:" -echo "1. php artisan --version" -echo "2. php -m | grep sqlite" -echo "3. http://192.168.30.81" -echo "" -echo "📋 Admin-User erstellen:" -echo "php artisan tinker" -echo "use App\Models\User;" -echo "User::create(['name' => 'Admin', 'email' => 'admin@neonail.com', 'password' => bcrypt('ihr_passwort')]);" diff --git a/create-admin.php b/create-admin.php deleted file mode 100755 index 9ad798f..0000000 --- a/create-admin.php +++ /dev/null @@ -1,40 +0,0 @@ -👑 Admin-User erstellen"; - -try { - // Laravel laden - require_once 'vendor/autoload.php'; - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Prüfen ob Admin bereits existiert - $existingAdmin = \App\Models\User::where('email', 'admin@neonail.com')->first(); - - if ($existingAdmin) { - echo "

✅ Admin-User existiert bereits!

"; - echo "

Name: {$existingAdmin->name}

"; - echo "

Email: {$existingAdmin->email}

"; - echo "

ID: {$existingAdmin->id}

"; - echo "

🚀 Zur Anwendung

"; - } else { - // Admin-User erstellen - $admin = \App\Models\User::create([ - 'name' => 'Admin', - 'email' => 'admin@neonail.com', - 'password' => bcrypt('admin123') - ]); - - echo "

✅ Admin-User erstellt!

"; - echo "

Name: {$admin->name}

"; - echo "

Email: {$admin->email}

"; - echo "

Passwort: admin123

"; - echo "

ID: {$admin->id}

"; - echo "

🚀 Zur Anwendung

"; - } - -} catch (Exception $e) { - echo "

❌ Fehler:

"; - echo "

{$e->getMessage()}

"; -} -?> diff --git a/debug-405-error.php b/debug-405-error.php deleted file mode 100644 index b50d3b9..0000000 --- a/debug-405-error.php +++ /dev/null @@ -1,118 +0,0 @@ -query("SELECT COUNT(*) FROM users"); - $userCount = $stmt->fetchColumn(); - echo " - User in Datenbank: $userCount\n"; - -} catch (Exception $e) { - echo " ❌ Datenbankfehler: " . $e->getMessage() . "\n"; -} - -// 3. Prüfe Laravel-Routes -echo "\n3. Laravel-Routes:\n"; -try { - // Simuliere Laravel-Bootstrap - require_once 'vendor/autoload.php'; - - // Erstelle Laravel-App - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Hole Router - $router = $app->make('router'); - - // Prüfe spezifische Route - $routes = $router->getRoutes(); - $foundRoute = false; - - foreach ($routes as $route) { - if ($route->getName() === 'user-nail-polishes.store') { - echo " ✅ Route 'user-nail-polishes.store' gefunden\n"; - echo " - URI: " . $route->uri() . "\n"; - echo " - Method: " . implode('|', $route->methods()) . "\n"; - echo " - Controller: " . $route->getActionName() . "\n"; - $foundRoute = true; - break; - } - } - - if (!$foundRoute) { - echo " ❌ Route 'user-nail-polishes.store' nicht gefunden\n"; - } - - // Zeige alle POST-Routes - echo "\n 📋 Alle POST-Routes:\n"; - foreach ($routes as $route) { - if (in_array('POST', $route->methods())) { - echo " - " . $route->uri() . " -> " . $route->getName() . "\n"; - } - } - -} catch (Exception $e) { - echo " ❌ Laravel-Fehler: " . $e->getMessage() . "\n"; -} - -// 4. Prüfe Dateisystem -echo "\n4. Dateisystem:\n"; -$files = [ - 'routes/web.php' => 'Route-Definitionen', - 'app/Http/Controllers/UserNailPolishController.php' => 'Controller', - 'resources/views/user-nail-polishes/create.blade.php' => 'Create-View', - 'bootstrap/app.php' => 'Laravel-Bootstrap', - 'vendor/autoload.php' => 'Composer Autoload' -]; - -foreach ($files as $file => $description) { - if (file_exists($file)) { - echo " ✅ $description: $file\n"; - } else { - echo " ❌ $description fehlt: $file\n"; - } -} - -// 5. Prüfe .htaccess -echo "\n5. .htaccess-Konfiguration:\n"; -$htaccessFiles = [ - '.htaccess' => 'Hauptverzeichnis', - 'public/.htaccess' => 'Public-Verzeichnis' -]; - -foreach ($htaccessFiles as $file => $location) { - if (file_exists($file)) { - echo " ✅ $location .htaccess gefunden\n"; - $content = file_get_contents($file); - if (strpos($content, 'RewriteEngine On') !== false) { - echo " - RewriteEngine aktiviert\n"; - } - if (strpos($content, 'index.php') !== false) { - echo " - index.php Weiterleitung konfiguriert\n"; - } - } else { - echo " ❌ $location .htaccess fehlt\n"; - } -} - -echo "\n🔧 Nächste Schritte:\n"; -echo "1. Prüfen Sie die Laravel-Logs: storage/logs/laravel.log\n"; -echo "2. Aktivieren Sie APP_DEBUG=true in .env\n"; -echo "3. Leeren Sie den Cache: php artisan cache:clear\n"; -echo "4. Prüfen Sie die Apache-Logs für weitere Details\n"; -?> diff --git a/debug-500-error.php b/debug-500-error.php deleted file mode 100644 index a91d391..0000000 --- a/debug-500-error.php +++ /dev/null @@ -1,131 +0,0 @@ - 'Laravel Entry Point', - 'bootstrap/app.php' => 'Laravel Bootstrap', - 'vendor/autoload.php' => 'Composer Autoload', - 'config/app.php' => 'App Config', - '.env' => 'Environment File', - 'database.sqlite' => 'Database File' -]; - -foreach ($criticalFiles as $file => $description) { - if (file_exists($file)) { - $perms = substr(sprintf('%o', fileperms($file)), -4); - echo " ✅ $description: $file (Perms: $perms)\n"; - } else { - echo " ❌ $description fehlt: $file\n"; - } -} - -// 5. Prüfe Verzeichnisberechtigungen -echo "\n5. Verzeichnisberechtigungen prüfen:\n"; -$directories = [ - 'storage' => 'Storage Directory', - 'storage/logs' => 'Logs Directory', - 'storage/framework' => 'Framework Directory', - 'storage/framework/cache' => 'Cache Directory', - 'storage/framework/sessions' => 'Sessions Directory', - 'storage/framework/views' => 'Views Directory', - 'bootstrap/cache' => 'Bootstrap Cache' -]; - -foreach ($directories as $dir => $description) { - if (is_dir($dir)) { - $perms = substr(sprintf('%o', fileperms($dir)), -4); - $writable = is_writable($dir) ? 'writable' : 'not writable'; - echo " ✅ $description: $dir (Perms: $perms, $writable)\n"; - } else { - echo " ❌ $description fehlt: $dir\n"; - } -} - -// 6. Prüfe Laravel-Bootstrap -echo "\n6. Laravel-Bootstrap Test:\n"; -try { - require_once 'vendor/autoload.php'; - echo " ✅ Composer Autoload erfolgreich\n"; - - $app = require_once 'bootstrap/app.php'; - echo " ✅ Laravel App erstellt\n"; - - $kernel = $app->make('Illuminate\Contracts\Console\Kernel'); - echo " ✅ Kernel erstellt\n"; - - $kernel->bootstrap(); - echo " ✅ Laravel Bootstrap erfolgreich\n"; - -} catch (Exception $e) { - echo " ❌ Laravel-Fehler: " . $e->getMessage() . "\n"; - echo " 📍 Datei: " . $e->getFile() . ":" . $e->getLine() . "\n"; -} - -echo "\n🔧 Nächste Schritte:\n"; -echo "1. Prüfen Sie die Laravel-Logs für detaillierte Fehlermeldungen\n"; -echo "2. Aktivieren Sie APP_DEBUG=true in .env\n"; -echo "3. Prüfen Sie die Apache-Logs für Server-Fehler\n"; -echo "4. Stellen Sie sicher, dass alle Verzeichnisse beschreibbar sind\n"; -?> diff --git a/debug-image-upload.php b/debug-image-upload.php deleted file mode 100644 index 01fa643..0000000 --- a/debug-image-upload.php +++ /dev/null @@ -1,194 +0,0 @@ - ini_get('upload_max_filesize'), - 'post_max_size' => ini_get('post_max_size'), - 'max_file_uploads' => ini_get('max_file_uploads'), - 'memory_limit' => ini_get('memory_limit'), - 'max_execution_time' => ini_get('max_execution_time'), - 'max_input_time' => ini_get('max_input_time'), - 'file_uploads' => ini_get('file_uploads'), - 'upload_tmp_dir' => ini_get('upload_tmp_dir') -]; - -foreach ($uploadSettings as $setting => $value) { - echo " - $setting: $value\n"; -} - -// 2. GD Extension prüfen -echo "\n2. GD Extension prüfen:\n"; -if (extension_loaded('gd')) { - echo " ✅ GD Extension geladen\n"; - $gdInfo = gd_info(); - echo " - GD Version: " . $gdInfo['GD Version'] . "\n"; - echo " - JPEG Support: " . ($gdInfo['JPEG Support'] ? 'Ja' : 'Nein') . "\n"; - echo " - PNG Support: " . ($gdInfo['PNG Support'] ? 'Ja' : 'Nein') . "\n"; - echo " - GIF Support: " . ($gdInfo['GIF Support'] ? 'Ja' : 'Nein') . "\n"; -} else { - echo " ❌ GD Extension nicht geladen\n"; -} - -// 3. Intervention Image prüfen -echo "\n3. Intervention Image prüfen:\n"; -try { - require_once 'vendor/autoload.php'; - - if (class_exists('Intervention\Image\ImageManager')) { - echo " ✅ Intervention Image verfügbar\n"; - - // Test ImageManager - $manager = new \Intervention\Image\ImageManager(new \Intervention\Image\Drivers\Gd\Driver()); - echo " ✅ ImageManager funktioniert\n"; - } else { - echo " ❌ Intervention Image nicht verfügbar\n"; - } -} catch (Exception $e) { - echo " ❌ Intervention Image Fehler: " . $e->getMessage() . "\n"; -} - -// 4. Storage-Verzeichnisse prüfen -echo "\n4. Storage-Verzeichnisse prüfen:\n"; -$storagePaths = [ - 'storage' => 'Storage Root', - 'storage/app' => 'Storage App', - 'storage/app/public' => 'Storage Public', - 'storage/app/public/nail_polishes' => 'Nail Polishes Storage', - 'public/storage' => 'Public Storage Link' -]; - -foreach ($storagePaths as $path => $description) { - if (file_exists($path)) { - $perms = substr(sprintf('%o', fileperms($path)), -4); - $writable = is_writable($path) ? 'writable' : 'not writable'; - $type = is_dir($path) ? 'directory' : (is_link($path) ? 'symlink' : 'file'); - echo " ✅ $description: $path ($type, perms: $perms, $writable)\n"; - } else { - echo " ❌ $description: $path (nicht gefunden)\n"; - } -} - -// 5. Laravel Storage Link prüfen -echo "\n5. Laravel Storage Link prüfen:\n"; -$publicStoragePath = 'public/storage'; -if (is_link($publicStoragePath)) { - $target = readlink($publicStoragePath); - echo " ✅ Storage Link existiert: $publicStoragePath -> $target\n"; -} else { - echo " ⚠️ Storage Link existiert nicht\n"; - - // Versuche Storage Link zu erstellen - try { - if (file_exists('storage/app/public')) { - if (is_dir('public/storage')) { - rmdir('public/storage'); - } - symlink('../storage/app/public', 'public/storage'); - echo " ✅ Storage Link erstellt\n"; - } else { - echo " ❌ storage/app/public existiert nicht\n"; - } - } catch (Exception $e) { - echo " ❌ Storage Link erstellen fehlgeschlagen: " . $e->getMessage() . "\n"; - } -} - -// 6. Laravel-Logs prüfen -echo "\n6. Laravel-Logs prüfen:\n"; -$logFiles = [ - 'storage/logs/laravel.log', - 'storage/logs/laravel-' . date('Y-m-d') . '.log' -]; - -foreach ($logFiles as $logFile) { - if (file_exists($logFile)) { - echo " 📋 $logFile gefunden\n"; - $lines = file($logFile); - $lastLines = array_slice($lines, -5); - echo " 📄 Letzte 5 Zeilen:\n"; - foreach ($lastLines as $line) { - if (strpos($line, 'error') !== false || strpos($line, 'Exception') !== false || strpos($line, 'upload') !== false) { - echo " " . trim($line) . "\n"; - } - } - } else { - echo " ❌ $logFile nicht gefunden\n"; - } -} - -// 7. Test-Bild erstellen -echo "\n7. Test-Bild erstellen:\n"; -try { - $testImagePath = 'storage/app/public/nail_polishes/test.jpg'; - - if (extension_loaded('gd')) { - // Erstelle ein einfaches Test-Bild - $image = imagecreate(100, 100); - $bgColor = imagecolorallocate($image, 255, 255, 255); - $textColor = imagecolorallocate($image, 0, 0, 0); - imagestring($image, 5, 10, 40, 'TEST', $textColor); - - if (imagejpeg($image, $testImagePath, 80)) { - echo " ✅ Test-Bild erstellt: $testImagePath\n"; - - // Prüfe ob Bild über Web erreichbar ist - $webPath = 'public/storage/nail_polishes/test.jpg'; - if (file_exists($webPath)) { - echo " ✅ Test-Bild über Web erreichbar\n"; - } else { - echo " ❌ Test-Bild nicht über Web erreichbar\n"; - } - } else { - echo " ❌ Test-Bild erstellen fehlgeschlagen\n"; - } - - imagedestroy($image); - } else { - echo " ❌ GD Extension nicht verfügbar für Test-Bild\n"; - } -} catch (Exception $e) { - echo " ❌ Test-Bild Fehler: " . $e->getMessage() . "\n"; -} - -// 8. Controller-Code prüfen -echo "\n8. Controller-Code prüfen:\n"; -$controllerPath = 'app/Http/Controllers/UserNailPolishController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - - // Prüfe ImageManager Import - if (strpos($content, 'use Intervention\\Image\\ImageManager') !== false) { - echo " ✅ ImageManager Import vorhanden\n"; - } else { - echo " ❌ ImageManager Import fehlt\n"; - } - - // Prüfe Driver Import - if (strpos($content, 'use Intervention\\Image\\Drivers\\Gd\\Driver') !== false) { - echo " ✅ Driver Import vorhanden\n"; - } else { - echo " ❌ Driver Import fehlt\n"; - } - - // Prüfe Bildverarbeitungscode - if (strpos($content, 'new ImageManager(new Driver())') !== false) { - echo " ✅ Bildverarbeitungscode vorhanden\n"; - } else { - echo " ❌ Bildverarbeitungscode fehlt\n"; - } -} else { - echo " ❌ Controller nicht gefunden\n"; -} - -echo "\n✅ Bild-Upload Debug abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n"; -echo "\n📋 Nächste Schritte:\n"; -echo "1. Prüfen Sie die Laravel-Logs für spezifische Fehlermeldungen\n"; -echo "2. Testen Sie mit einem kleinen Bild (< 1MB)\n"; -echo "3. Prüfen Sie Browser-Entwicklertools (F12) für Netzwerk-Fehler\n"; -echo "4. Schauen Sie in Apache-Logs für Server-Fehler\n"; -?> diff --git a/debug-logout-detailed.php b/debug-logout-detailed.php deleted file mode 100644 index 292656f..0000000 --- a/debug-logout-detailed.php +++ /dev/null @@ -1,202 +0,0 @@ - $line) { - if (strpos($line, 'logout') !== false) { - $logoutLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - if (!empty($logoutLines)) { - echo " ✅ Logout-bezogene Zeilen gefunden:\n"; - foreach ($logoutLines as $line) { - echo " 📋 $line\n"; - } - } else { - echo " ❌ Keine Logout-bezogenen Zeilen gefunden\n"; - } - -} else { - echo " ❌ Layout-Datei nicht gefunden\n"; -} - -// 2. Routes prüfen -echo "\n2. 🛣️ Routes prüfen...\n"; -$routesPath = 'routes/web.php'; -if (file_exists($routesPath)) { - $content = file_get_contents($routesPath); - - // Zeige alle Logout-bezogenen Zeilen - $lines = explode("\n", $content); - $logoutLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'logout') !== false) { - $logoutLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - if (!empty($logoutLines)) { - echo " ✅ Logout-Routes gefunden:\n"; - foreach ($logoutLines as $line) { - echo " 📋 $line\n"; - } - } else { - echo " ❌ Keine Logout-Routes gefunden\n"; - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 3. LoginController prüfen -echo "\n3. 🔐 LoginController prüfen...\n"; -$controllerPath = 'app/Http/Controllers/Auth/LoginController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - - if (strpos($content, 'public function logout') !== false) { - echo " ✅ Logout-Methode vorhanden\n"; - - // Zeige Logout-Methode - $lines = explode("\n", $content); - $inLogoutMethod = false; - $methodLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'public function logout') !== false) { - $inLogoutMethod = true; - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) { - $inLogoutMethod = false; - } elseif ($inLogoutMethod) { - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - echo " 📋 Logout-Methode:\n"; - foreach ($methodLines as $line) { - echo " $line\n"; - } - - } else { - echo " ❌ Logout-Methode nicht gefunden\n"; - } - -} else { - echo " ❌ LoginController nicht gefunden\n"; -} - -// 4. Einfache Logout-Route erstellen -echo "\n4. 🛣️ Einfache Logout-Route erstellen...\n"; -$routesPath = 'routes/web.php'; -if (file_exists($routesPath)) { - $content = file_get_contents($routesPath); - - // Prüfe ob GET Logout-Route existiert - if (strpos($content, "Route::get('/logout', [LoginController::class, 'logout'])->name('logout');") === false) { - // Füge GET Logout-Route hinzu - $newRoute = "\n// Einfache Logout-Route für Debugging\nRoute::get('/logout', [App\\Http\\Controllers\\Auth\\LoginController::class, 'logout'])->name('logout');\n"; - - // Füge am Ende der Datei hinzu - $content .= $newRoute; - file_put_contents($routesPath, $content); - echo " ✅ GET Logout-Route hinzugefügt\n"; - } else { - echo " ℹ️ GET Logout-Route bereits vorhanden\n"; - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 5. LoginController erweitern -echo "\n5. 🔐 LoginController erweitern...\n"; -$controllerPath = 'app/Http/Controllers/Auth/LoginController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - - // Prüfe ob Logout-Methode GET und POST unterstützt - if (strpos($content, 'public function logout(Request $request)') !== false) { - echo " ✅ Logout-Methode unterstützt bereits GET und POST\n"; - } else { - echo " ℹ️ Logout-Methode prüfen...\n"; - } - - // Zeige aktuelle Logout-Methode - $lines = explode("\n", $content); - $inLogoutMethod = false; - $methodLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'public function logout') !== false) { - $inLogoutMethod = true; - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) { - $inLogoutMethod = false; - } elseif ($inLogoutMethod) { - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - echo " 📋 Aktuelle Logout-Methode:\n"; - foreach ($methodLines as $line) { - echo " $line\n"; - } - -} else { - echo " ❌ LoginController nicht gefunden\n"; -} - -// 6. Cache leeren -echo "\n6. 🧹 Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 7. Test-Logout-Links erstellen -echo "\n7. 🧪 Test-Logout-Links erstellen...\n"; -$testLinks = [ - 'https://neonail.vogt.de.com/logout (GET)', - 'https://neonail.vogt.de.com/logout (POST)', - 'https://neonail.vogt.de.com/', - 'https://neonail.vogt.de.com/login' -]; - -foreach ($testLinks as $link) { - echo " 🔗 $link\n"; -} - -// 8. Debug-Anleitung -echo "\n8. 🔍 Debug-Anleitung...\n"; -echo " 📋 1. Öffnen Sie: https://neonail.vogt.de.com\n"; -echo " 📋 2. Melden Sie sich an\n"; -echo " 📋 3. Öffnen Sie Browser-Entwicklertools (F12)\n"; -echo " 📋 4. Gehen Sie zu Console-Tab\n"; -echo " 📋 5. Klicken Sie auf Ihren Benutzernamen\n"; -echo " 📋 6. Wählen Sie 'Abmelden'\n"; -echo " 📋 7. Schauen Sie nach JavaScript-Fehlern\n"; -echo " 📋 8. Gehen Sie zu Network-Tab\n"; -echo " 📋 9. Schauen Sie welche URL aufgerufen wird\n"; -echo " 📋 10. Testen Sie direkt: https://neonail.vogt.de.com/logout\n"; - -echo "\n✅ Detailliertes Logout-Debug abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Das normale Logout über das Dropdown\n"; -echo "2. Den direkten Link: https://neonail.vogt.de.com/logout\n"; -echo "3. Teilen Sie alle Fehlermeldungen mit\n"; -?> diff --git a/debug-logout.php b/debug-logout.php deleted file mode 100644 index 1f4bbcb..0000000 --- a/debug-logout.php +++ /dev/null @@ -1,218 +0,0 @@ - $line) { - if (strpos($line, 'logout') !== false) { - echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n"; - } - } - } else { - echo " ❌ Logout-Form nicht gefunden\n"; - } - - // Prüfe Route-Verwendung - if (strpos($content, '{{ route("logout") }}') !== false) { - echo " ✅ Laravel Route wird verwendet\n"; - } elseif (strpos($content, 'https://neonail.vogt.de.com/logout') !== false) { - echo " ❌ Hardcodierte URL wird verwendet\n"; - } else { - echo " ❓ Unbekannte Logout-Konfiguration\n"; - } - -} else { - echo " ❌ Layout-Datei nicht gefunden\n"; -} - -// 2. Routes prüfen -echo "\n2. 🛣️ Routes prüfen...\n"; -$routesPath = 'routes/web.php'; -if (file_exists($routesPath)) { - $content = file_get_contents($routesPath); - - // Zeige alle Logout-bezogenen Zeilen - $lines = explode("\n", $content); - $logoutLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'logout') !== false) { - $logoutLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - if (!empty($logoutLines)) { - echo " ✅ Logout-Routes gefunden:\n"; - foreach ($logoutLines as $line) { - echo " 📋 $line\n"; - } - } else { - echo " ❌ Keine Logout-Routes gefunden\n"; - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 3. LoginController prüfen -echo "\n3. 🔐 LoginController prüfen...\n"; -$controllerPath = 'app/Http/Controllers/Auth/LoginController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - - if (strpos($content, 'logout') !== false) { - echo " ✅ Logout-Methode gefunden\n"; - - // Zeige Logout-Methode - $lines = explode("\n", $content); - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'logout') !== false) { - echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n"; - } - } - } else { - echo " ❌ Logout-Methode nicht gefunden\n"; - } - -} else { - echo " ❌ LoginController nicht gefunden\n"; -} - -// 4. Laravel Route-Liste generieren -echo "\n4. 🛣️ Laravel Route-Liste generieren...\n"; -try { - require_once 'vendor/autoload.php'; - - // Laravel Bootstrap - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Route-Liste abrufen - $routes = \Illuminate\Support\Facades\Route::getRoutes(); - - $logoutRoutes = []; - foreach ($routes as $route) { - $uri = $route->uri(); - $methods = $route->methods(); - $name = $route->getName(); - - if (strpos($uri, 'logout') !== false || strpos($name, 'logout') !== false) { - $logoutRoutes[] = [ - 'uri' => $uri, - 'methods' => $methods, - 'name' => $name - ]; - } - } - - if (empty($logoutRoutes)) { - echo " ❌ Keine Logout-Routes in Laravel registriert\n"; - } else { - echo " ✅ Logout-Routes in Laravel gefunden:\n"; - foreach ($logoutRoutes as $route) { - $methods = implode('|', $route['methods']); - $name = $route['name'] ?: 'kein Name'; - echo " 📋 $methods $uri ($name)\n"; - } - } - -} catch (Exception $e) { - echo " ❌ Fehler beim Abrufen der Routes: " . $e->getMessage() . "\n"; -} - -// 5. Cache-Status prüfen -echo "\n5. 🧹 Cache-Status prüfen...\n"; -$cacheFiles = [ - 'bootstrap/cache/packages.php' => 'Packages Cache', - 'bootstrap/cache/services.php' => 'Services Cache', - 'bootstrap/cache/routes.php' => 'Routes Cache', - 'bootstrap/cache/config.php' => 'Config Cache' -]; - -foreach ($cacheFiles as $cacheFile => $description) { - if (file_exists($cacheFile)) { - echo " ⚠️ Cache vorhanden: $description\n"; - } else { - echo " ✅ Cache geleert: $description\n"; - } -} - -// 6. Test-Logout-URLs generieren -echo "\n6. 🔗 Test-Logout-URLs:\n"; -$testUrls = [ - 'https://neonail.vogt.de.com/logout', - 'https://neonail.vogt.de.com/logout (POST)', - 'https://neonail.vogt.de.com/logout (GET)', - 'https://neonail.vogt.de.com/', - 'https://neonail.vogt.de.com/login' -]; - -foreach ($testUrls as $url) { - echo " 🔗 $url\n"; -} - -// 7. Layout korrigieren (falls nötig) -echo "\n7. 🔧 Layout korrigieren...\n"; -$layoutPath = 'resources/views/layouts/app.blade.php'; -if (file_exists($layoutPath)) { - $content = file_get_contents($layoutPath); - - // Ersetze alle hardcodierten Logout-URLs - $replacements = [ - 'action="https://neonail.vogt.de.com/logout"' => 'action="{{ route("logout") }}"', - 'href="https://neonail.vogt.de.com/logout"' => 'href="{{ route("logout") }}"', - 'action="http://neonail.vogt.de.com/logout"' => 'action="{{ route("logout") }}"', - 'href="http://neonail.vogt.de.com/logout"' => 'href="{{ route("logout") }}"' - ]; - - $modified = false; - foreach ($replacements as $old => $new) { - if (strpos($content, $old) !== false) { - $content = str_replace($old, $new, $content); - $modified = true; - echo " ✅ Ersetzt: $old → $new\n"; - } - } - - if ($modified) { - file_put_contents($layoutPath, $content); - echo " ✅ Layout aktualisiert\n"; - } else { - echo " ℹ️ Keine Änderungen nötig\n"; - } - -} else { - echo " ❌ Layout-Datei nicht gefunden\n"; -} - -// 8. Cache leeren -echo "\n8. 🧹 Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -echo "\n✅ Logout-Debug abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n"; -echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n"; -echo "3. Falls das nicht funktioniert, versuchen Sie direkt:\n"; -echo " - https://neonail.vogt.de.com/logout\n"; -echo "\n📋 Falls Problem besteht:\n"; -echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n"; -echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n"; -echo "- Teilen Sie die Debug-Ausgabe mit\n"; -?> diff --git a/deploy-manufacturer-feature.sh b/deploy-manufacturer-feature.sh deleted file mode 100755 index 754f525..0000000 --- a/deploy-manufacturer-feature.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# NeoNail DB - Hersteller-Feature Deployment Script -# Führt die neuen Migrationen aus und aktualisiert die Anwendung - -echo "🎨 NeoNail DB - Hersteller-Feature Deployment" -echo "==============================================" - -# Prüfe, ob wir im richtigen Verzeichnis sind -if [ ! -f "artisan" ]; then - echo "❌ Fehler: artisan Datei nicht gefunden. Bitte führen Sie das Script im Laravel-Root-Verzeichnis aus." - exit 1 -fi - -echo "📋 Prüfe Migration-Reihenfolge..." -# Stelle sicher, dass die manufacturer_id Migration nach der nail_polishes Migration kommt -if [ -f "database/migrations/2025_01_15_000001_add_manufacturer_id_to_nail_polishes_table.php" ]; then - echo "🔄 Korrigiere Migration-Reihenfolge..." - mv database/migrations/2025_01_15_000001_add_manufacturer_id_to_nail_polishes_table.php \ - database/migrations/2025_08_10_020524_add_manufacturer_id_to_nail_polishes_table.php - echo "✅ Migration-Reihenfolge korrigiert" -fi - -echo "📋 Führe Migrationen aus..." -php artisan migrate --force - -if [ $? -eq 0 ]; then - echo "✅ Migrationen erfolgreich ausgeführt" -else - echo "❌ Fehler beim Ausführen der Migrationen" - exit 1 -fi - -echo "🔄 Cache leeren..." -php artisan config:clear -php artisan route:clear -php artisan view:clear - -echo "📦 Composer Autoload aktualisieren..." -composer dump-autoload - -echo "🔗 Storage-Link prüfen..." -if [ ! -L "public/storage" ]; then - echo "📎 Storage-Link erstellen..." - php artisan storage:link -else - echo "✅ Storage-Link bereits vorhanden" -fi - -echo "🔒 Berechtigungen setzen..." -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ -chmod 664 database.sqlite - -echo "✅ Hersteller-Feature erfolgreich deployed!" -echo "" -echo "🎯 Neue Features:" -echo " - Hersteller-Verwaltung für alle User" -echo " - Hersteller-Auswahl beim Erstellen von Nagellacken" -echo " - Automatische Hersteller-Erstellung" -echo " - Hersteller-Statistiken im Admin-Bereich" -echo "" -echo "🌐 Zugriff:" -echo " - Hersteller-Übersicht: /manufacturers" -echo " - Neuen Hersteller erstellen: /manufacturers/create" -echo "" -echo "🚀 Anwendung ist bereit!" diff --git a/deploy-sqlite.sh b/deploy-sqlite.sh deleted file mode 100755 index e7ec256..0000000 --- a/deploy-sqlite.sh +++ /dev/null @@ -1,64 +0,0 @@ -#!/bin/bash - -# NeoNail DB SQLite Deployment Script -echo "🚀 NeoNail DB SQLite Deployment gestartet..." - -# 1. SQLite-Datenbank erstellen (falls nicht vorhanden) -echo "🗄️ SQLite-Datenbank erstellen..." -if [ ! -f database.sqlite ]; then - touch database.sqlite - echo "✅ SQLite-Datenbank erstellt" -else - echo "✅ SQLite-Datenbank bereits vorhanden" -fi - -# 2. Berechtigungen für SQLite-Datenbank setzen -echo "🔐 SQLite-Berechtigungen setzen..." -chmod 664 database.sqlite -if command -v chown &> /dev/null; then - chown www-data:www-data database.sqlite 2>/dev/null || echo "⚠️ chown nicht verfügbar" -fi - -# 3. Composer Dependencies optimieren -echo "📦 Composer Dependencies optimieren..." -composer install --optimize-autoloader --no-dev - -# 4. Cache leeren -echo "🧹 Cache leeren..." -php artisan config:clear -php artisan cache:clear -php artisan view:clear -php artisan route:clear - -# 5. Storage-Link erstellen -echo "🔗 Storage-Link erstellen..." -php artisan storage:link - -# 6. Berechtigungen setzen -echo "🔐 Berechtigungen setzen..." -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -chmod 644 .env - -# 7. Datenbank-Migrationen -echo "🗄️ Datenbank-Migrationen..." -php artisan migrate --force - -# 8. Cache optimieren -echo "⚡ Cache optimieren..." -php artisan config:cache -php artisan route:cache -php artisan view:cache - -echo "✅ SQLite Deployment abgeschlossen!" -echo "" -echo "📋 Nächste Schritte:" -echo "1. Admin-User erstellen: php artisan tinker" -echo "2. Testen der Anwendung" -echo "3. HTTPS aktivieren" -echo "4. Backup-Strategie einrichten" -echo "" -echo "💡 SQLite Vorteile:" -echo "- Keine MySQL-Installation nötig" -echo "- Einfaches Backup (nur eine Datei)" -echo "- Minimaler Konfigurationsaufwand" diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index ab47a51..0000000 --- a/deploy.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# NeoNail DB Deployment Script -echo "🚀 NeoNail DB Deployment gestartet..." - -# 1. Composer Dependencies optimieren -echo "📦 Composer Dependencies optimieren..." -composer install --optimize-autoloader --no-dev - -# 2. Cache leeren -echo "🧹 Cache leeren..." -php artisan config:clear -php artisan cache:clear -php artisan view:clear -php artisan route:clear - -# 3. Storage-Link erstellen -echo "🔗 Storage-Link erstellen..." -php artisan storage:link - -# 4. Berechtigungen setzen -echo "🔐 Berechtigungen setzen..." -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -chmod 644 .env - -# 5. Datenbank-Migrationen -echo "🗄️ Datenbank-Migrationen..." -php artisan migrate --force - -# 6. Cache optimieren -echo "⚡ Cache optimieren..." -php artisan config:cache -php artisan route:cache -php artisan view:cache - -echo "✅ Deployment abgeschlossen!" -echo "" -echo "📋 Nächste Schritte:" -echo "1. Admin-User erstellen: php artisan tinker" -echo "2. Testen der Anwendung" -echo "3. HTTPS aktivieren" -echo "4. Backup-Strategie einrichten" diff --git a/deployment-checklist.md b/deployment-checklist.md deleted file mode 100755 index 097f175..0000000 --- a/deployment-checklist.md +++ /dev/null @@ -1,111 +0,0 @@ -# NeoNail DB - Deployment Checklist - -## Vorbereitung (Lokal) - -### 1. Produktions-Umgebung konfigurieren -```bash -# .env.production erstellen -cp .env .env.production - -# Produktions-Einstellungen in .env.production: -APP_ENV=production -APP_DEBUG=false -APP_URL=https://ihre-domain.de - -# Datenbank-Einstellungen -DB_CONNECTION=mysql -DB_HOST=localhost -DB_PORT=3306 -DB_DATABASE=ihre_datenbank -DB_USERNAME=ihr_username -DB_PASSWORD=ihr_passwort -``` - -### 2. Dependencies optimieren -```bash -composer install --optimize-autoloader --no-dev -npm run build # falls vorhanden -``` - -### 3. Cache leeren und optimieren -```bash -php artisan config:clear -php artisan cache:clear -php artisan view:clear -php artisan route:clear -``` - -### 4. Storage-Link erstellen -```bash -php artisan storage:link -``` - -## Upload zum Webspace - -### 1. Dateien hochladen -- Alle Dateien außer `node_modules/`, `vendor/` (falls vorhanden) -- `.env.production` als `.env` hochladen -- `storage/` und `bootstrap/cache/` Ordner mit Schreibrechten - -### 2. Composer installieren (falls verfügbar) -```bash -composer install --optimize-autoloader --no-dev -``` - -### 3. Datenbank-Migrationen -```bash -php artisan migrate --force -``` - -### 4. Berechtigungen setzen -```bash -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -chmod 644 .env -``` - -## Nach dem Upload - -### 1. Cache optimieren -```bash -php artisan config:cache -php artisan route:cache -php artisan view:cache -``` - -### 2. Admin-User erstellen -```bash -php artisan tinker -``` -```php -use App\Models\User; -User::create([ - 'name' => 'Admin', - 'email' => 'admin@neonail.com', - 'password' => bcrypt('ihr_admin_passwort') -]); -``` - -### 3. Testen -- Login mit admin@neonail.com -- Neuen Lack erstellen -- Bild-Upload testen -- Mobile-Ansicht prüfen - -## Wichtige Hinweise - -### Sicherheit -- APP_KEY muss gesetzt sein -- Starke Passwörter verwenden -- HTTPS verwenden -- .env nicht öffentlich zugänglich - -### Performance -- OPcache aktivieren (falls verfügbar) -- Redis für Cache (optional) -- CDN für Bilder (optional) - -### Backup -- Regelmäßige Datenbank-Backups -- Storage-Ordner sichern -- Code-Backup diff --git a/emergency-apache-fix.sh b/emergency-apache-fix.sh deleted file mode 100755 index c2791cf..0000000 --- a/emergency-apache-fix.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -echo "🚨 EMERGENCY: Apache komplett reparieren" -echo "=======================================" - -# 1. Apache-Status prüfen -echo "1. 🔍 Apache-Status prüfen..." -systemctl status apache2 2>/dev/null || service apache2 status 2>/dev/null || echo " ⚠️ Apache-Status nicht verfügbar" - -# 2. Apache stoppen -echo "2. 🛑 Apache stoppen..." -systemctl stop apache2 2>/dev/null || service apache2 stop 2>/dev/null || echo " ⚠️ Apache stop fehlgeschlagen" - -# 3. .htaccess zurücksetzen -echo "3. 🔄 .htaccess zurücksetzen..." -if [ -f public/.htaccess.backup ]; then - cp public/.htaccess.backup public/.htaccess - echo " ✅ .htaccess aus Backup wiederhergestellt" -elif [ -f public/.htaccess.simple ]; then - cp public/.htaccess.simple public/.htaccess - echo " ✅ .htaccess aus simple wiederhergestellt" -else - # Erstelle minimale .htaccess - cat > public/.htaccess << 'EOF' - - RewriteEngine On - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - -EOF - echo " ✅ Minimale .htaccess erstellt" -fi - -# 4. Apache-Module zurücksetzen -echo "4. 🔧 Apache-Module zurücksetzen..." -a2dismod headers 2>/dev/null || echo " ⚠️ mod_headers deaktivieren fehlgeschlagen" -a2enmod rewrite 2>/dev/null || echo " ⚠️ mod_rewrite aktivieren fehlgeschlagen" - -# 5. Apache-Konfiguration testen -echo "5. 🧪 Apache-Konfiguration testen..." -apache2ctl -t 2>/dev/null && echo " ✅ Apache-Konfiguration OK" || echo " ❌ Apache-Konfiguration fehlerhaft" - -# 6. Apache starten -echo "6. 🚀 Apache starten..." -systemctl start apache2 2>/dev/null || service apache2 start 2>/dev/null || echo " ⚠️ Apache start fehlgeschlagen" - -# 7. Apache-Status prüfen -echo "7. 🔍 Apache-Status nach Start..." -systemctl status apache2 2>/dev/null || service apache2 status 2>/dev/null || echo " ⚠️ Apache-Status nicht verfügbar" - -# 8. Test-Request -echo "8. 🧪 Test-Request..." -curl -I http://localhost/ 2>/dev/null && echo " ✅ Apache antwortet" || echo " ❌ Apache antwortet nicht" - -echo "" -echo "✅ Emergency Apache Fix abgeschlossen!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. http://neonail.vogt.de.com" -echo "2. https://neonail.vogt.de.com" -echo "" -echo "📝 Falls Problem besteht:" -echo "- Prüfen Sie: systemctl status apache2" -echo "- Schauen Sie in: /var/log/apache2/error.log" -echo "- Führen Sie: apache2ctl -t" diff --git a/env-production-example.txt b/env-production-example.txt deleted file mode 100755 index 0fe2526..0000000 --- a/env-production-example.txt +++ /dev/null @@ -1,55 +0,0 @@ -APP_NAME="NeoNail DB" -APP_ENV=production -APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs= -APP_DEBUG=false -APP_URL=http://192.168.30.81 - -LOG_CHANNEL=stack -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=sqlite -DB_DATABASE=database.sqlite - -BROADCAST_DRIVER=log -CACHE_DRIVER=file -FILESYSTEM_DISK=local -QUEUE_CONNECTION=sync -SESSION_DRIVER=file -SESSION_LIFETIME=120 - -MEMCACHED_HOST=127.0.0.1 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=smtp -MAIL_HOST=mailpit -MAIL_PORT=1025 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS="hello@example.com" -MAIL_FROM_NAME="${APP_NAME}" - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_DEFAULT_REGION=us-east-1 -AWS_BUCKET= -AWS_USE_PATH_STYLE_ENDPOINT=false - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= -PUSHER_HOST= -PUSHER_PORT=443 -PUSHER_SCHEME=https -PUSHER_APP_CLUSTER=mt1 - -VITE_APP_NAME="${APP_NAME}" -VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -VITE_PUSHER_HOST="${PUSHER_HOST}" -VITE_PUSHER_PORT="${PUSHER_PORT}" -VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" -VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/env-production-guide.md b/env-production-guide.md deleted file mode 100644 index e69de29..0000000 diff --git a/env-sqlite-example.txt b/env-sqlite-example.txt deleted file mode 100755 index 27bdb00..0000000 --- a/env-sqlite-example.txt +++ /dev/null @@ -1,64 +0,0 @@ -APP_NAME="NeoNail DB" -APP_ENV=production -APP_KEY=base64:YOUR_APP_KEY_HERE -APP_DEBUG=false -APP_URL=https://ihre-domain.de - -LOG_CHANNEL=stack -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=error - -# SQLite Konfiguration (Einfachste Option) -DB_CONNECTION=sqlite -DB_DATABASE=/path/to/database.sqlite - -# MySQL Konfiguration (Alternative) -# DB_CONNECTION=mysql -# DB_HOST=localhost -# DB_PORT=3306 -# DB_DATABASE=ihre_datenbank -# DB_USERNAME=ihr_username -# DB_PASSWORD=ihr_passwort - -BROADCAST_DRIVER=log -CACHE_DRIVER=file -FILESYSTEM_DISK=local -QUEUE_CONNECTION=sync -SESSION_DRIVER=file -SESSION_LIFETIME=120 - -MEMCACHED_HOST=127.0.0.1 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=smtp -MAIL_HOST=mailpit -MAIL_PORT=1025 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS="hello@example.com" -MAIL_FROM_NAME="${APP_NAME}" - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_DEFAULT_REGION=us-east-1 -AWS_BUCKET= -AWS_USE_PATH_STYLE_ENDPOINT=false - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= -PUSHER_HOST= -PUSHER_PORT=443 -PUSHER_SCHEME=https -PUSHER_APP_CLUSTER=mt1 - -VITE_APP_NAME="${APP_NAME}" -VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -VITE_PUSHER_HOST="${PUSHER_HOST}" -VITE_PUSHER_PORT="${PUSHER_PORT}" -VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" -VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/fix-405-error.sh b/fix-405-error.sh deleted file mode 100755 index 53d3a57..0000000 --- a/fix-405-error.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -echo "🔧 Fix: HTTP 405 Method Not Allowed" -echo "===================================" - -# 1. Debug-Script ausführen -echo "1. 🔍 Diagnose ausführen..." -php debug-405-error.php - -echo "" -echo "2. 🧹 Laravel Cache leeren..." -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" - -echo "" -echo "3. 🔄 Route-Cache neu generieren..." -php artisan route:cache 2>/dev/null || echo "⚠️ route:cache übersprungen" - -echo "" -echo "4. 📝 .env Debug aktivieren..." -if [ -f .env ]; then - sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env - sed -i 's/APP_ENV=production/APP_ENV=local/' .env - echo "✅ Debug-Modus aktiviert" -else - echo "❌ .env Datei nicht gefunden" -fi - -echo "" -echo "5. 🔍 Apache-Logs prüfen..." -if [ -f /var/log/apache2/error.log ]; then - echo "📋 Letzte Apache-Fehler:" - tail -10 /var/log/apache2/error.log | grep -E "(405|Method|Not Allowed)" || echo "Keine 405-Fehler gefunden" -else - echo "⚠️ Apache-Logs nicht verfügbar" -fi - -echo "" -echo "6. 🧪 Route-Test..." -echo "📋 Teste POST-Route direkt:" -curl -X POST https://neonail.vogt.de.com/create-nail-polish \ - -H "Content-Type: application/x-www-form-urlencoded" \ - -d "name=Test&number=123&_token=test" \ - -w "\nHTTP-Status: %{http_code}\n" \ - 2>/dev/null || echo "❌ curl nicht verfügbar" - -echo "" -echo "✅ Fix abgeschlossen!" -echo "" -echo "🔧 Nächste Schritte:" -echo "1. Testen Sie das Formular erneut" -echo "2. Prüfen Sie die Browser-Entwicklertools (F12) für Details" -echo "3. Schauen Sie in storage/logs/laravel.log für Laravel-Fehler" -echo "4. Falls Problem besteht: php artisan route:list | grep store" diff --git a/fix-admin-controller-email.php b/fix-admin-controller-email.php deleted file mode 100644 index d40f9ca..0000000 --- a/fix-admin-controller-email.php +++ /dev/null @@ -1,284 +0,0 @@ -take(5)->get(); - $recentNailPolishes = NailPolish::latest()->take(5)->get(); - - return view("admin.dashboard", compact("totalUsers", "totalNailPolishes", "recentUsers", "recentNailPolishes")); - } - - /** - * Liste aller Benutzer - */ - public function users(Request $request) - { - $search = $request->get("search"); - - $users = User::when($search, function($query) use ($search) { - return $query->where("name", "like", "%{$search}%") - ->orWhere("email", "like", "%{$search}%"); - })->orderBy("name")->paginate(20); - - return view("admin.users.index", compact("users", "search")); - } - - /** - * Formular zum Erstellen eines neuen Benutzers - */ - public function createUser() - { - return view("admin.users.create"); - } - - /** - * Neuen Benutzer speichern - */ - public function storeUser(Request $request) - { - $request->validate([ - "name" => "required|string|max:255", - "email" => "required|string|email|max:255|unique:users", - "password" => "required|string|min:8|confirmed", - ]); - - // Passwort für E-Mail speichern (wird nach dem Speichern gelöscht) - $plainPassword = $request->password; - - // User erstellen - $user = User::create([ - "name" => $request->name, - "email" => $request->email, - "password" => Hash::make($request->password), - "is_admin" => $request->has("is_admin"), - ]); - - // Willkommens-E-Mail senden - try { - Mail::send("emails.welcome-user", [ - "user" => $user, - "password" => $plainPassword - ], function($message) use ($user) { - $message->to($user->email, $user->name) - ->subject("🎨 Willkommen bei der NeoNail DB - Ihre Login-Daten") - ->from(config("mail.from.address"), config("mail.from.name")); - }); - - // Admin-Bestätigung senden - Mail::raw("Hallo Admin! - -Ein neuer User wurde erfolgreich erstellt und eine Willkommens-E-Mail gesendet. - -📋 User-Details: - - Name: {$user->name} - - E-Mail: {$user->email} - - Admin-Status: " . ($user->isAdmin() ? "Ja" : "Nein") . " - - Erstellt: " . now() . " - -Die Willkommens-E-Mail enthält: - - Login-Daten (Website, E-Mail, Passwort) - - Aufforderung zum Passwort-Ändern - - Feature-Übersicht - - Direkte Links zur Anwendung - -Viele Grüße, -NeoNail DB System", function($message) { - $message->to("oliver@vogt.de.com", "Admin") - ->subject("✅ NeoNail DB - Neuer User erstellt") - ->from(config("mail.from.address"), config("mail.from.name")); - }); - - $successMessage = "Benutzer erfolgreich erstellt! Willkommens-E-Mail wurde gesendet."; - - } catch (\Exception $e) { - // User wurde erstellt, aber E-Mail fehlgeschlagen - \Log::error("Fehler beim Senden der Willkommens-E-Mail: " . $e->getMessage()); - $successMessage = "Benutzer erfolgreich erstellt! E-Mail konnte nicht gesendet werden."; - } - - return redirect()->route("admin.users.index") - ->with("success", $successMessage); - } - - /** - * Formular zum Bearbeiten eines Benutzers - */ - public function editUser(User $user) - { - return view("admin.users.edit", compact("user")); - } - - /** - * Benutzer aktualisieren - */ - public function updateUser(Request $request, User $user) - { - $request->validate([ - "name" => "required|string|max:255", - "email" => "required|string|email|max:255|unique:users,email," . $user->id, - "password" => "nullable|string|min:8|confirmed", - ]); - - $user->name = $request->name; - $user->email = $request->email; - $user->is_admin = $request->has("is_admin"); - - if ($request->filled("password")) { - $user->password = Hash::make($request->password); - } - - $user->save(); - - return redirect()->route("admin.users.index") - ->with("success", "Benutzer erfolgreich aktualisiert!"); - } - - /** - * Benutzer löschen - */ - public function destroyUser(User $user) - { - $userName = $user->name; - $userEmail = $user->email; - - $user->delete(); - - // Admin-Benachrichtigung über gelöschten User - try { - Mail::raw("Hallo Admin! - -Ein User wurde erfolgreich gelöscht. - -📋 Gelöschter User: - - Name: {$userName} - - E-Mail: {$userEmail} - - Gelöscht: " . now() . " - -Viele Grüße, -NeoNail DB System", function($message) { - $message->to("oliver@vogt.de.com", "Admin") - ->subject("🗑️ NeoNail DB - User gelöscht") - ->from(config("mail.from.address"), config("mail.from.name")); - }); - } catch (\Exception $e) { - \Log::error("Fehler beim Senden der Lösch-Benachrichtigung: " . $e->getMessage()); - } - - return redirect()->route("admin.users.index") - ->with("success", "Benutzer erfolgreich gelöscht!"); - } - - /** - * Statistiken anzeigen - */ - public function statistics() - { - $totalUsers = User::count(); - $totalNailPolishes = NailPolish::count(); - $usersWithCollections = User::has("nailPolishes")->count(); - $averageCollectionSize = User::withCount("nailPolishes")->avg("nail_polishes_count"); - - $topUsers = User::withCount("nailPolishes") - ->orderBy("nail_polishes_count", "desc") - ->take(10) - ->get(); - - return view("admin.statistics", compact( - "totalUsers", - "totalNailPolishes", - "usersWithCollections", - "averageCollectionSize", - "topUsers" - )); - } -}'; - -file_put_contents('app/Http/Controllers/AdminController.php', $controllerContent); -echo " ✅ AdminController erweitert\n"; - -// 2. E-Mail-Verzeichnis erstellen -echo "2. 📁 E-Mail-Verzeichnis erstellen...\n"; -$emailDir = 'resources/views/emails'; -if (!is_dir($emailDir)) { - mkdir($emailDir, 0755, true); - echo " ✅ E-Mail-Verzeichnis erstellt: $emailDir\n"; -} else { - echo " ℹ️ E-Mail-Verzeichnis existiert bereits: $emailDir\n"; -} - -// 3. Cache leeren -echo "3. 🧹 Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 4. Test-E-Mail senden -echo "4. 📧 Test-E-Mail senden...\n"; -try { - require_once 'vendor/autoload.php'; - - // Laravel Bootstrap - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Test-User erstellen - $testUser = new \App\Models\User(); - $testUser->name = 'Test User'; - $testUser->email = 'test@example.com'; - $testUser->password = 'testpassword123'; - $testUser->is_admin = false; - - // Test-E-Mail senden - $result = \Illuminate\Support\Facades\Mail::send('emails.welcome-user', [ - 'user' => $testUser, - 'password' => 'testpassword123' - ], function($message) use ($testUser) { - $message->to('oliver@vogt.de.com', 'Admin') - ->subject('🧪 Test: NeoNail DB Willkommens-E-Mail Template') - ->from(config('mail.from.address'), config('mail.from.name')); - }); - - echo " ✅ Test-E-Mail erfolgreich gesendet!\n"; - -} catch (Exception $e) { - echo " ❌ Test-E-Mail Fehler: " . $e->getMessage() . "\n"; -} - -echo "\n✅ AdminController mit E-Mail-Versendung erweitert!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Gehen Sie zu: https://neonail.vogt.de.com/admin/users/create\n"; -echo "2. Erstellen Sie einen neuen User\n"; -echo "3. Der User erhält automatisch eine Willkommens-E-Mail\n"; -echo "4. Sie erhalten eine Admin-Bestätigung\n"; -echo "\n📧 Die Willkommens-E-Mail enthält:\n"; -echo "- Login-Daten (Website, E-Mail, Passwort)\n"; -echo "- Aufforderung zum Passwort-Ändern\n"; -echo "- Feature-Übersicht\n"; -echo "- Direkte Links zur Anwendung\n"; -echo "- Admin-spezifische Informationen (falls Admin)\n"; -?> diff --git a/fix-admin-layout.php b/fix-admin-layout.php deleted file mode 100644 index daa8e46..0000000 --- a/fix-admin-layout.php +++ /dev/null @@ -1,291 +0,0 @@ - - - - - - - @yield("title", "NeoNail Datenbank") - - - - - - - - - @yield("styles") - - - - -
-
- @if(session("success")) - - @endif - - @if(session("error")) - - @endif - - @yield("content") -
-
- - - - - @yield("scripts") - -'; - -file_put_contents('resources/views/layouts/app.blade.php', $layoutContent); -echo " ✅ Layout-Datei korrigiert\n"; - -// 2. User Model prüfen und korrigieren -echo "2. 📋 User Model prüfen...\n"; -$userModelPath = 'app/Models/User.php'; -if (file_exists($userModelPath)) { - $content = file_get_contents($userModelPath); - - // Prüfe ob isAdmin Methode korrekt ist - if (strpos($content, 'public function isAdmin()') !== false) { - echo " ✅ isAdmin() Methode vorhanden\n"; - - // Prüfe ob die Methode korrekt implementiert ist - if (strpos($content, '$this->is_admin || in_array($this->email') !== false) { - echo " ✅ isAdmin() Methode korrekt implementiert\n"; - } else { - echo " ⚠️ isAdmin() Methode könnte inkorrekt sein\n"; - } - } else { - echo " ❌ isAdmin() Methode fehlt\n"; - } - -} else { - echo " ❌ User Model nicht gefunden\n"; -} - -// 3. Cache leeren -echo "3. 🧹 Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 4. Admin-User Status prüfen -echo "4. 👑 Admin-User Status prüfen...\n"; -try { - require_once 'vendor/autoload.php'; - - // Laravel Bootstrap - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Alle User prüfen - $users = \App\Models\User::all(); - - foreach ($users as $user) { - $isAdmin = $user->isAdmin(); - $isAdminColumn = $user->is_admin; - $email = $user->email; - - echo " 📧 $email:\n"; - echo " - is_admin Spalte: " . ($isAdminColumn ? 'Ja' : 'Nein') . "\n"; - echo " - isAdmin() Methode: " . ($isAdmin ? 'Ja' : 'Nein') . "\n"; - - if ($isAdminColumn && !$isAdmin) { - echo " ⚠️ WARNUNG: Spalte ist true, aber Methode gibt false zurück!\n"; - } elseif (!$isAdminColumn && $isAdmin) { - echo " ℹ️ INFO: Spalte ist false, aber Methode gibt true zurück (Email-Check)\n"; - } - echo "\n"; - } - -} catch (Exception $e) { - echo " ❌ Fehler beim Prüfen der User: " . $e->getMessage() . "\n"; -} - -echo "\n✅ Admin-Layout korrigiert!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Melden Sie sich als neuer Admin an\n"; -echo "2. Prüfen Sie ob Admin-Menü sichtbar ist\n"; -echo "3. Prüfen Sie ob Admin-Badge neben dem Namen steht\n"; -echo "4. Versuchen Sie auf /admin/users zuzugreifen\n"; -echo "5. Falls Problem besteht, führen Sie php fix-admin-view.php aus\n"; -?> diff --git a/fix-admin-role-database.php b/fix-admin-role-database.php deleted file mode 100644 index 9f735df..0000000 --- a/fix-admin-role-database.php +++ /dev/null @@ -1,120 +0,0 @@ -setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - - echo "1. 🔍 Prüfe users-Tabelle...\n"; - - // Prüfe ob is_admin Spalte existiert - $stmt = $pdo->query("PRAGMA table_info(users)"); - $columns = $stmt->fetchAll(PDO::FETCH_ASSOC); - $hasAdminColumn = false; - - echo " 📋 Aktuelle Spalten in users-Tabelle:\n"; - foreach ($columns as $column) { - echo " - {$column['name']} ({$column['type']})\n"; - if ($column['name'] === 'is_admin') { - $hasAdminColumn = true; - } - } - - if (!$hasAdminColumn) { - echo "\n2. ➕ Füge is_admin Spalte hinzu...\n"; - - // Füge is_admin Spalte hinzu - $pdo->exec("ALTER TABLE users ADD COLUMN is_admin BOOLEAN DEFAULT 0"); - echo " ✅ is_admin Spalte hinzugefügt\n"; - - // Prüfe nochmal - $stmt = $pdo->query("PRAGMA table_info(users)"); - $columns = $stmt->fetchAll(PDO::FETCH_ASSOC); - $hasAdminColumn = false; - - foreach ($columns as $column) { - if ($column['name'] === 'is_admin') { - $hasAdminColumn = true; - break; - } - } - - if ($hasAdminColumn) { - echo " ✅ is_admin Spalte erfolgreich erstellt\n"; - } else { - echo " ❌ is_admin Spalte konnte nicht erstellt werden\n"; - exit; - } - } else { - echo "\n2. ℹ️ is_admin Spalte existiert bereits\n"; - } - - echo "\n3. 👑 Markiere bestehende Admin-User...\n"; - - // Markiere bestehende Admin-User - $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE email IN (?, ?)"); - $stmt->execute(['admin@neonail.com', 'neueradmin@neonail.com']); - $affectedRows = $stmt->rowCount(); - echo " ✅ $affectedRows Admin-User aktualisiert\n"; - - echo "\n4. 📋 Zeige alle User mit Admin-Status...\n"; - - // Zeige alle User - $stmt = $pdo->query("SELECT id, name, email, is_admin FROM users ORDER BY is_admin DESC, name"); - $users = $stmt->fetchAll(PDO::FETCH_ASSOC); - - foreach ($users as $user) { - $adminStatus = $user['is_admin'] ? '👑 Admin' : '👤 User'; - echo " - {$user['name']} ({$user['email']}) - {$adminStatus}\n"; - } - - echo "\n5. 🧪 Test: Mache einen User zum Admin...\n"; - - // Finde einen User, der noch kein Admin ist - $stmt = $pdo->prepare("SELECT id, name, email FROM users WHERE is_admin = 0 LIMIT 1"); - $stmt->execute(); - $testUser = $stmt->fetch(PDO::FETCH_ASSOC); - - if ($testUser) { - echo " 📝 Teste mit User: {$testUser['name']} ({$testUser['email']})\n"; - - // Mache User zum Admin - $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE id = ?"); - $stmt->execute([$testUser['id']]); - - echo " ✅ User zum Admin gemacht\n"; - - // Prüfe Änderung - $stmt = $pdo->prepare("SELECT is_admin FROM users WHERE id = ?"); - $stmt->execute([$testUser['id']]); - $result = $stmt->fetch(PDO::FETCH_ASSOC); - - if ($result['is_admin']) { - echo " ✅ Admin-Status korrekt gesetzt\n"; - } else { - echo " ❌ Admin-Status nicht korrekt gesetzt\n"; - } - - // Mache User wieder zurück - $stmt = $pdo->prepare("UPDATE users SET is_admin = 0 WHERE id = ?"); - $stmt->execute([$testUser['id']]); - echo " 🔄 User-Status zurückgesetzt\n"; - - } else { - echo " ℹ️ Alle User sind bereits Admins\n"; - } - - echo "\n✅ Admin-Rolle erfolgreich zur Datenbank hinzugefügt!\n"; - echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/admin/users\n"; - echo "📝 Sie können jetzt User zum Admin machen!\n"; - -} catch (Exception $e) { - echo "❌ Fehler: " . $e->getMessage() . "\n"; - echo "📍 Datei: " . $e->getFile() . ":" . $e->getLine() . "\n"; -} -?> diff --git a/fix-admin-role.php b/fix-admin-role.php deleted file mode 100755 index 67a864e..0000000 --- a/fix-admin-role.php +++ /dev/null @@ -1,54 +0,0 @@ -setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - - echo "🔧 Admin-Rolle hinzufügen...\n"; - - // 1. Prüfe ob is_admin Spalte existiert - $stmt = $pdo->query("PRAGMA table_info(users)"); - $columns = $stmt->fetchAll(PDO::FETCH_ASSOC); - $hasAdminColumn = false; - - foreach ($columns as $column) { - if ($column['name'] === 'is_admin') { - $hasAdminColumn = true; - break; - } - } - - if (!$hasAdminColumn) { - // 2. Füge is_admin Spalte hinzu - $pdo->exec("ALTER TABLE users ADD COLUMN is_admin BOOLEAN DEFAULT 0"); - echo "✅ is_admin Spalte hinzugefügt\n"; - } else { - echo "ℹ️ is_admin Spalte existiert bereits\n"; - } - - // 3. Markiere bestehende Admin-User - $stmt = $pdo->prepare("UPDATE users SET is_admin = 1 WHERE email IN (?, ?)"); - $stmt->execute(['admin@neonail.com', 'neueradmin@neonail.com']); - echo "✅ Admin-User aktualisiert\n"; - - // 4. Zeige alle User - echo "\n📋 Alle User:\n"; - $stmt = $pdo->query("SELECT id, name, email, is_admin FROM users"); - $users = $stmt->fetchAll(PDO::FETCH_ASSOC); - - foreach ($users as $user) { - $adminStatus = $user['is_admin'] ? '👑 Admin' : '👤 User'; - echo "- {$user['name']} ({$user['email']}) - {$adminStatus}\n"; - } - - echo "\n✅ Admin-Rolle erfolgreich aktiviert!\n"; - echo "🔗 Gehen Sie zu: https://neonail.vogt.de.com/admin/users\n"; - echo "📝 Bearbeiten Sie einen User und aktivieren Sie die 'Admin-Rechte gewähren' Checkbox\n"; - -} catch (Exception $e) { - echo "❌ Fehler: " . $e->getMessage() . "\n"; -} -?> diff --git a/fix-admin-routes.php b/fix-admin-routes.php deleted file mode 100644 index 5be868b..0000000 --- a/fix-admin-routes.php +++ /dev/null @@ -1,165 +0,0 @@ - $line) { - if (strpos($line, 'admin') !== false || strpos($line, 'Admin') !== false) { - $adminLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - echo " 📄 Admin-bezogene Zeilen in routes/web.php:\n"; - foreach ($adminLines as $line) { - echo " $line\n"; - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 2. Route-Liste generieren -echo "\n2. 🛣️ Route-Liste generieren:\n"; -try { - // Laravel Bootstrap - require_once 'vendor/autoload.php'; - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Route-Liste abrufen - $routes = \Illuminate\Support\Facades\Route::getRoutes(); - - $adminRoutes = []; - foreach ($routes as $route) { - $uri = $route->uri(); - $methods = $route->methods(); - $name = $route->getName(); - - if (strpos($uri, 'admin') !== false || strpos($name, 'admin') !== false) { - $adminRoutes[] = [ - 'uri' => $uri, - 'methods' => $methods, - 'name' => $name - ]; - } - } - - if (empty($adminRoutes)) { - echo " ⚠️ Keine Admin-Routes gefunden\n"; - } else { - echo " ✅ Admin-Routes gefunden:\n"; - foreach ($adminRoutes as $route) { - $methods = implode('|', $route['methods']); - $name = $route['name'] ?: 'kein Name'; - echo " $methods $uri ($name)\n"; - } - } - -} catch (Exception $e) { - echo " ❌ Fehler beim Abrufen der Routes: " . $e->getMessage() . "\n"; -} - -// 3. Admin-Routes manuell prüfen -echo "\n3. 🔍 Admin-Routes manuell prüfen:\n"; -$routesPath = 'routes/web.php'; -if (file_exists($routesPath)) { - $content = file_get_contents($routesPath); - - // Suche nach spezifischen Admin-Route-Patterns - $adminPatterns = [ - 'admin/dashboard' => 'Dashboard Route', - 'admin/users' => 'Users Index Route', - 'admin/users/create' => 'Users Create Route', - 'admin/users/{user}/edit' => 'Users Edit Route', - 'admin/statistics' => 'Statistics Route', - 'admin/users/{user}' => 'Users Show/Edit Route', - 'nail-polishes' => 'Nail Polishes Route' - ]; - - foreach ($adminPatterns as $pattern => $description) { - if (strpos($content, $pattern) !== false) { - echo " ✅ Pattern gefunden: $pattern ($description)\n"; - } else { - echo " ❌ Pattern fehlt: $pattern ($description)\n"; - } - } - - // Prüfe Route-Gruppen - if (strpos($content, "Route::middleware(['admin'])->prefix('admin')") !== false) { - echo " ✅ Admin Route-Gruppe gefunden\n"; - } else { - echo " ❌ Admin Route-Gruppe nicht gefunden\n"; - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 4. Cache leeren und Routes neu laden -echo "\n4. 🧹 Cache leeren und Routes neu laden...\n"; -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 5. Admin-User Status prüfen -echo "\n5. 👑 Admin-User Status prüfen:\n"; -try { - // Alle User mit Admin-Rechten auflisten - $users = \App\Models\User::all(); - - foreach ($users as $user) { - $isAdmin = $user->isAdmin(); - $isAdminColumn = $user->is_admin; - $email = $user->email; - - if ($isAdmin || $isAdminColumn) { - echo " 📧 $email:\n"; - echo " - is_admin Spalte: " . ($isAdminColumn ? 'Ja' : 'Nein') . "\n"; - echo " - isAdmin() Methode: " . ($isAdmin ? 'Ja' : 'Nein') . "\n"; - echo " - Admin-Status: " . ($isAdmin ? '✅ Admin' : '❌ Kein Admin') . "\n"; - echo "\n"; - } - } - -} catch (Exception $e) { - echo " ❌ Fehler beim Prüfen der User: " . $e->getMessage() . "\n"; -} - -// 6. Test-URLs generieren -echo "\n6. 🔗 Test-URLs für Admin-Zugriffe:\n"; -$baseUrl = 'https://neonail.vogt.de.com'; -$adminUrls = [ - '/admin/dashboard' => 'Admin Dashboard', - '/admin/users' => 'Admin Users', - '/admin/users/create' => 'Admin Create User', - '/admin/statistics' => 'Admin Statistics', - '/nail-polishes' => 'Nail Polishes Management' -]; - -foreach ($adminUrls as $url => $description) { - echo " 🔗 $baseUrl$url ($description)\n"; -} - -echo "\n✅ Admin-Routes Analyse abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Melden Sie sich als Admin an (oliver@vogt.de.com)\n"; -echo "2. Prüfen Sie ob Admin-Menü sichtbar ist\n"; -echo "3. Klicken Sie auf 'Admin' → 'Benutzer'\n"; -echo "4. Oder versuchen Sie direkt: $baseUrl/admin/users\n"; -echo "5. Falls 403 Fehler: Prüfen Sie ob User wirklich Admin ist\n"; -echo "\n📋 Falls Probleme bestehen:\n"; -echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n"; -echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n"; -echo "- Teilen Sie eventuelle Fehlermeldungen mit\n"; -?> diff --git a/fix-admin-view.php b/fix-admin-view.php deleted file mode 100644 index 08c1415..0000000 --- a/fix-admin-view.php +++ /dev/null @@ -1,158 +0,0 @@ -make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Datenbankverbindung herstellen - $users = \App\Models\User::all(); - - foreach ($users as $user) { - $isAdmin = $user->isAdmin(); - $isAdminColumn = $user->is_admin; - $email = $user->email; - - echo " 📧 $email:\n"; - echo " - is_admin Spalte: " . ($isAdminColumn ? 'Ja' : 'Nein') . "\n"; - echo " - isAdmin() Methode: " . ($isAdmin ? 'Ja' : 'Nein') . "\n"; - echo " - Admin-Email Check: " . (in_array($email, ['admin@neonail.com', 'neueradmin@neonail.com']) ? 'Ja' : 'Nein') . "\n"; - echo "\n"; - } - -} catch (Exception $e) { - echo " ❌ Fehler beim Prüfen der User: " . $e->getMessage() . "\n"; -} - -// 2. User Model prüfen -echo "2. 📋 User Model prüfen:\n"; -$userModelPath = 'app/Models/User.php'; -if (file_exists($userModelPath)) { - $content = file_get_contents($userModelPath); - - // Prüfe isAdmin Methode - if (strpos($content, 'public function isAdmin()') !== false) { - echo " ✅ isAdmin() Methode vorhanden\n"; - } else { - echo " ❌ isAdmin() Methode fehlt\n"; - } - - // Prüfe is_admin in fillable - if (strpos($content, "'is_admin'") !== false) { - echo " ✅ is_admin in \$fillable vorhanden\n"; - } else { - echo " ❌ is_admin nicht in \$fillable\n"; - } - - // Prüfe makeAdmin Methode - if (strpos($content, 'public function makeAdmin()') !== false) { - echo " ✅ makeAdmin() Methode vorhanden\n"; - } else { - echo " ❌ makeAdmin() Methode fehlt\n"; - } - -} else { - echo " ❌ User Model nicht gefunden\n"; -} - -// 3. AdminMiddleware prüfen -echo "3. 🛡️ AdminMiddleware prüfen:\n"; -$middlewarePath = 'app/Http/Middleware/AdminMiddleware.php'; -if (file_exists($middlewarePath)) { - $content = file_get_contents($middlewarePath); - - if (strpos($content, 'auth()->user()->isAdmin()') !== false) { - echo " ✅ AdminMiddleware verwendet isAdmin() Methode\n"; - } else { - echo " ❌ AdminMiddleware verwendet nicht isAdmin() Methode\n"; - } - -} else { - echo " ❌ AdminMiddleware nicht gefunden\n"; -} - -// 4. Routes prüfen -echo "4. 🛣️ Admin-Routes prüfen:\n"; -$routesPath = 'routes/web.php'; -if (file_exists($routesPath)) { - $content = file_get_contents($routesPath); - - $adminRoutes = [ - 'admin/users', - 'admin/dashboard', - 'nail-polishes' - ]; - - foreach ($adminRoutes as $route) { - if (strpos($content, $route) !== false) { - echo " ✅ Route gefunden: $route\n"; - } else { - echo " ❌ Route fehlt: $route\n"; - } - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 5. Layout prüfen -echo "5. 🎨 Layout prüfen:\n"; -$layoutPath = 'resources/views/layouts/app.blade.php'; -if (file_exists($layoutPath)) { - $content = file_get_contents($layoutPath); - - if (strpos($content, 'auth()->user()->isAdmin()') !== false) { - echo " ✅ Layout verwendet isAdmin() für Admin-Menü\n"; - } else { - echo " ❌ Layout verwendet nicht isAdmin() für Admin-Menü\n"; - } - -} else { - echo " ❌ Layout-Datei nicht gefunden\n"; -} - -// 6. Cache leeren -echo "6. 🧹 Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 7. Test-Admin erstellen -echo "7. 👑 Test-Admin erstellen...\n"; -try { - $testUser = \App\Models\User::where('email', 'testadmin@neonail.com')->first(); - - if (!$testUser) { - $testUser = new \App\Models\User(); - $testUser->name = 'Test Admin'; - $testUser->email = 'testadmin@neonail.com'; - $testUser->password = bcrypt('password123'); - $testUser->is_admin = true; - $testUser->save(); - echo " ✅ Test-Admin erstellt: testadmin@neonail.com\n"; - } else { - $testUser->is_admin = true; - $testUser->save(); - echo " ✅ Test-Admin aktualisiert: testadmin@neonail.com\n"; - } - -} catch (Exception $e) { - echo " ❌ Fehler beim Erstellen des Test-Admins: " . $e->getMessage() . "\n"; -} - -echo "\n✅ Admin-Ansicht Problem Analyse abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Melden Sie sich als neuer Admin an\n"; -echo "2. Prüfen Sie ob Admin-Menü sichtbar ist\n"; -echo "3. Versuchen Sie auf /admin/users zuzugreifen\n"; -echo "4. Falls Problem besteht, teilen Sie die Ausgabe mit\n"; -?> diff --git a/fix-all-405-errors.sh b/fix-all-405-errors.sh deleted file mode 100644 index a503001..0000000 --- a/fix-all-405-errors.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -echo "🔧 Fix: Alle HTTP 405 Method Not Allowed Fehler" -echo "==============================================" - -# 1. Laravel Cache leeren -echo "1. 🧹 Laravel Cache leeren..." -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen" - -# 2. Bootstrap Cache leeren -echo "2. 🗂️ Bootstrap Cache leeren..." -rm -f bootstrap/cache/*.php 2>/dev/null || echo "⚠️ bootstrap/cache/*.php nicht gefunden" - -# 3. Route-Tests ausführen -echo "3. 🧪 Route-Tests ausführen..." -echo " - Create-Route Test:" -php test-route-fix.php 2>/dev/null || echo "⚠️ test-route-fix.php übersprungen" - -echo " - Remove-Route Test:" -php test-remove-fix.php 2>/dev/null || echo "⚠️ test-remove-fix.php übersprungen" - -# 4. Debug-Modus aktivieren -echo "4. 🐛 Debug-Modus aktivieren..." -if [ -f .env ]; then - sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env - sed -i 's/APP_ENV=production/APP_ENV=local/' .env - echo " ✅ Debug-Modus aktiviert" -else - echo " ❌ .env Datei nicht gefunden" -fi - -# 5. Route-Liste anzeigen -echo "5. 📋 Route-Liste prüfen..." -php artisan route:list | grep -E "(create|remove|store)" 2>/dev/null || echo "⚠️ route:list übersprungen" - -echo "" -echo "✅ Alle 405-Fehler behoben!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. Neuen Lack erstellen: https://neonail.vogt.de.com/create-nail-polish" -echo "2. Lack entfernen: https://neonail.vogt.de.com/my-collection" -echo "3. Admin-User verwalten: https://neonail.vogt.de.com/admin/users" -echo "" -echo "📝 Falls Probleme bestehen:" -echo "- Prüfen Sie die Browser-Entwicklertools (F12)" -echo "- Schauen Sie in storage/logs/laravel.log" -echo "- Führen Sie php artisan route:list aus" diff --git a/fix-all-forms-https.sh b/fix-all-forms-https.sh deleted file mode 100755 index 810608d..0000000 --- a/fix-all-forms-https.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash - -echo "🔒 Alle Formulare für HTTPS reparieren" -echo "=====================================" - -# 1. Laravel Cache komplett leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen" - -# 2. .env für HTTPS erzwingen -echo "📝 Erzwinge HTTPS in .env..." -sed -i 's|APP_URL=http://|APP_URL=https://|' .env -sed -i 's|APP_URL=https://192.168.30.81|APP_URL=https://neonail.vogt.de.com|' .env - -# 3. Session-Konfiguration für HTTPS -echo "🔐 Konfiguriere Session für HTTPS..." -cat > config/session.php << 'EOF' - env('SESSION_DRIVER', 'file'), - 'lifetime' => env('SESSION_LIFETIME', 120), - 'expire_on_close' => false, - 'encrypt' => false, - 'files' => storage_path('framework/sessions'), - 'connection' => env('SESSION_CONNECTION'), - 'table' => 'sessions', - 'store' => env('SESSION_STORE'), - 'lottery' => [2, 100], - 'cookie' => env( - 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_').'_session' - ), - 'path' => '/', - 'domain' => env('SESSION_DOMAIN'), - 'secure' => true, - 'http_only' => true, - 'same_site' => 'lax', -]; -EOF - -# 4. AppServiceProvider für HTTPS erzwingen -echo "⚙️ Konfiguriere AppServiceProvider für HTTPS..." -cat > app/Providers/AppServiceProvider.php << 'EOF' -"; - }); - } -} -EOF - -# 5. Apache neu laden -echo "🔄 Lade Apache neu..." -systemctl reload apache2 - -# 6. Test -echo "🧪 Teste HTTPS-Konfiguration..." -curl -I https://neonail.vogt.de.com - -echo "" -echo "✅ Alle Formulare für HTTPS repariert!" -echo "📋 Testen Sie: https://neonail.vogt.de.com" -echo "" -echo "📋 Falls Warnung bleibt:" -echo "1. Safari-Cache leeren (Cmd+Shift+R)" -echo "2. Private-Fenster testen" -echo "3. Safari-Einstellungen: Entwickler > Leere Caches" -echo "4. Safari-Einstellungen: Datenschutz > Website-Daten verwalten" -echo "5. Safari komplett neu starten" diff --git a/fix-all-safari-warnings.sh b/fix-all-safari-warnings.sh deleted file mode 100755 index 1e3c663..0000000 --- a/fix-all-safari-warnings.sh +++ /dev/null @@ -1,189 +0,0 @@ -#!/bin/bash - -echo "🛡️ Fix: Alle Safari Sicherheitswarnungen" -echo "=======================================" - -# 1. Alle Formulare mit HTTPS-URLs beheben -echo "1. 🔒 Alle Formulare mit HTTPS beheben..." - -# Login-Formular -if [ -f resources/views/auth/login.blade.php ]; then - sed -i 's|action="{{ route('\''login'\'') }}"|action="https://neonail.vogt.de.com/login"|' resources/views/auth/login.blade.php - echo " ✅ Login-Formular behoben" -fi - -# Create Nail Polish Formular -if [ -f resources/views/user-nail-polishes/create.blade.php ]; then - sed -i 's|action="{{ route('\''user-nail-polishes.store'\'') }}"|action="https://neonail.vogt.de.com/create-nail-polish"|' resources/views/user-nail-polishes/create.blade.php - echo " ✅ Create Nail Polish Formular behoben" -fi - -# Remove Nail Polish Formular -if [ -f resources/views/user-nail-polishes/index.blade.php ]; then - sed -i 's|action="https://neonail.vogt.de.com/user-nail-polishes/|action="https://neonail.vogt.de.com/remove-from-collection/|' resources/views/user-nail-polishes/index.blade.php - echo " ✅ Remove Nail Polish Formular behoben" -fi - -# Admin Nail Polish Delete Formular -if [ -f resources/views/nail-polishes/index.blade.php ]; then - sed -i 's|action="{{ route('\''nail-polishes.destroy'\'', $nailPolish) }}"|action="https://neonail.vogt.de.com/nail-polishes/{{ $nailPolish->id }}"|' resources/views/nail-polishes/index.blade.php - echo " ✅ Admin Nail Polish Delete Formular behoben" -fi - -# Admin User Create Formular -if [ -f resources/views/admin/users/create.blade.php ]; then - sed -i 's|action="{{ route('\''admin.users.store'\'') }}"|action="https://neonail.vogt.de.com/admin/users"|' resources/views/admin/users/create.blade.php - echo " ✅ Admin User Create Formular behoben" -fi - -# Admin User Edit Formular -if [ -f resources/views/admin/users/edit.blade.php ]; then - sed -i 's|action="{{ route('\''admin.users.update'\'', $user) }}"|action="https://neonail.vogt.de.com/admin/users/{{ $user->id }}"|' resources/views/admin/users/edit.blade.php - echo " ✅ Admin User Edit Formular behoben" -fi - -# Admin User Delete Formular -if [ -f resources/views/admin/users/index.blade.php ]; then - sed -i 's|action="{{ route('\''admin.users.destroy'\'', $user) }}"|action="https://neonail.vogt.de.com/admin/users/{{ $user->id }}"|' resources/views/admin/users/index.blade.php - echo " ✅ Admin User Delete Formular behoben" -fi - -# 2. .env HTTPS-Einstellungen -echo "2. 🔒 .env HTTPS-Einstellungen..." -if [ -f .env ]; then - sed -i 's|APP_URL=.*|APP_URL=https://neonail.vogt.de.com|' .env - sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env - sed -i 's/APP_ENV=production/APP_ENV=local/' .env - - # HTTPS-spezifische Einstellungen - grep -q "FORCE_HTTPS=true" .env || echo "FORCE_HTTPS=true" >> .env - grep -q "SECURE_COOKIES=true" .env || echo "SECURE_COOKIES=true" >> .env - grep -q "SESSION_SECURE_COOKIE=true" .env || echo "SESSION_SECURE_COOKIE=true" >> .env - grep -q "SESSION_SAME_SITE=lax" .env || echo "SESSION_SAME_SITE=lax" >> .env - grep -q "SESSION_HTTP_ONLY=true" .env || echo "SESSION_HTTP_ONLY=true" >> .env - - echo " ✅ .env HTTPS-Einstellungen aktualisiert" -else - echo " ❌ .env Datei nicht gefunden" -fi - -# 3. Session-Konfiguration -echo "3. 🍪 Session-Konfiguration..." -if [ -f config/session.php ]; then - sed -i "s/'secure' => false/'secure' => true/" config/session.php - sed -i "s/'http_only' => false/'http_only' => true/" config/session.php - echo " ✅ Session-Konfiguration aktualisiert" -else - echo " ❌ config/session.php nicht gefunden" -fi - -# 4. CSRF-Konfiguration -echo "4. 🔐 CSRF-Konfiguration..." -if [ -f config/csrf.php ]; then - sed -i "s/'secure' => false/'secure' => true/" config/csrf.php - echo " ✅ CSRF-Konfiguration aktualisiert" -else - echo " ❌ config/csrf.php nicht gefunden" -fi - -# 5. Minimale .htaccess mit HTTPS-Force -echo "5. 🌐 .htaccess HTTPS-Force..." -cat > public/.htaccess << 'EOF' - - RewriteEngine On - - # Force HTTPS - RewriteCond %{HTTPS} off - RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - - -# Protect sensitive files - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - -EOF - -echo " ✅ .htaccess HTTPS-Force erstellt" - -# 6. Laravel Cache leeren -echo "6. 🧹 Laravel Cache leeren..." -php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen" -php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen" -php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen" - -# 7. Test-Script erstellen -echo "7. 🧪 Test-Script erstellen..." -cat > test-all-forms.php << 'EOF' - 'Login-Formular', - 'resources/views/user-nail-polishes/create.blade.php' => 'Create Nail Polish', - 'resources/views/user-nail-polishes/index.blade.php' => 'Remove Nail Polish', - 'resources/views/nail-polishes/index.blade.php' => 'Admin Delete Nail Polish', - 'resources/views/admin/users/create.blade.php' => 'Admin Create User', - 'resources/views/admin/users/edit.blade.php' => 'Admin Edit User', - 'resources/views/admin/users/index.blade.php' => 'Admin Delete User' -]; - -foreach ($forms as $file => $description) { - if (file_exists($file)) { - $content = file_get_contents($file); - if (strpos($content, 'action="https://neonail.vogt.de.com') !== false) { - echo " ✅ $description: HTTPS-URL gefunden\n"; - } else { - echo " ❌ $description: Keine HTTPS-URL gefunden\n"; - } - } else { - echo " ❌ $description: Datei nicht gefunden\n"; - } -} - -echo "\n✅ Alle Formulare getestet!\n"; -echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com\n"; -?> -EOF - -echo " ✅ Test-Script erstellt" - -echo "" -echo "✅ Alle Safari Sicherheitswarnungen behoben!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. Login: https://neonail.vogt.de.com/login" -echo "2. Admin-Panel: https://neonail.vogt.de.com/admin/users" -echo "3. Lack erstellen: https://neonail.vogt.de.com/create-nail-polish" -echo "" -echo "📝 Falls Warnungen bestehen:" -echo "- Führen Sie php test-all-forms.php aus" -echo "- Leeren Sie Browser-Cache" -echo "- Prüfen Sie Browser-Entwicklertools (F12)" diff --git a/fix-apache-documentroot.sh b/fix-apache-documentroot.sh deleted file mode 100755 index fe60c76..0000000 --- a/fix-apache-documentroot.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -echo "🌐 Apache DocumentRoot korrigieren" -echo "=================================" - -# 1. Standard-Site deaktivieren -echo "🔧 Deaktiviere Standard-Site..." -a2dissite 000-default.conf 2>/dev/null || echo "⚠️ Standard-Site bereits deaktiviert" - -# 2. NeoNail-Site neu erstellen -echo "📝 Erstelle NeoNail-Site neu..." -cat > /etc/apache2/sites-available/neonail.conf << 'EOF' - - ServerName 192.168.30.81 - DocumentRoot /var/www/html/public - - - AllowOverride All - Require all granted - Options Indexes FollowSymLinks - - - # Sicherheit für sensible Dateien - - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - - - ErrorLog ${APACHE_LOG_DIR}/neonail_error.log - CustomLog ${APACHE_LOG_DIR}/neonail_access.log combined - -EOF - -# 3. NeoNail-Site aktivieren -echo "✅ Aktiviere NeoNail-Site..." -a2ensite neonail.conf - -# 4. Apache-Konfiguration testen -echo "🔍 Teste Apache-Konfiguration..." -apache2ctl configtest - -# 5. Apache neu laden -echo "🔄 Lade Apache neu..." -systemctl reload apache2 - -# 6. Status prüfen -echo "📊 Apache-Status..." -systemctl status apache2 --no-pager -l - -# 7. Test -echo "🧪 Teste Anwendung..." -curl -I http://192.168.30.81 - -echo "" -echo "✅ Apache DocumentRoot korrigiert!" -echo "📋 Testen Sie: http://192.168.30.81" -echo "" -echo "📋 Falls es nicht funktioniert:" -echo "1. Apache-Logs: tail -f /var/log/apache2/neonail_error.log" -echo "2. DocumentRoot prüfen: apache2ctl -S" diff --git a/fix-apache-headers.sh b/fix-apache-headers.sh deleted file mode 100755 index d3c0aa7..0000000 --- a/fix-apache-headers.sh +++ /dev/null @@ -1,103 +0,0 @@ -#!/bin/bash - -echo "🔧 Fix: Apache mod_headers aktivieren" -echo "====================================" - -# 1. Prüfe verfügbare Apache-Module -echo "1. 🔍 Verfügbare Apache-Module prüfen..." -apache2ctl -M 2>/dev/null | grep -E "(headers|rewrite)" || echo " ⚠️ apache2ctl nicht verfügbar" - -# 2. Aktiviere mod_headers -echo "2. 🔧 mod_headers aktivieren..." -a2enmod headers 2>/dev/null || echo " ⚠️ a2enmod headers fehlgeschlagen" - -# 3. Aktiviere mod_rewrite (falls nicht aktiviert) -echo "3. 🔧 mod_rewrite aktivieren..." -a2enmod rewrite 2>/dev/null || echo " ⚠️ a2enmod rewrite fehlgeschlagen" - -# 4. Apache neu laden -echo "4. 🔄 Apache neu laden..." -systemctl reload apache2 2>/dev/null || service apache2 reload 2>/dev/null || echo " ⚠️ Apache reload fehlgeschlagen" - -# 5. Prüfe .htaccess Syntax -echo "5. 🔍 .htaccess Syntax prüfen..." -if [ -f public/.htaccess ]; then - echo " 📋 public/.htaccess gefunden" - echo " 📄 Header-Befehle in .htaccess:" - grep -n "Header" public/.htaccess || echo " ⚠️ Keine Header-Befehle gefunden" -else - echo " ❌ public/.htaccess nicht gefunden" -fi - -# 6. Alternative .htaccess ohne Header erstellen -echo "6. 🔧 Alternative .htaccess erstellen..." -cat > public/.htaccess.simple << 'EOF' - - - Options -MultiViews -Indexes - - - RewriteEngine On - - # Force HTTPS - RewriteCond %{HTTPS} off - RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - - -# Protect sensitive files - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - -EOF - -echo " ✅ Alternative .htaccess erstellt" - -# 7. Backup und ersetze .htaccess -echo "7. 🔄 .htaccess ersetzen..." -if [ -f public/.htaccess ]; then - cp public/.htaccess public/.htaccess.backup - echo " ✅ Backup erstellt: public/.htaccess.backup" -fi - -cp public/.htaccess.simple public/.htaccess -echo " ✅ .htaccess ersetzt" - -# 8. Test Apache-Konfiguration -echo "8. 🧪 Apache-Konfiguration testen..." -apache2ctl -t 2>/dev/null && echo " ✅ Apache-Konfiguration OK" || echo " ❌ Apache-Konfiguration fehlerhaft" - -echo "" -echo "✅ Apache mod_headers Fix abgeschlossen!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. https://neonail.vogt.de.com" -echo "2. Admin-Panel: https://neonail.vogt.de.com/admin/users" -echo "" -echo "📝 Falls Problem besteht:" -echo "- Prüfen Sie: apache2ctl -M | grep headers" -echo "- Schauen Sie in: /var/log/apache2/error.log" diff --git a/fix-appserviceprovider-syntax.sh b/fix-appserviceprovider-syntax.sh deleted file mode 100644 index 52f2a0b..0000000 --- a/fix-appserviceprovider-syntax.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -echo "🔧 Fix: AppServiceProvider Syntax-Fehler" -echo "=======================================" - -# 1. Syntax prüfen -echo "1. 🔍 PHP Syntax prüfen..." -php -l app/Providers/AppServiceProvider.php - -# 2. Laravel Cache leeren -echo "2. 🧹 Laravel Cache leeren..." -php artisan cache:clear -php artisan config:clear -php artisan route:clear -php artisan view:clear - -# 3. HTTPS-Sicherheit testen -echo "3. 🧪 HTTPS-Sicherheit testen..." -php test-https-security.php - -echo "" -echo "✅ AppServiceProvider Syntax-Fehler behoben!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. Admin-Panel: https://neonail.vogt.de.com/admin/users" -echo "2. Lack löschen im Admin-Panel" -echo "3. User bearbeiten/löschen" diff --git a/fix-black-screen.sh b/fix-black-screen.sh deleted file mode 100755 index 46e2475..0000000 --- a/fix-black-screen.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash - -# NeoNail DB - Black Screen Fix Script -# Behebt schwarzen Bildschirm in Production - -echo "🖥️ NeoNail DB - Black Screen Fix" -echo "=================================" - -# Prüfe, ob wir im richtigen Verzeichnis sind -if [ ! -f "artisan" ]; then - echo "❌ Fehler: artisan Datei nicht gefunden. Bitte führen Sie das Script im Laravel-Root-Verzeichnis aus." - exit 1 -fi - -echo "🔍 Schritt 1: Temporär Debug aktivieren..." -sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env -php artisan config:clear - -echo "🔍 Schritt 2: Logs leeren..." -> storage/logs/laravel.log - -echo "🔍 Schritt 3: Cache komplett leeren..." -php artisan config:clear -php artisan route:clear -php artisan view:clear -php artisan cache:clear -php artisan optimize:clear - -echo "🔍 Schritt 4: Composer Autoload neu generieren..." -composer dump-autoload --optimize - -echo "🔍 Schritt 5: Berechtigungen prüfen..." -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ -chmod 664 database.sqlite -chmod 644 .env - -echo "🔍 Schritt 6: Datenbank-Verbindung testen..." -php artisan tinker --execute="echo 'DB Test: '; try { DB::connection()->getPdo(); echo 'OK'; } catch(Exception \$e) { echo 'FEHLER: ' . \$e->getMessage(); }" - -echo "🔍 Schritt 7: Routen testen..." -php artisan route:list | head -10 - -echo "🔍 Schritt 8: Storage-Link prüfen..." -if [ ! -L "public/storage" ]; then - echo "📎 Storage-Link erstellen..." - php artisan storage:link -else - echo "✅ Storage-Link bereits vorhanden" -fi - -echo "✅ Black Screen Fix abgeschlossen!" -echo "" -echo "🎯 Nächste Schritte:" -echo "1. Seite aufrufen (sollte jetzt Fehlermeldung zeigen)" -echo "2. Fehlermeldung notieren" -echo "3. Fehler beheben" -echo "4. APP_DEBUG=false setzen" -echo "" -echo "📋 Logs prüfen mit: tail -f storage/logs/laravel.log" diff --git a/fix-https-config.sh b/fix-https-config.sh deleted file mode 100755 index 3074d27..0000000 --- a/fix-https-config.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -echo "🔒 HTTPS-Konfiguration für NeoNail DB" -echo "====================================" - -# 1. .env für HTTPS aktualisieren -echo "📝 Aktualisiere .env für HTTPS..." -sed -i 's|APP_URL=http://192.168.30.81|APP_URL=https://neonail.vogt.de.com|' .env -sed -i 's|APP_URL=http://neonail.vogt.de.com|APP_URL=https://neonail.vogt.de.com|' .env - -# 2. Laravel Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" - -# 3. Trusted Proxies konfigurieren (falls hinter Proxy) -echo "🔧 Konfiguriere Trusted Proxies..." -cat > config/trusted-proxies.php << 'EOF' - [ - '192.168.30.81', - 'neonail.vogt.de.com', - ], - 'headers' => [ - 'X-Forwarded-For' => 'X_FORWARDED_FOR', - 'X-Forwarded-Host' => 'X_FORWARDED_HOST', - 'X-Forwarded-Proto' => 'X_FORWARDED_PROTO', - ], -]; -EOF - -# 4. Session-Konfiguration für HTTPS -echo "🔐 Konfiguriere Sessions für HTTPS..." -sed -i 's|SESSION_SECURE_COOKIE=false|SESSION_SECURE_COOKIE=true|' .env 2>/dev/null || echo "⚠️ SESSION_SECURE_COOKIE nicht gefunden" - -# 5. Test -echo "🧪 Teste HTTPS-Konfiguration..." -curl -I https://neonail.vogt.de.com - -echo "" -echo "✅ HTTPS-Konfiguration abgeschlossen!" -echo "📋 Testen Sie: https://neonail.vogt.de.com" -echo "" -echo "📋 Falls Probleme auftreten:" -echo "1. Browser-Cache leeren" -echo "2. Laravel-Logs prüfen: tail -f storage/logs/laravel.log" diff --git a/fix-https-form-security.sh b/fix-https-form-security.sh deleted file mode 100755 index 915a652..0000000 --- a/fix-https-form-security.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -echo "🔒 HTTPS-Formular-Sicherheit beheben" -echo "===================================" - -# 1. .env für HTTPS konfigurieren -echo "📝 Konfiguriere .env für HTTPS..." -sed -i 's|APP_URL=http://|APP_URL=https://|' .env -sed -i 's|APP_URL=https://192.168.30.81|APP_URL=https://neonail.vogt.de.com|' .env - -# 2. Session-Konfiguration für HTTPS -echo "🔐 Konfiguriere Sessions für HTTPS..." -cat >> .env << 'EOF' - -# HTTPS-Konfiguration -SESSION_SECURE_COOKIE=true -SESSION_SAME_SITE=lax -EOF - -# 3. Laravel Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" - -# 4. CSRF-Token für HTTPS konfigurieren -echo "🛡️ Konfiguriere CSRF für HTTPS..." -cat > config/csrf.php << 'EOF' - [ - 'secure' => true, - 'same_site' => 'lax', - ], -]; -EOF - -# 5. Trusted Proxies konfigurieren -echo "🌐 Konfiguriere Trusted Proxies..." -cat > config/trusted-proxies.php << 'EOF' - [ - '192.168.30.81', - 'neonail.vogt.de.com', - '127.0.0.1', - '::1', - ], - 'headers' => [ - 'X-Forwarded-For' => 'X_FORWARDED_FOR', - 'X-Forwarded-Host' => 'X_FORWARDED_HOST', - 'X-Forwarded-Proto' => 'X_FORWARDED_PROTO', - ], -]; -EOF - -# 6. Test -echo "🧪 Teste HTTPS-Konfiguration..." -curl -I https://neonail.vogt.de.com - -echo "" -echo "✅ HTTPS-Formular-Sicherheit behoben!" -echo "📋 Testen Sie: https://neonail.vogt.de.com" -echo "" -echo "📋 Falls Warnungen bleiben:" -echo "1. Browser-Cache leeren (Strg+F5)" -echo "2. Private/Inkognito-Modus testen" -echo "3. HTTPS-Zertifikat prüfen" diff --git a/fix-image-display.sh b/fix-image-display.sh deleted file mode 100755 index a7d10bb..0000000 --- a/fix-image-display.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -echo "🖼️ Bild-Anzeige reparieren" -echo "=========================" - -# 1. Storage Link prüfen und neu erstellen -echo "🔗 Prüfe Storage Link..." -if [ -L "public/storage" ]; then - echo "✅ Storage Link existiert" - ls -la public/storage -else - echo "❌ Storage Link fehlt - erstelle neu..." - rm -f public/storage - php artisan storage:link -fi - -# 2. Storage-Verzeichnis-Berechtigungen -echo "🔐 Setze Storage-Berechtigungen..." -chmod -R 777 storage/ -chmod -R 755 public/storage/ - -# 3. Bilder-Verzeichnis erstellen -echo "📁 Erstelle Bilder-Verzeichnis..." -mkdir -p storage/app/public/nail_polishes -chmod -R 777 storage/app/public/nail_polishes - -# 4. Test-Bild erstellen (falls keine Bilder vorhanden) -echo "🧪 Erstelle Test-Bild..." -if [ ! -f "storage/app/public/nail_polishes/test.jpg" ]; then - # Einfaches Test-Bild erstellen - echo "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==" | base64 -d > storage/app/public/nail_polishes/test.jpg - echo "✅ Test-Bild erstellt" -fi - -# 5. Laravel Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" - -# 6. Test-URL prüfen -echo "🧪 Teste Bild-URL..." -curl -I https://neonail.vogt.de.com/storage/nail_polishes/test.jpg 2>/dev/null || echo "⚠️ Test-URL nicht erreichbar" - -# 7. Datenbank-Bilder prüfen -echo "🗄️ Prüfe Datenbank-Bilder..." -sqlite3 database.sqlite "SELECT id, name, image_path FROM nail_polishes WHERE image_path IS NOT NULL;" 2>/dev/null || echo "⚠️ Keine Bilder in Datenbank gefunden" - -echo "" -echo "✅ Bild-Anzeige repariert!" -echo "📋 Testen Sie: https://neonail.vogt.de.com/storage/nail_polishes/test.jpg" -echo "" -echo "📋 Falls Bilder immer noch nicht angezeigt werden:" -echo "1. Browser-Cache leeren (Strg+F5)" -echo "2. Private-Fenster testen" -echo "3. Bild-URL direkt aufrufen" diff --git a/fix-image-upload-fallback.php b/fix-image-upload-fallback.php deleted file mode 100644 index b0fa419..0000000 --- a/fix-image-upload-fallback.php +++ /dev/null @@ -1,49 +0,0 @@ -hasFile('image') && $request->file('image')->isValid()) { - $image = $request->file('image'); - $filename = 'nail_polish_' . time() . '_' . uniqid() . '.jpg'; - $path = 'nail_polishes/' . $filename; - - $manager = new ImageManager(new Driver()); - $img = $manager->read($image); - $img->resize(400, 400, function ($constraint) { - $constraint->aspectRatio(); - $constraint->upsize(); - }); - - $imageData = $img->toJpeg(80)->toString(); - Storage::disk('public')->put($path, $imageData); - $nailPolish->image_path = $path; -} -*/ - -// Fallback-Code (ohne GD): -if ($request->hasFile('image') && $request->file('image')->isValid()) { - $image = $request->file('image'); - - // Prüfe Dateigröße (max 2MB) - if ($image->getSize() > 2 * 1024 * 1024) { - return back()->with('error', 'Das Bild darf maximal 2MB groß sein.')->withInput(); - } - - // Prüfe Dateityp - $allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif']; - if (!in_array($image->getMimeType(), $allowedTypes)) { - return back()->with('error', 'Nur JPG, PNG und GIF Dateien sind erlaubt.')->withInput(); - } - - // Speichere Original-Bild ohne Verarbeitung - $filename = 'nail_polish_' . time() . '_' . uniqid() . '.' . $image->getClientOriginalExtension(); - $path = 'nail_polishes/' . $filename; - - Storage::disk('public')->put($path, file_get_contents($image)); - $nailPolish->image_path = $path; -} -?> diff --git a/fix-image-upload-final.php b/fix-image-upload-final.php deleted file mode 100644 index 00b52b4..0000000 --- a/fix-image-upload-final.php +++ /dev/null @@ -1,282 +0,0 @@ -get("search"); - - $query = $user->nailPolishes(); - - if ($search) { - $query->where(function($q) use ($search) { - $q->where("name", "like", "%{$search}%") - ->orWhere("number", "like", "%{$search}%"); - }); - } - - $nailPolishes = $query->orderBy("name")->paginate(12); - - return view("user-nail-polishes.index", compact("nailPolishes", "search")); - } - - /** - * Zeigt alle verfügbaren Lacke an, die der User noch nicht hat - */ - public function available(Request $request) - { - $user = Auth::user(); - $search = $request->get("search"); - - $query = NailPolish::whereNotIn("id", $user->nailPolishes()->pluck("nail_polishes.id")); - - if ($search) { - $query->search($search); - } - - $nailPolishes = $query->orderBy("name")->paginate(12); - - return view("user-nail-polishes.available", compact("nailPolishes", "search")); - } - - /** - * Fügt einen Lack zur Sammlung des Users hinzu - */ - public function add(NailPolish $nailPolish) - { - $user = Auth::user(); - - // Prüfe, ob der Lack bereits in der Sammlung ist - if ($user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) { - return back()->with("warning", "Dieser Lack ist bereits in Ihrer Sammlung!"); - } - - $user->nailPolishes()->attach($nailPolish->id); - - return back()->with("success", "Lack \"{$nailPolish->name}\" wurde zu Ihrer Sammlung hinzugefügt!"); - } - - /** - * Entfernt einen Lack aus der Sammlung des Users - */ - public function remove(NailPolish $nailPolish) - { - try { - $user = Auth::user(); - - // Prüfe, ob der Lack in der Sammlung ist - if (!$user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) { - return back()->with("warning", "Dieser Lack ist nicht in Ihrer Sammlung!"); - } - - $user->nailPolishes()->detach($nailPolish->id); - - return back()->with("success", "Lack \"{$nailPolish->name}\" wurde aus Ihrer Sammlung entfernt!"); - - } catch (\Exception $e) { - \Log::error("Fehler beim Entfernen des Lackes: " . $e->getMessage()); - return back()->with("error", "Fehler beim Entfernen des Lackes. Bitte versuchen Sie es erneut."); - } - } - - /** - * Zeigt das Formular zum Erstellen eines neuen Lackes - */ - public function create() - { - return view("user-nail-polishes.create"); - } - - /** - * Speichert einen neuen Lack (wird automatisch zum Hauptkatalog hinzugefügt) - */ - public function store(Request $request) - { - $request->validate([ - "name" => "required|string|max:255", - "number" => "required|string|max:50", - "image" => "nullable|image|max:10240", // Max 10MB - ], [ - "name.required" => "Der Name des Lackes ist erforderlich.", - "number.required" => "Die Nummer des Lackes ist erforderlich.", - "image.image" => "Die Datei muss ein Bild sein.", - "image.max" => "Das Bild darf maximal 10MB groß sein.", - ]); - - try { - $nailPolish = new NailPolish(); - $nailPolish->name = trim($request->name); - $nailPolish->number = trim($request->number); - - // Vereinfachte Bildverarbeitung ohne Intervention Image - if ($request->hasFile("image") && $request->file("image")->isValid()) { - $image = $request->file("image"); - - // Erstelle einen eindeutigen Dateinamen - $filename = "nail_polish_" . time() . "_" . uniqid() . "." . $image->getClientOriginalExtension(); - $path = "nail_polishes/" . $filename; - - // Speichere das Bild direkt ohne Verarbeitung - Storage::disk("public")->putFileAs("nail_polishes", $image, $filename); - $nailPolish->image_path = $path; - - \Log::info("Bild erfolgreich gespeichert: " . $path); - } - - $nailPolish->save(); - - // Füge den Lack automatisch zur Sammlung des Users hinzu - $user = Auth::user(); - $user->nailPolishes()->attach($nailPolish->id); - - return redirect()->route("user-nail-polishes.index") - ->with("success", "Lack \"{$nailPolish->name}\" wurde erfolgreich erstellt und zu Ihrer Sammlung hinzugefügt!"); - - } catch (\Exception $e) { - \Log::error("Fehler beim Erstellen des Lackes: " . $e->getMessage()); - return back()->with("error", "Fehler beim Erstellen des Lackes: " . $e->getMessage()) - ->withInput(); - } - } - - /** - * Zeigt die Sammlung eines bestimmten Users (für Admin) - */ - public function showUserCollection(User $user) - { - $nailPolishes = $user->nailPolishes()->orderBy("name")->paginate(12); - - return view("user-nail-polishes.show-user", compact("user", "nailPolishes")); - } -}'; - -file_put_contents('app/Http/Controllers/UserNailPolishController.php', $controllerContent); -echo " ✅ Controller mit vereinfachtem Upload erstellt\n"; - -// 2. Storage-Verzeichnisse erstellen -echo "2. 📁 Storage-Verzeichnisse erstellen...\n"; -$directories = [ - 'storage/app/public', - 'storage/app/public/nail_polishes' -]; - -foreach ($directories as $dir) { - if (!is_dir($dir)) { - mkdir($dir, 0755, true); - echo " ✅ Verzeichnis erstellt: $dir\n"; - } else { - echo " ℹ️ Verzeichnis existiert bereits: $dir\n"; - } -} - -// 3. Berechtigungen setzen -echo "3. 🔐 Berechtigungen setzen...\n"; -system('chmod -R 755 storage/'); -system('chown -R www-data:www-data storage/ 2>/dev/null || echo " ⚠️ chown fehlgeschlagen"'); -echo " ✅ Berechtigungen gesetzt\n"; - -// 4. Storage Link erstellen -echo "4. 🔗 Storage Link erstellen...\n"; -if (file_exists('public/storage')) { - if (is_dir('public/storage')) { - system('rm -rf public/storage'); - } -} -system('ln -sf ../storage/app/public public/storage'); -echo " ✅ Storage Link erstellt\n"; - -// 5. Laravel Cache leeren -echo "5. 🧹 Laravel Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 6. Test-Bild erstellen -echo "6. 🖼️ Test-Bild erstellen...\n"; -$testImagePath = 'storage/app/public/nail_polishes/test.jpg'; -if (extension_loaded('gd')) { - $image = imagecreate(100, 100); - $bgColor = imagecolorallocate($image, 255, 255, 255); - $textColor = imagecolorallocate($image, 0, 0, 0); - imagestring($image, 5, 10, 40, 'TEST', $textColor); - - if (imagejpeg($image, $testImagePath, 80)) { - echo " ✅ Test-Bild erstellt: $testImagePath\n"; - } else { - echo " ❌ Test-Bild erstellen fehlgeschlagen\n"; - } - - imagedestroy($image); -} else { - echo " ❌ GD Extension nicht verfügbar\n"; -} - -// 7. Upload-Limits in .htaccess prüfen -echo "7. 📏 Upload-Limits prüfen...\n"; -$htaccessPath = 'public/.htaccess'; -if (file_exists($htaccessPath)) { - $htaccessContent = file_get_contents($htaccessPath); - - $requiredSettings = [ - 'upload_max_filesize 10M', - 'post_max_size 10M', - 'max_file_uploads 20', - 'memory_limit 256M' - ]; - - $missingSettings = []; - foreach ($requiredSettings as $setting) { - if (strpos($htaccessContent, $setting) === false) { - $missingSettings[] = $setting; - } - } - - if (empty($missingSettings)) { - echo " ✅ Alle Upload-Limits in .htaccess vorhanden\n"; - } else { - echo " ⚠️ Fehlende Upload-Limits: " . implode(', ', $missingSettings) . "\n"; - - // Füge fehlende Settings hinzu - $uploadSettings = "\n# Upload-Limits für Bild-Upload\n"; - foreach ($missingSettings as $setting) { - $uploadSettings .= "php_value " . $setting . "\n"; - } - - $htaccessContent .= $uploadSettings; - file_put_contents($htaccessPath, $htaccessContent); - echo " ✅ Upload-Limits zu .htaccess hinzugefügt\n"; - } -} else { - echo " ❌ .htaccess nicht gefunden\n"; -} - -echo "\n✅ Finales Bild-Upload-System erstellt!\n"; -echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n"; -echo "📝 Das System speichert Bilder jetzt direkt ohne Verarbeitung\n"; -echo "📋 Falls Upload immer noch fehlschlägt:\n"; -echo "- Prüfen Sie die Laravel-Logs: tail -f storage/logs/laravel.log\n"; -echo "- Testen Sie mit einem kleinen Bild (< 1MB)\n"; -echo "- Prüfen Sie Browser-Entwicklertools (F12) für Netzwerk-Fehler\n"; -?> diff --git a/fix-image-upload-simple.php b/fix-image-upload-simple.php deleted file mode 100644 index dfc9f9b..0000000 --- a/fix-image-upload-simple.php +++ /dev/null @@ -1,222 +0,0 @@ -get("search"); - - $query = $user->nailPolishes(); - - if ($search) { - $query->where(function($q) use ($search) { - $q->where("name", "like", "%{$search}%") - ->orWhere("number", "like", "%{$search}%"); - }); - } - - $nailPolishes = $query->orderBy("name")->paginate(12); - - return view("user-nail-polishes.index", compact("nailPolishes", "search")); - } - - /** - * Zeigt alle verfügbaren Lacke an, die der User noch nicht hat - */ - public function available(Request $request) - { - $user = Auth::user(); - $search = $request->get("search"); - - $query = NailPolish::whereNotIn("id", $user->nailPolishes()->pluck("nail_polishes.id")); - - if ($search) { - $query->search($search); - } - - $nailPolishes = $query->orderBy("name")->paginate(12); - - return view("user-nail-polishes.available", compact("nailPolishes", "search")); - } - - /** - * Fügt einen Lack zur Sammlung des Users hinzu - */ - public function add(NailPolish $nailPolish) - { - $user = Auth::user(); - - // Prüfe, ob der Lack bereits in der Sammlung ist - if ($user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) { - return back()->with("warning", "Dieser Lack ist bereits in Ihrer Sammlung!"); - } - - $user->nailPolishes()->attach($nailPolish->id); - - return back()->with("success", "Lack \"{$nailPolish->name}\" wurde zu Ihrer Sammlung hinzugefügt!"); - } - - /** - * Entfernt einen Lack aus der Sammlung des Users - */ - public function remove(NailPolish $nailPolish) - { - try { - $user = Auth::user(); - - // Prüfe, ob der Lack in der Sammlung ist - if (!$user->nailPolishes()->where("nail_polish_id", $nailPolish->id)->exists()) { - return back()->with("warning", "Dieser Lack ist nicht in Ihrer Sammlung!"); - } - - $user->nailPolishes()->detach($nailPolish->id); - - return back()->with("success", "Lack \"{$nailPolish->name}\" wurde aus Ihrer Sammlung entfernt!"); - - } catch (\Exception $e) { - \Log::error("Fehler beim Entfernen des Lackes: " . $e->getMessage()); - return back()->with("error", "Fehler beim Entfernen des Lackes. Bitte versuchen Sie es erneut."); - } - } - - /** - * Zeigt das Formular zum Erstellen eines neuen Lackes - */ - public function create() - { - return view("user-nail-polishes.create"); - } - - /** - * Speichert einen neuen Lack (wird automatisch zum Hauptkatalog hinzugefügt) - */ - public function store(Request $request) - { - $request->validate([ - "name" => "required|string|max:255", - "number" => "required|string|max:50", - "image" => "nullable|image|max:10240", // Max 10MB - ], [ - "name.required" => "Der Name des Lackes ist erforderlich.", - "number.required" => "Die Nummer des Lackes ist erforderlich.", - "image.image" => "Die Datei muss ein Bild sein.", - "image.max" => "Das Bild darf maximal 10MB groß sein.", - ]); - - try { - $nailPolish = new NailPolish(); - $nailPolish->name = trim($request->name); - $nailPolish->number = trim($request->number); - - // Vereinfachte Bildverarbeitung ohne Intervention Image - if ($request->hasFile("image") && $request->file("image")->isValid()) { - $image = $request->file("image"); - - // Erstelle einen eindeutigen Dateinamen - $filename = "nail_polish_" . time() . "_" . uniqid() . "." . $image->getClientOriginalExtension(); - $path = "nail_polishes/" . $filename; - - // Speichere das Bild direkt ohne Verarbeitung - Storage::disk("public")->putFileAs("nail_polishes", $image, $filename); - $nailPolish->image_path = $path; - - \Log::info("Bild erfolgreich gespeichert: " . $path); - } - - $nailPolish->save(); - - // Füge den Lack automatisch zur Sammlung des Users hinzu - $user = Auth::user(); - $user->nailPolishes()->attach($nailPolish->id); - - return redirect()->route("user-nail-polishes.index") - ->with("success", "Lack \"{$nailPolish->name}\" wurde erfolgreich erstellt und zu Ihrer Sammlung hinzugefügt!"); - - } catch (\Exception $e) { - \Log::error("Fehler beim Erstellen des Lackes: " . $e->getMessage()); - return back()->with("error", "Fehler beim Erstellen des Lackes: " . $e->getMessage()) - ->withInput(); - } - } - - /** - * Zeigt die Sammlung eines bestimmten Users (für Admin) - */ - public function showUserCollection(User $user) - { - $nailPolishes = $user->nailPolishes()->orderBy("name")->paginate(12); - - return view("user-nail-polishes.show-user", compact("user", "nailPolishes")); - } -}'; - -file_put_contents('app/Http/Controllers/UserNailPolishController.php', $controllerContent); -echo " ✅ Controller mit vereinfachtem Upload erstellt\n"; - -// 2. Storage-Verzeichnisse erstellen -echo "2. 📁 Storage-Verzeichnisse erstellen...\n"; -$directories = [ - 'storage/app/public', - 'storage/app/public/nail_polishes' -]; - -foreach ($directories as $dir) { - if (!is_dir($dir)) { - mkdir($dir, 0755, true); - echo " ✅ Verzeichnis erstellt: $dir\n"; - } else { - echo " ℹ️ Verzeichnis existiert bereits: $dir\n"; - } -} - -// 3. Berechtigungen setzen -echo "3. 🔐 Berechtigungen setzen...\n"; -system('chmod -R 755 storage/'); -system('chown -R www-data:www-data storage/ 2>/dev/null || echo " ⚠️ chown fehlgeschlagen"'); -echo " ✅ Berechtigungen gesetzt\n"; - -// 4. Storage Link erstellen -echo "4. 🔗 Storage Link erstellen...\n"; -if (file_exists('public/storage')) { - if (is_dir('public/storage')) { - system('rm -rf public/storage'); - } -} -system('ln -sf ../storage/app/public public/storage'); -echo " ✅ Storage Link erstellt\n"; - -// 5. Laravel Cache leeren -echo "5. 🧹 Laravel Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -echo "\n✅ Vereinfachtes Bild-Upload-System erstellt!\n"; -echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n"; -echo "📝 Das System speichert Bilder jetzt direkt ohne Verarbeitung\n"; -echo "📋 Falls Upload immer noch fehlschlägt:\n"; -echo "- Führen Sie php debug-image-upload.php aus\n"; -echo "- Prüfen Sie die Laravel-Logs\n"; -echo "- Testen Sie mit einem kleinen Bild (< 1MB)\n"; -?> diff --git a/fix-image-urls.php b/fix-image-urls.php deleted file mode 100644 index b75346e..0000000 --- a/fix-image-urls.php +++ /dev/null @@ -1,60 +0,0 @@ -exists($imagePath)) { - return null; - } - - // Erstelle die URL - $url = \Storage::disk('public')->url($imagePath); - - // Stelle sicher, dass HTTPS verwendet wird - if (strpos($url, 'http://') === 0) { - $url = str_replace('http://', 'https://', $url); - } - - return $url; - } - - public static function getImageUrlOrPlaceholder($imagePath, $size = '400x400') - { - $url = self::getImageUrl($imagePath); - - if ($url) { - return $url; - } - - // Fallback zu einem Placeholder-Bild - return "https://via.placeholder.com/{$size}/cccccc/666666?text=Kein+Bild"; - } -} - -// In der View verwenden: -// {{ \App\Helpers\ImageHelper::getImageUrlOrPlaceholder($nailPolish->image_path) }} - -// Oder als Blade-Directive in AppServiceProvider.php registrieren: -/* -public function boot() -{ - Blade::directive('nailPolishImage', function ($expression) { - return ""; - }); -} -*/ - -// Dann in der View: -// @nailPolishImage($nailPolish->image_path) -?> diff --git a/fix-laravel-setup.sh b/fix-laravel-setup.sh deleted file mode 100755 index 5dc3db6..0000000 --- a/fix-laravel-setup.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -echo "🔧 Laravel Setup Reparieren" -echo "===========================" - -# 1. Vendor-Ordner prüfen -echo "📦 Prüfe vendor/ Ordner..." -if [ ! -d "vendor" ]; then - echo "❌ vendor/ Ordner nicht gefunden!" - echo "📋 Bitte laden Sie den vendor/ Ordner hoch oder führen Sie composer install aus" - exit 1 -fi - -# 2. Composer autoload neu generieren -echo "🔄 Generiere Composer autoload neu..." -if command -v composer &> /dev/null; then - composer dump-autoload --optimize -elif [ -f "composer.phar" ]; then - php composer.phar dump-autoload --optimize -else - echo "⚠️ Composer nicht verfügbar, überspringe autoload" -fi - -# 3. Laravel Cache leeren -echo "🗑️ Leere Laravel Cache..." -php artisan config:clear -php artisan route:clear -php artisan view:clear -php artisan cache:clear - -# 4. Laravel neu initialisieren -echo "⚙️ Initialisiere Laravel neu..." -php artisan config:cache -php artisan route:cache -php artisan view:cache - -# 5. Berechtigungen setzen -echo "🔐 Setze Berechtigungen..." -chmod -R 755 vendor/ -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ - -# 6. .env prüfen -echo "📝 Prüfe .env Datei..." -if [ ! -f ".env" ]; then - echo "❌ .env Datei nicht gefunden!" - echo "📋 Kopieren Sie env-production-example.txt zu .env" - exit 1 -fi - -echo "" -echo "✅ Laravel Setup repariert!" -echo "📋 Testen Sie jetzt: php artisan --version" diff --git a/fix-logout-final.php b/fix-logout-final.php deleted file mode 100644 index 80c7290..0000000 --- a/fix-logout-final.php +++ /dev/null @@ -1,110 +0,0 @@ -/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 3. Layout nochmal prüfen -echo "\n3. 🎨 Layout final prüfen...\n"; -if (file_exists($layoutPath)) { - $content = file_get_contents($layoutPath); - - // Suche nach Logout-Form - if (strpos($content, 'logout-form') !== false) { - echo " ✅ Logout-Form gefunden\n"; - - // Zeige Logout-Form Details - $lines = explode("\n", $content); - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'logout') !== false) { - echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n"; - } - } - } else { - echo " ❌ Logout-Form nicht gefunden\n"; - } - -} else { - echo " ❌ Layout-Datei nicht gefunden\n"; -} - -// 4. JavaScript prüfen -echo "\n4. 🔧 JavaScript prüfen...\n"; -if (file_exists($layoutPath)) { - $content = file_get_contents($layoutPath); - - // Suche nach onclick Event - if (strpos($content, 'onclick="event.preventDefault(); document.getElementById("logout-form").submit();"') !== false) { - echo " ✅ JavaScript Event Handler gefunden\n"; - } else { - echo " ❌ JavaScript Event Handler nicht gefunden\n"; - } - - // Suche nach Bootstrap JS - if (strpos($content, 'bootstrap.bundle.min.js') !== false) { - echo " ✅ Bootstrap JS geladen\n"; - } else { - echo " ❌ Bootstrap JS nicht geladen\n"; - } - -} else { - echo " ❌ Layout-Datei nicht gefunden\n"; -} - -// 5. Test-Anleitung -echo "\n5. 🧪 Test-Anleitung...\n"; -echo " 📋 1. Öffnen Sie: https://neonail.vogt.de.com\n"; -echo " 📋 2. Melden Sie sich an\n"; -echo " 📋 3. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n"; -echo " 📋 4. Wählen Sie 'Abmelden' aus dem Dropdown\n"; -echo " 📋 5. Sie sollten zur Login-Seite weitergeleitet werden\n"; -echo "\n 🔍 Falls Problem besteht:\n"; -echo " 📋 - Öffnen Sie Browser-Entwicklertools (F12)\n"; -echo " 📋 - Gehen Sie zu Console-Tab\n"; -echo " 📋 - Klicken Sie auf Abmelden\n"; -echo " 📋 - Schauen Sie nach JavaScript-Fehlern\n"; -echo " 📋 - Gehen Sie zu Network-Tab\n"; -echo " 📋 - Schauen Sie welche URL aufgerufen wird\n"; - -echo "\n✅ Logout-Problem final behoben!\n"; -echo "🔗 Testen Sie jetzt das Logout und teilen Sie mit:\n"; -echo "1. Funktioniert das Logout jetzt?\n"; -echo "2. Werden Sie zur Login-Seite weitergeleitet?\n"; -echo "3. Falls nicht: Welche Fehlermeldungen sehen Sie?\n"; -?> diff --git a/fix-logout-route.php b/fix-logout-route.php deleted file mode 100644 index 51d989b..0000000 --- a/fix-logout-route.php +++ /dev/null @@ -1,194 +0,0 @@ -/dev/null || echo " ⚠️ composer dump-autoload übersprungen"'); -echo " ✅ Autoload neu generiert\n"; - -// 3. Laravel Cache komplett leeren -echo "\n3. 🧹 Laravel Cache komplett leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -system('php artisan optimize:clear 2>/dev/null || echo " ⚠️ optimize:clear übersprungen"'); -echo " ✅ Laravel Cache geleert\n"; - -// 4. Routes-Datei prüfen und korrigieren -echo "\n4. 🛣️ Routes-Datei prüfen...\n"; -$routesPath = 'routes/web.php'; -if (file_exists($routesPath)) { - $content = file_get_contents($routesPath); - - // Zeige alle Logout-bezogenen Zeilen - $lines = explode("\n", $content); - $logoutLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'logout') !== false) { - $logoutLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - if (!empty($logoutLines)) { - echo " ✅ Logout-Routes gefunden:\n"; - foreach ($logoutLines as $line) { - echo " 📋 $line\n"; - } - } else { - echo " ❌ Keine Logout-Routes gefunden\n"; - } - - // Prüfe ob die Route korrekt ist - if (strpos($content, "Route::post('/logout', [LoginController::class, 'logout'])->name('logout')->middleware('auth');") !== false) { - echo " ✅ Logout-Route ist korrekt definiert\n"; - } else { - echo " ❌ Logout-Route ist nicht korrekt definiert\n"; - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 5. LoginController prüfen -echo "\n5. 🔐 LoginController prüfen...\n"; -$controllerPath = 'app/Http/Controllers/Auth/LoginController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - - if (strpos($content, 'public function logout') !== false) { - echo " ✅ Logout-Methode vorhanden\n"; - - // Zeige Logout-Methode - $lines = explode("\n", $content); - $inLogoutMethod = false; - $methodLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'public function logout') !== false) { - $inLogoutMethod = true; - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) { - $inLogoutMethod = false; - } elseif ($inLogoutMethod) { - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - echo " 📋 Logout-Methode:\n"; - foreach ($methodLines as $line) { - echo " $line\n"; - } - - } else { - echo " ❌ Logout-Methode nicht gefunden\n"; - } - -} else { - echo " ❌ LoginController nicht gefunden\n"; -} - -// 6. Route-Liste neu generieren -echo "\n6. 🛣️ Route-Liste neu generieren...\n"; -try { - require_once 'vendor/autoload.php'; - - // Laravel Bootstrap - $app = require_once 'bootstrap/app.php'; - $app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - // Route-Liste abrufen - $routes = \Illuminate\Support\Facades\Route::getRoutes(); - - $logoutRoutes = []; - foreach ($routes as $route) { - $uri = $route->uri(); - $methods = $route->methods(); - $name = $route->getName(); - - if (strpos($uri, 'logout') !== false || strpos($name, 'logout') !== false) { - $logoutRoutes[] = [ - 'uri' => $uri, - 'methods' => $methods, - 'name' => $name - ]; - } - } - - if (empty($logoutRoutes)) { - echo " ❌ Keine Logout-Routes in Laravel registriert\n"; - } else { - echo " ✅ Logout-Routes in Laravel gefunden:\n"; - foreach ($logoutRoutes as $route) { - $methods = implode('|', $route['methods']); - $name = $route['name'] ?: 'kein Name'; - echo " 📋 $methods $uri ($name)\n"; - } - } - -} catch (Exception $e) { - echo " ❌ Fehler beim Abrufen der Routes: " . $e->getMessage() . "\n"; -} - -// 7. Test-Logout-Form erstellen -echo "\n7. 🧪 Test-Logout-Form erstellen...\n"; -$testForm = ' - - - Logout Test - - - -

Logout Test

-
- @csrf - -
-

Route: {{ route("logout") }}

- -'; - -file_put_contents('public/logout-test.blade.php', $testForm); -echo " ✅ Test-Form erstellt: public/logout-test.blade.php\n"; - -// 8. Apache neu laden (falls möglich) -echo "\n8. 🔄 Apache neu laden...\n"; -system('systemctl reload apache2 2>/dev/null || echo " ⚠️ Apache reload übersprungen"'); -echo " ✅ Apache neu geladen\n"; - -echo "\n✅ Logout-Route Fix abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n"; -echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n"; -echo "3. Falls das nicht funktioniert:\n"; -echo " - Öffnen Sie Browser-Entwicklertools (F12)\n"; -echo " - Gehen Sie zu Network-Tab\n"; -echo " - Klicken Sie auf Abmelden\n"; -echo " - Schauen Sie welche URL aufgerufen wird\n"; -echo "\n📋 Falls Problem besteht:\n"; -echo "- Teilen Sie die Network-Tab Ausgabe mit\n"; -echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n"; -echo "- Testen Sie direkt: https://neonail.vogt.de.com/logout\n"; -?> diff --git a/fix-logout-simple-2.php b/fix-logout-simple-2.php deleted file mode 100644 index c0908db..0000000 --- a/fix-logout-simple-2.php +++ /dev/null @@ -1,147 +0,0 @@ -/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Laravel Cache geleert\n"; - -// 3. Routes-Datei prüfen -echo "\n3. 🛣️ Routes-Datei prüfen...\n"; -$routesPath = 'routes/web.php'; -if (file_exists($routesPath)) { - $content = file_get_contents($routesPath); - - // Zeige alle Logout-bezogenen Zeilen - $lines = explode("\n", $content); - $logoutLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'logout') !== false) { - $logoutLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - if (!empty($logoutLines)) { - echo " ✅ Logout-Routes gefunden:\n"; - foreach ($logoutLines as $line) { - echo " 📋 $line\n"; - } - } else { - echo " ❌ Keine Logout-Routes gefunden\n"; - } - -} else { - echo " ❌ Routes-Datei nicht gefunden\n"; -} - -// 4. LoginController prüfen -echo "\n4. 🔐 LoginController prüfen...\n"; -$controllerPath = 'app/Http/Controllers/Auth/LoginController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - - if (strpos($content, 'public function logout') !== false) { - echo " ✅ Logout-Methode vorhanden\n"; - - // Zeige Logout-Methode - $lines = explode("\n", $content); - $inLogoutMethod = false; - $methodLines = []; - - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'public function logout') !== false) { - $inLogoutMethod = true; - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } elseif ($inLogoutMethod && strpos($line, 'public function') !== false) { - $inLogoutMethod = false; - } elseif ($inLogoutMethod) { - $methodLines[] = ($lineNumber + 1) . ": " . trim($line); - } - } - - echo " 📋 Logout-Methode:\n"; - foreach ($methodLines as $line) { - echo " $line\n"; - } - - } else { - echo " ❌ Logout-Methode nicht gefunden\n"; - } - -} else { - echo " ❌ LoginController nicht gefunden\n"; -} - -// 5. Layout prüfen -echo "\n5. 🎨 Layout prüfen...\n"; -$layoutPath = 'resources/views/layouts/app.blade.php'; -if (file_exists($layoutPath)) { - $content = file_get_contents($layoutPath); - - // Suche nach Logout-Form - if (strpos($content, 'logout-form') !== false) { - echo " ✅ Logout-Form gefunden\n"; - - // Zeige Logout-Form Details - $lines = explode("\n", $content); - foreach ($lines as $lineNumber => $line) { - if (strpos($line, 'logout') !== false) { - echo " 📋 Zeile " . ($lineNumber + 1) . ": " . trim($line) . "\n"; - } - } - } else { - echo " ❌ Logout-Form nicht gefunden\n"; - } - -} else { - echo " ❌ Layout-Datei nicht gefunden\n"; -} - -// 6. Test-Logout-URL erstellen -echo "\n6. 🧪 Test-Logout-URL erstellen...\n"; -$testUrl = 'https://neonail.vogt.de.com/logout'; -echo " 🔗 Test-URL: $testUrl\n"; -echo " 📋 Methode: POST\n"; -echo " 📋 CSRF-Token erforderlich\n"; - -// 7. Einfacher Test -echo "\n7. 🧪 Einfacher Test...\n"; -echo " 📋 Öffnen Sie: https://neonail.vogt.de.com\n"; -echo " 📋 Melden Sie sich an\n"; -echo " 📋 Klicken Sie auf Ihren Benutzernamen\n"; -echo " 📋 Wählen Sie 'Abmelden'\n"; -echo " 📋 Falls Fehler: Öffnen Sie Browser-Entwicklertools (F12)\n"; -echo " 📋 Gehen Sie zu Network-Tab\n"; -echo " 📋 Schauen Sie welche URL aufgerufen wird\n"; - -echo "\n✅ Logout-Route Fix abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt das Logout und teilen Sie mit:\n"; -echo "1. Funktioniert das Logout?\n"; -echo "2. Falls nicht: Welche URL wird im Network-Tab angezeigt?\n"; -echo "3. Gibt es Fehlermeldungen in der Browser-Konsole?\n"; -?> diff --git a/fix-logout-simple.php b/fix-logout-simple.php deleted file mode 100644 index c39288c..0000000 --- a/fix-logout-simple.php +++ /dev/null @@ -1,81 +0,0 @@ -/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 4. Alternative Logout-URL testen -echo "\n4. 🔗 Alternative Logout-URLs:\n"; -echo " - https://neonail.vogt.de.com/logout\n"; -echo " - https://neonail.vogt.de.com/logout (POST)\n"; - -echo "\n✅ Logout-Problem behoben!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n"; -echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n"; -echo "3. Sie sollten zur Login-Seite weitergeleitet werden\n"; -echo "\n📋 Falls Problem besteht:\n"; -echo "- Versuchen Sie direkt: https://neonail.vogt.de.com/logout\n"; -echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n"; -echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n"; -?> diff --git a/fix-logout.php b/fix-logout.php deleted file mode 100644 index 9a30494..0000000 --- a/fix-logout.php +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - @yield("title", "NeoNail Datenbank") - - - - - - - - - @yield("styles") - - - - -
-
- @if(session("success")) - - @endif - - @if(session("error")) - - @endif - - @yield("content") -
-
- - - - - @yield("scripts") - -'; - -file_put_contents('resources/views/layouts/app.blade.php', $layoutContent); -echo " ✅ Layout korrigiert\n"; - -// 3. LoginController prüfen -echo "\n3. 🔐 LoginController prüfen...\n"; -$controllerPath = 'app/Http/Controllers/Auth/LoginController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - - if (strpos($content, 'logout') !== false) { - echo " ✅ Logout-Methode gefunden\n"; - } else { - echo " ❌ Logout-Methode fehlt\n"; - } -} else { - echo " ❌ LoginController nicht gefunden\n"; -} - -// 4. Cache leeren -echo "\n4. 🧹 Cache leeren...\n"; -system('php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen"'); -system('php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen"'); -system('php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen"'); -system('php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen"'); -echo " ✅ Cache geleert\n"; - -// 5. Test-Logout-URL generieren -echo "\n5. 🔗 Test-Logout-URL:\n"; -echo " https://neonail.vogt.de.com/logout\n"; - -echo "\n✅ Logout-Problem behoben!\n"; -echo "🔗 Testen Sie jetzt:\n"; -echo "1. Klicken Sie auf Ihren Benutzernamen (oben rechts)\n"; -echo "2. Wählen Sie 'Abmelden' aus dem Dropdown\n"; -echo "3. Sie sollten zur Login-Seite weitergeleitet werden\n"; -echo "\n📋 Falls Problem besteht:\n"; -echo "- Prüfen Sie Browser-Entwicklertools (F12) für Fehler\n"; -echo "- Schauen Sie in die Laravel-Logs: tail -f storage/logs/laravel.log\n"; -echo "- Versuchen Sie direkt: https://neonail.vogt.de.com/logout\n"; -?> diff --git a/fix-mail-config.sh b/fix-mail-config.sh deleted file mode 100755 index 0c2939b..0000000 --- a/fix-mail-config.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -# NeoNail DB - Mail Configuration Fix Script -# Behebt Mail-Probleme in Production - -echo "📧 NeoNail DB - Mail Configuration Fix" -echo "======================================" - -# Prüfe, ob wir im richtigen Verzeichnis sind -if [ ! -f "artisan" ]; then - echo "❌ Fehler: artisan Datei nicht gefunden. Bitte führen Sie das Script im Laravel-Root-Verzeichnis aus." - exit 1 -fi - -echo "🔍 Schritt 1: Aktuelle Mail-Konfiguration prüfen..." -php artisan tinker --execute="echo 'Mail-Konfiguration:'; echo 'MAIL_MAILER: ' . config('mail.default'); echo 'MAIL_HOST: ' . config('mail.mailers.smtp.host'); echo 'MAIL_PORT: ' . config('mail.mailers.smtp.port'); echo 'MAIL_FROM: ' . config('mail.from.address');" - -echo "🔍 Schritt 2: Mail-Logs prüfen..." -echo "Letzte Mail-Fehler:" -tail -n 10 storage/logs/laravel.log | grep -i mail - -echo "🔍 Schritt 3: Mail-Konfiguration für Production anpassen..." - -# Backup der .env erstellen -cp .env .env.backup.$(date +%Y%m%d_%H%M%S) - -# Mail-Konfiguration auf log setzen (für Production ohne SMTP) -sed -i 's/MAIL_MAILER=smtp/MAIL_MAILER=log/' .env -sed -i 's/MAIL_HOST=mail.selfhost.de/MAIL_HOST=127.0.0.1/' .env -sed -i 's/MAIL_PORT=465/MAIL_PORT=1025/' .env -sed -i 's/MAIL_USERNAME=.*/MAIL_USERNAME=null/' .env -sed -i 's/MAIL_PASSWORD=.*/MAIL_PASSWORD=null/' .env -sed -i 's/MAIL_ENCRYPTION=ssl/MAIL_ENCRYPTION=null/' .env -sed -i 's/MAIL_FROM_ADDRESS=.*/MAIL_FROM_ADDRESS="noreply@neonail.vogt.de.com"/' .env -sed -i 's/MAIL_FROM_NAME=.*/MAIL_FROM_NAME="NeoNail DB"/' .env - -echo "🔍 Schritt 4: Cache leeren..." -php artisan config:clear - -echo "🔍 Schritt 5: Neue Mail-Konfiguration prüfen..." -php artisan tinker --execute="echo 'Neue Mail-Konfiguration:'; echo 'MAIL_MAILER: ' . config('mail.default'); echo 'MAIL_HOST: ' . config('mail.mailers.smtp.host'); echo 'MAIL_PORT: ' . config('mail.mailers.smtp.port'); echo 'MAIL_FROM: ' . config('mail.from.address');" - -echo "🔍 Schritt 6: Test-Mail senden..." -php artisan tinker --execute="use Illuminate\Support\Facades\Mail; try { Mail::raw('Test-Mail von NeoNail DB - ' . now(), function(\$message) { \$message->to('test@example.com')->subject('Test-Mail'); }); echo 'Test-Mail erfolgreich gesendet (in Logs)'; } catch(Exception \$e) { echo 'Mail-Fehler: ' . \$e->getMessage(); }" - -echo "✅ Mail Configuration Fix abgeschlossen!" -echo "" -echo "🎯 Was wurde geändert:" -echo " - MAIL_MAILER auf 'log' gesetzt (E-Mails werden in Logs geschrieben)" -echo " - SMTP-Konfiguration für Production angepasst" -echo " - Backup der .env erstellt" -echo "" -echo "📋 E-Mails werden jetzt in storage/logs/laravel.log geschrieben" -echo "📋 Für echte E-Mail-Versendung SMTP-Server konfigurieren" -echo "" -echo "🚀 Mail-System ist jetzt funktionsfähig!" diff --git a/fix-pail-cache.sh b/fix-pail-cache.sh deleted file mode 100755 index c05ceac..0000000 --- a/fix-pail-cache.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -echo "🧹 Pail Cache Problem lösen" -echo "==========================" - -# 1. Cache-Dateien löschen -echo "🗑️ Lösche Cache-Dateien..." -rm -f bootstrap/cache/packages.php -rm -f bootstrap/cache/services.php -rm -f bootstrap/cache/config.php - -# 2. Composer autoload neu generieren -echo "🔄 Generiere autoload neu..." -if command -v composer &> /dev/null; then - composer dump-autoload --optimize -elif [ -f "composer.phar" ]; then - php composer.phar dump-autoload --optimize -else - echo "⚠️ Composer nicht verfügbar" -fi - -# 3. Laravel Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen" - -# 4. Berechtigungen setzen -echo "🔐 Setze Berechtigungen..." -chmod -R 777 bootstrap/cache/ - -echo "" -echo "✅ Pail Cache Problem behoben!" -echo "📋 Testen Sie: php artisan --version" diff --git a/fix-pail-final.sh b/fix-pail-final.sh deleted file mode 100755 index c7048a5..0000000 --- a/fix-pail-final.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -echo "🧹 Finale Pail-Problem Lösung" -echo "=============================" - -# 1. Alle Cache-Dateien löschen -echo "🗑️ Lösche alle Cache-Dateien..." -rm -f bootstrap/cache/packages.php -rm -f bootstrap/cache/services.php -rm -f bootstrap/cache/config.php -rm -f bootstrap/cache/routes.php -rm -f bootstrap/cache/views.php - -# 2. Composer autoload neu generieren -echo "🔄 Generiere Composer autoload neu..." -if command -v composer &> /dev/null; then - composer dump-autoload --optimize -elif [ -f "composer.phar" ]; then - php composer.phar dump-autoload --optimize -else - echo "⚠️ Composer nicht verfügbar, überspringe autoload" -fi - -# 3. Laravel Cache komplett leeren -echo "🧹 Leere Laravel Cache komplett..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen" - -# 4. Berechtigungen setzen -echo "🔐 Setze Berechtigungen..." -chmod -R 777 bootstrap/cache/ -chmod -R 777 storage/ - -# 5. Debug deaktivieren (für Produktion) -echo "🔧 Setze Debug-Modus zurück..." -sed -i 's/APP_DEBUG=true/APP_DEBUG=false/' .env - -# 6. Test -echo "🧪 Teste Anwendung..." -curl -I http://192.168.30.81 - -echo "" -echo "✅ Pail-Problem behoben!" -echo "📋 Testen Sie: http://192.168.30.81" diff --git a/fix-permissions.sh b/fix-permissions.sh deleted file mode 100755 index cd9b5f8..0000000 --- a/fix-permissions.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/bash - -# NeoNail DB - Berechtigungen korrigieren -echo "🔧 NeoNail DB - Berechtigungen korrigieren..." - -# 1. Storage-Verzeichnisse erstellen (falls nicht vorhanden) -echo "📁 Storage-Verzeichnisse erstellen..." -mkdir -p storage/framework/views -mkdir -p storage/framework/cache -mkdir -p storage/framework/sessions -mkdir -p storage/logs -mkdir -p bootstrap/cache - -# 2. Berechtigungen für Storage setzen -echo "🔐 Storage-Berechtigungen setzen..." -chmod -R 777 storage/ -chmod -R 777 storage/framework/ -chmod -R 777 storage/framework/views/ -chmod -R 777 storage/framework/cache/ -chmod -R 777 storage/framework/sessions/ -chmod -R 777 storage/logs/ - -# 3. Bootstrap/Cache-Berechtigungen -echo "🔐 Bootstrap/Cache-Berechtigungen setzen..." -chmod -R 777 bootstrap/cache/ - -# 4. SQLite-Datenbank erstellen und Berechtigungen setzen -echo "🗄️ SQLite-Datenbank erstellen..." -if [ ! -f database.sqlite ]; then - touch database.sqlite - echo "✅ SQLite-Datenbank erstellt" -else - echo "✅ SQLite-Datenbank bereits vorhanden" -fi -chmod 664 database.sqlite - -# 5. .env Berechtigungen -echo "🔐 .env Berechtigungen setzen..." -if [ -f .env ]; then - chmod 644 .env - echo "✅ .env Berechtigungen gesetzt" -else - echo "⚠️ .env Datei nicht gefunden" -fi - -# 6. Cache leeren -echo "🧹 Cache leeren..." -php artisan config:clear 2>/dev/null || echo "⚠️ php artisan nicht verfügbar" -php artisan cache:clear 2>/dev/null || echo "⚠️ php artisan nicht verfügbar" -php artisan view:clear 2>/dev/null || echo "⚠️ php artisan nicht verfügbar" - -# 7. Storage-Link erstellen -echo "🔗 Storage-Link erstellen..." -php artisan storage:link 2>/dev/null || echo "⚠️ php artisan nicht verfügbar" - -echo "✅ Berechtigungen korrigiert!" -echo "" -echo "📋 Nächste Schritte:" -echo "1. Seite neu laden: http://192.168.30.81/neonail/" -echo "2. Falls immer noch Fehler: Composer install ausführen" -echo "3. Migrationen ausführen: php artisan migrate --force" -echo "4. Admin-User erstellen: php artisan tinker" -echo "" -echo "💡 Falls Probleme bestehen:" -echo "- Hosting-Provider kontaktieren" -echo "- SSH-Zugang anfordern" -echo "- Berechtigungen über Hosting-Panel prüfen" diff --git a/fix-production-issues.sh b/fix-production-issues.sh deleted file mode 100755 index e69de29..0000000 diff --git a/fix-remaining-safari-warnings.sh b/fix-remaining-safari-warnings.sh deleted file mode 100755 index 8d1550a..0000000 --- a/fix-remaining-safari-warnings.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash - -echo "🛡️ Fix: Verbleibende Safari Sicherheitswarnungen" -echo "===============================================" - -# 1. Logout-Formular beheben -echo "1. 🔒 Logout-Formular beheben..." -if [ -f resources/views/layouts/app.blade.php ]; then - sed -i 's|action="{{ route('\''logout'\'') }}"|action="https://neonail.vogt.de.com/logout"|' resources/views/layouts/app.blade.php - echo " ✅ Logout-Formular behoben" -else - echo " ❌ layouts/app.blade.php nicht gefunden" -fi - -# 2. Alle verbleibenden route() Aufrufe finden -echo "2. 🔍 Alle verbleibenden route() Aufrufe finden..." -grep -r "route(" resources/views/ --include="*.blade.php" | grep -E "(action|href)" || echo " ℹ️ Keine verbleibenden route() Aufrufe in action/href gefunden" - -# 3. Alle Formulare mit HTTPS-URLs prüfen -echo "3. 🔒 Alle Formulare mit HTTPS prüfen..." -php test-forms-fixed.php - -# 4. Laravel Cache leeren -echo "4. 🧹 Laravel Cache leeren..." -php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen" -php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen" -php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen" - -# 5. Test-Script erstellen -echo "5. 🧪 Test-Script erstellen..." -cat > test-all-forms-final.php << 'EOF' - 'Login-Formular', - 'resources/views/user-nail-polishes/create.blade.php' => 'Create Nail Polish', - 'resources/views/user-nail-polishes/index.blade.php' => 'Remove Nail Polish', - 'resources/views/nail-polishes/index.blade.php' => 'Admin Delete Nail Polish', - 'resources/views/admin/users/create.blade.php' => 'Admin Create User', - 'resources/views/admin/users/edit.blade.php' => 'Admin Edit User', - 'resources/views/admin/users/index.blade.php' => 'Admin Delete User', - 'resources/views/layouts/app.blade.php' => 'Logout-Formular' -]; - -$allFixed = true; - -foreach ($forms as $file => $description) { - if (file_exists($file)) { - $content = file_get_contents($file); - if (strpos($content, 'action="https://neonail.vogt.de.com') !== false) { - echo " ✅ $description: HTTPS-URL gefunden\n"; - } else { - echo " ❌ $description: Keine HTTPS-URL gefunden\n"; - $allFixed = false; - - // Zeige die aktuelle action - if (preg_match('/action="([^"]+)"/', $content, $matches)) { - echo " Aktuelle action: " . $matches[1] . "\n"; - } - } - } else { - echo " ❌ $description: Datei nicht gefunden\n"; - $allFixed = false; - } -} - -echo "\n"; -if ($allFixed) { - echo "🎉 ALLE Formulare sind jetzt mit HTTPS-URLs konfiguriert!\n"; - echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com\n"; - echo "📝 Safari-Sicherheitswarnungen sollten komplett verschwunden sein.\n"; -} else { - echo "⚠️ Einige Formulare müssen noch korrigiert werden.\n"; - echo "🔧 Führen Sie das Fix-Script erneut aus.\n"; -} - -echo "\n✅ Finaler Formular-Test abgeschlossen!\n"; -?> -EOF - -echo " ✅ Test-Script erstellt" - -# 6. Finalen Test ausführen -echo "6. 🧪 Finalen Test ausführen..." -php test-all-forms-final.php - -echo "" -echo "✅ Verbleibende Safari Sicherheitswarnungen behoben!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. Login: https://neonail.vogt.de.com/login" -echo "2. Logout: Klicken Sie auf Ihren Namen → Abmelden" -echo "3. Admin-Panel: https://neonail.vogt.de.com/admin/users" -echo "4. Lack erstellen: https://neonail.vogt.de.com/create-nail-polish" -echo "" -echo "📝 Falls Warnungen bestehen:" -echo "- Führen Sie php test-all-forms-final.php aus" -echo "- Leeren Sie Browser-Cache komplett" -echo "- Prüfen Sie Browser-Entwicklertools (F12)" -echo "- Testen Sie in einem Inkognito-Fenster" diff --git a/fix-safari-form-security.sh b/fix-safari-form-security.sh deleted file mode 100644 index 8a7777f..0000000 --- a/fix-safari-form-security.sh +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/bash - -echo "🍎 Safari Formular-Sicherheit beheben" -echo "====================================" - -# 1. .env komplett für HTTPS konfigurieren -echo "📝 Konfiguriere .env für HTTPS..." -cat > .env << 'EOF' -APP_NAME="NeoNail DB" -APP_ENV=production -APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs= -APP_DEBUG=false -APP_URL=https://neonail.vogt.de.com - -LOG_CHANNEL=stack -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=sqlite -DB_DATABASE=database.sqlite - -BROADCAST_DRIVER=log -CACHE_DRIVER=file -FILESYSTEM_DISK=local -QUEUE_CONNECTION=sync -SESSION_DRIVER=file -SESSION_LIFETIME=120 -SESSION_SECURE_COOKIE=true -SESSION_SAME_SITE=lax -SESSION_HTTP_ONLY=true - -MEMCACHED_HOST=127.0.0.1 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=smtp -MAIL_HOST=mailpit -MAIL_PORT=1025 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS="hello@example.com" -MAIL_FROM_NAME="${APP_NAME}" - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_DEFAULT_REGION=us-east-1 -AWS_BUCKET= -AWS_USE_PATH_STYLE_ENDPOINT=false - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= -PUSHER_HOST= -PUSHER_PORT=443 -PUSHER_SCHEME=https -PUSHER_APP_CLUSTER=mt1 - -VITE_APP_NAME="${APP_NAME}" -VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -VITE_PUSHER_HOST="${PUSHER_HOST}" -VITE_PUSHER_PORT="${PUSHER_PORT}" -VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" -VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" - -# HTTPS-Konfiguration -FORCE_HTTPS=true -SECURE_COOKIES=true -EOF - -# 2. Session-Konfiguration für HTTPS -echo "🔐 Konfiguriere Session für HTTPS..." -cat > config/session.php << 'EOF' - env('SESSION_DRIVER', 'file'), - 'lifetime' => env('SESSION_LIFETIME', 120), - 'expire_on_close' => false, - 'encrypt' => false, - 'files' => storage_path('framework/sessions'), - 'connection' => env('SESSION_CONNECTION'), - 'table' => 'sessions', - 'store' => env('SESSION_STORE'), - 'lottery' => [2, 100], - 'cookie' => env( - 'SESSION_COOKIE', - Str::slug(env('APP_NAME', 'laravel'), '_').'_session' - ), - 'path' => '/', - 'domain' => env('SESSION_DOMAIN'), - 'secure' => true, - 'http_only' => true, - 'same_site' => 'lax', -]; -EOF - -# 3. Laravel Cache komplett leeren -echo "🧹 Leere Laravel Cache komplett..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen" - -# 4. HTTPS-Force in .htaccess -echo "🔒 Füge HTTPS-Force hinzu..." -cat > public/.htaccess << 'EOF' - - - Options -MultiViews -Indexes - - - RewriteEngine On - - # Force HTTPS - RewriteCond %{HTTPS} off - RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - - -# Security Headers - - Header always set X-Content-Type-Options nosniff - Header always set X-Frame-Options DENY - Header always set X-XSS-Protection "1; mode=block" - Header always set Referrer-Policy "strict-origin-when-cross-origin" - Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" - Header always set Content-Security-Policy "upgrade-insecure-requests" - Header always set X-Forwarded-Proto https - - -# Protect sensitive files - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - -# Compression - - AddOutputFilterByType DEFLATE text/plain - AddOutputFilterByType DEFLATE text/html - AddOutputFilterByType DEFLATE text/xml - AddOutputFilterByType DEFLATE text/css - AddOutputFilterByType DEFLATE application/xml - AddOutputFilterByType DEFLATE application/xhtml+xml - AddOutputFilterByType DEFLATE application/rss+xml - AddOutputFilterByType DEFLATE application/javascript - AddOutputFilterByType DEFLATE application/x-javascript - - -# Cache Control - - ExpiresActive on - ExpiresByType text/css "access plus 1 year" - ExpiresByType application/javascript "access plus 1 year" - ExpiresByType image/png "access plus 1 year" - ExpiresByType image/jpg "access plus 1 year" - ExpiresByType image/jpeg "access plus 1 year" - ExpiresByType image/gif "access plus 1 year" - ExpiresByType image/svg+xml "access plus 1 year" - -EOF - -# 5. Apache neu laden -echo "🔄 Lade Apache neu..." -systemctl reload apache2 - -# 6. Test -echo "🧪 Teste HTTPS-Konfiguration..." -curl -I https://neonail.vogt.de.com - -echo "" -echo "✅ Safari Formular-Sicherheit behoben!" -echo "📋 Testen Sie: https://neonail.vogt.de.com" -echo "" -echo "📋 Falls Warnung bleibt:" -echo "1. Safari-Cache leeren (Cmd+Shift+R)" -echo "2. Private-Fenster testen" -echo "3. Safari-Einstellungen: Entwickler > Leere Caches" -echo "4. Safari-Einstellungen: Datenschutz > Website-Daten verwalten" diff --git a/fix-safari-https.sh b/fix-safari-https.sh deleted file mode 100644 index a963c34..0000000 --- a/fix-safari-https.sh +++ /dev/null @@ -1,171 +0,0 @@ -#!/bin/bash - -echo "🍎 Safari HTTPS-Warnung beheben" -echo "==============================" - -# 1. .env komplett für HTTPS konfigurieren -echo "📝 Konfiguriere .env komplett für HTTPS..." -cat > .env << 'EOF' -APP_NAME="NeoNail DB" -APP_ENV=production -APP_KEY=base64:+LTZYPKjkZ+O3iFTgU2sS+9bNvxxvG8Kw8JSEPiG7Rs= -APP_DEBUG=false -APP_URL=https://neonail.vogt.de.com - -LOG_CHANNEL=stack -LOG_DEPRECATIONS_CHANNEL=null -LOG_LEVEL=debug - -DB_CONNECTION=sqlite -DB_DATABASE=database.sqlite - -BROADCAST_DRIVER=log -CACHE_DRIVER=file -FILESYSTEM_DISK=local -QUEUE_CONNECTION=sync -SESSION_DRIVER=file -SESSION_LIFETIME=120 -SESSION_SECURE_COOKIE=true -SESSION_SAME_SITE=lax - -MEMCACHED_HOST=127.0.0.1 - -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - -MAIL_MAILER=smtp -MAIL_HOST=mailpit -MAIL_PORT=1025 -MAIL_USERNAME=null -MAIL_PASSWORD=null -MAIL_ENCRYPTION=null -MAIL_FROM_ADDRESS="hello@example.com" -MAIL_FROM_NAME="${APP_NAME}" - -AWS_ACCESS_KEY_ID= -AWS_SECRET_ACCESS_KEY= -AWS_DEFAULT_REGION=us-east-1 -AWS_BUCKET= -AWS_USE_PATH_STYLE_ENDPOINT=false - -PUSHER_APP_ID= -PUSHER_APP_KEY= -PUSHER_APP_SECRET= -PUSHER_HOST= -PUSHER_PORT=443 -PUSHER_SCHEME=https -PUSHER_APP_CLUSTER=mt1 - -VITE_APP_NAME="${APP_NAME}" -VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" -VITE_PUSHER_HOST="${PUSHER_HOST}" -VITE_PUSHER_PORT="${PUSHER_PORT}" -VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" -VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" -EOF - -# 2. Laravel Cache komplett leeren -echo "🧹 Leere Laravel Cache komplett..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" -php artisan route:clear 2>/dev/null || echo "⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo "⚠️ view:clear übersprungen" - -# 3. HTTPS-Header in .htaccess hinzufügen -echo "🔒 Füge HTTPS-Header hinzu..." -cat > public/.htaccess << 'EOF' - - - Options -MultiViews -Indexes - - - RewriteEngine On - - # Force HTTPS - RewriteCond %{HTTPS} off - RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - - -# Security Headers - - Header always set X-Content-Type-Options nosniff - Header always set X-Frame-Options DENY - Header always set X-XSS-Protection "1; mode=block" - Header always set Referrer-Policy "strict-origin-when-cross-origin" - Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" - Header always set Content-Security-Policy "upgrade-insecure-requests" - - -# Protect sensitive files - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - -# Compression - - AddOutputFilterByType DEFLATE text/plain - AddOutputFilterByType DEFLATE text/html - AddOutputFilterByType DEFLATE text/xml - AddOutputFilterByType DEFLATE text/css - AddOutputFilterByType DEFLATE application/xml - AddOutputFilterByType DEFLATE application/xhtml+xml - AddOutputFilterByType DEFLATE application/rss+xml - AddOutputFilterByType DEFLATE application/javascript - AddOutputFilterByType DEFLATE application/x-javascript - - -# Cache Control - - ExpiresActive on - ExpiresByType text/css "access plus 1 year" - ExpiresByType application/javascript "access plus 1 year" - ExpiresByType image/png "access plus 1 year" - ExpiresByType image/jpg "access plus 1 year" - ExpiresByType image/jpeg "access plus 1 year" - ExpiresByType image/gif "access plus 1 year" - ExpiresByType image/svg+xml "access plus 1 year" - -EOF - -# 4. Apache neu laden -echo "🔄 Lade Apache neu..." -systemctl reload apache2 - -# 5. Test -echo "🧪 Teste HTTPS-Konfiguration..." -curl -I https://neonail.vogt.de.com - -echo "" -echo "✅ Safari HTTPS-Warnung behoben!" -echo "📋 Testen Sie: https://neonail.vogt.de.com" -echo "" -echo "📋 Falls Warnung bleibt:" -echo "1. Safari-Cache leeren (Cmd+Shift+R)" -echo "2. Private-Fenster testen" -echo "3. Safari-Einstellungen: Entwickler > Leere Caches" diff --git a/fix-safari-security-warnings.sh b/fix-safari-security-warnings.sh deleted file mode 100755 index 8b86c27..0000000 --- a/fix-safari-security-warnings.sh +++ /dev/null @@ -1,166 +0,0 @@ -#!/bin/bash - -echo "🛡️ Fix: Safari Sicherheitswarnungen" -echo "==================================" - -# 1. .env HTTPS-Einstellungen -echo "1. 🔒 HTTPS-Einstellungen in .env..." -if [ -f .env ]; then - # Setze alle HTTPS-Einstellungen - sed -i 's|APP_URL=.*|APP_URL=https://neonail.vogt.de.com|' .env - sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env - sed -i 's/APP_ENV=production/APP_ENV=local/' .env - - # HTTPS-spezifische Einstellungen - echo "FORCE_HTTPS=true" >> .env - echo "SECURE_COOKIES=true" >> .env - echo "SESSION_SECURE_COOKIE=true" >> .env - echo "SESSION_SAME_SITE=lax" >> .env - echo "SESSION_HTTP_ONLY=true" >> .env - - echo " ✅ .env HTTPS-Einstellungen aktualisiert" -else - echo " ❌ .env Datei nicht gefunden" -fi - -# 2. Session-Konfiguration -echo "2. 🍪 Session-Konfiguration..." -if [ -f config/session.php ]; then - sed -i "s/'secure' => false/'secure' => true/" config/session.php - sed -i "s/'http_only' => false/'http_only' => true/" config/session.php - echo " ✅ Session-Konfiguration aktualisiert" -else - echo " ❌ config/session.php nicht gefunden" -fi - -# 3. CSRF-Konfiguration -echo "3. 🔐 CSRF-Konfiguration..." -if [ -f config/csrf.php ]; then - sed -i "s/'secure' => false/'secure' => true/" config/csrf.php - sed -i "s/'same_site' => 'lax'/'same_site' => 'lax'/" config/csrf.php - echo " ✅ CSRF-Konfiguration aktualisiert" -else - echo " ❌ config/csrf.php nicht gefunden" -fi - -# 4. .htaccess HTTPS-Headers -echo "4. 🌐 .htaccess HTTPS-Headers..." -if [ -f public/.htaccess ]; then - # Füge HTTPS-Headers hinzu - if ! grep -q "Strict-Transport-Security" public/.htaccess; then - sed -i '/# Security Headers/a\ -Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"\ -Header always set Content-Security-Policy "upgrade-insecure-requests"' public/.htaccess - fi - - # Force HTTPS - if ! grep -q "RewriteCond %{HTTPS} off" public/.htaccess; then - sed -i '/RewriteEngine On/a\ -RewriteCond %{HTTPS} off\ -RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]' public/.htaccess - fi - - echo " ✅ .htaccess HTTPS-Headers aktualisiert" -else - echo " ❌ public/.htaccess nicht gefunden" -fi - -# 5. AppServiceProvider HTTPS-Force -echo "5. 🔧 AppServiceProvider HTTPS-Force..." -if [ -f app/Providers/AppServiceProvider.php ]; then - if ! grep -q "URL::forceScheme('https')" app/Providers/AppServiceProvider.php; then - sed -i "/public function boot(): void/a\\ - if (config('app.env') === 'production') {\\ - URL::forceScheme('https');\\ - }" app/Providers/AppServiceProvider.php - fi - echo " ✅ AppServiceProvider HTTPS-Force aktualisiert" -else - echo " ❌ AppServiceProvider nicht gefunden" -fi - -# 6. Laravel Cache leeren -echo "6. 🧹 Laravel Cache leeren..." -php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen" -php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen" -php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen" - -# 7. Test-Script erstellen -echo "7. 🧪 Test-Script erstellen..." -cat > test-https-security.php << 'EOF' - true") !== false) { - echo " ✅ Session secure: true\n"; - } else { - echo " ❌ Session secure: false\n"; - } - if (strpos($content, "'http_only' => true") !== false) { - echo " ✅ Session http_only: true\n"; - } else { - echo " ❌ Session http_only: false\n"; - } -} - -// 3. Prüfe CSRF-Konfiguration -echo "\n3. CSRF-Konfiguration:\n"; -if (file_exists('config/csrf.php')) { - $content = file_get_contents('config/csrf.php'); - if (strpos($content, "'secure' => true") !== false) { - echo " ✅ CSRF secure: true\n"; - } else { - echo " ❌ CSRF secure: false\n"; - } -} - -// 4. Prüfe .htaccess -echo "\n4. .htaccess HTTPS-Headers:\n"; -if (file_exists('public/.htaccess')) { - $content = file_get_contents('public/.htaccess'); - if (strpos($content, 'Strict-Transport-Security') !== false) { - echo " ✅ HSTS Header vorhanden\n"; - } else { - echo " ❌ HSTS Header fehlt\n"; - } - if (strpos($content, 'upgrade-insecure-requests') !== false) { - echo " ✅ CSP upgrade-insecure-requests vorhanden\n"; - } else { - echo " ❌ CSP upgrade-insecure-requests fehlt\n"; - } -} - -echo "\n✅ HTTPS-Sicherheit Test abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/admin/users\n"; -?> -EOF - -echo " ✅ Test-Script erstellt" - -echo "" -echo "✅ Safari Sicherheitswarnungen behoben!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. Admin-Panel: https://neonail.vogt.de.com/admin/users" -echo "2. Lack löschen im Admin-Panel" -echo "3. User bearbeiten/löschen" -echo "" -echo "📝 Falls Warnungen bestehen:" -echo "- Führen Sie php test-https-security.php aus" -echo "- Prüfen Sie Browser-Entwicklertools (F12)" -echo "- Leeren Sie Browser-Cache" diff --git a/fix-sqlite-permissions.sh b/fix-sqlite-permissions.sh deleted file mode 100755 index a49d71b..0000000 --- a/fix-sqlite-permissions.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash - -echo "🗄️ SQLite-Berechtigungen korrigieren" -echo "===================================" - -# 1. Aktuelle Berechtigungen prüfen -echo "🔍 Aktuelle Berechtigungen:" -ls -la database.sqlite -echo "" - -# 2. Berechtigungen korrigieren -echo "🔐 Setze SQLite-Berechtigungen..." -chown www-data:www-data database.sqlite -chmod 664 database.sqlite - -# 3. Verzeichnis-Berechtigungen -echo "📁 Setze Verzeichnis-Berechtigungen..." -chown -R www-data:www-data /var/www/html -chmod -R 755 /var/www/html -chmod -R 777 storage/ -chmod -R 777 bootstrap/cache/ - -# 4. SQLite-Datei testen -echo "🧪 Teste SQLite-Schreibzugriff..." -if [ -w database.sqlite ]; then - echo "✅ SQLite-Datei ist schreibbar" -else - echo "❌ SQLite-Datei ist NICHT schreibbar" -fi - -# 5. Apache-User prüfen -echo "👤 Apache-User:" -ps aux | grep apache | head -1 - -# 6. Test-Schreibzugriff -echo "📝 Teste Schreibzugriff..." -sqlite3 database.sqlite "CREATE TABLE IF NOT EXISTS test_write (id INTEGER); DROP TABLE test_write;" 2>/dev/null && echo "✅ SQLite-Schreibzugriff funktioniert" || echo "❌ SQLite-Schreibzugriff fehlgeschlagen" - -echo "" -echo "✅ SQLite-Berechtigungen korrigiert!" -echo "📋 Testen Sie jetzt das Erstellen eines Lackes" diff --git a/fix-storage-link.sh b/fix-storage-link.sh deleted file mode 100755 index 204c16b..0000000 --- a/fix-storage-link.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash - -echo "🔗 Storage Link Problem lösen" -echo "============================" - -# 1. Aktuellen Storage-Status prüfen -echo "🔍 Aktueller Storage-Status:" -ls -la public/storage -echo "" - -# 2. Storage-Verzeichnis entfernen (falls es ein Verzeichnis ist) -echo "🗑️ Entferne falsches Storage-Verzeichnis..." -if [ -d "public/storage" ]; then - rm -rf public/storage - echo "✅ Storage-Verzeichnis entfernt" -elif [ -L "public/storage" ]; then - rm public/storage - echo "✅ Storage-Link entfernt" -fi - -# 3. Storage Link neu erstellen -echo "🔗 Erstelle Storage Link neu..." -php artisan storage:link - -# 4. Link prüfen -echo "🔍 Prüfe neuen Storage Link:" -ls -la public/storage -echo "" - -# 5. Ziel-Verzeichnis prüfen -echo "📁 Prüfe Ziel-Verzeichnis:" -ls -la storage/app/public/ -echo "" - -# 6. Bilder-Verzeichnis prüfen -echo "🖼️ Prüfe Bilder-Verzeichnis:" -ls -la storage/app/public/nail_polishes/ 2>/dev/null || echo "⚠️ nail_polishes Verzeichnis nicht gefunden" - -# 7. Test-Bild erstellen -echo "🧪 Erstelle Test-Bild..." -mkdir -p storage/app/public/nail_polishes -echo "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==" | base64 -d > storage/app/public/nail_polishes/test.jpg -chmod 644 storage/app/public/nail_polishes/test.jpg - -# 8. Berechtigungen setzen -echo "🔐 Setze Berechtigungen..." -chmod -R 755 public/storage/ -chmod -R 777 storage/app/public/ - -# 9. Test-URL -echo "🧪 Teste Bild-URL..." -curl -I https://neonail.vogt.de.com/storage/nail_polishes/test.jpg - -# 10. Echte Bilder testen -echo "🖼️ Teste echte Bilder..." -sqlite3 database.sqlite "SELECT image_path FROM nail_polishes WHERE image_path IS NOT NULL LIMIT 1;" | while read image_path; do - if [ ! -z "$image_path" ]; then - echo "Teste: $image_path" - if [ -f "storage/app/public/$image_path" ]; then - echo "✅ Bild existiert: $image_path" - curl -I "https://neonail.vogt.de.com/storage/$image_path" - else - echo "❌ Bild fehlt: $image_path" - fi - fi -done - -echo "" -echo "✅ Storage Link Problem behoben!" -echo "📋 Testen Sie: https://neonail.vogt.de.com" diff --git a/fix-upload-limits.php b/fix-upload-limits.php deleted file mode 100644 index c5fed06..0000000 --- a/fix-upload-limits.php +++ /dev/null @@ -1,133 +0,0 @@ - ini_get('upload_max_filesize'), - 'post_max_size' => ini_get('post_max_size'), - 'max_file_uploads' => ini_get('max_file_uploads'), - 'memory_limit' => ini_get('memory_limit'), - 'max_execution_time' => ini_get('max_execution_time'), - 'max_input_time' => ini_get('max_input_time') -]; - -foreach ($limits as $setting => $value) { - echo " - $setting: $value\n"; -} - -// 2. Konvertiere zu Bytes für Vergleich -function convertToBytes($sizeStr) { - $sizeStr = strtolower(trim($sizeStr)); - $last = strtolower($sizeStr[strlen($sizeStr)-1]); - $size = (int)$sizeStr; - - switch($last) { - case 'g': $size *= 1024; - case 'm': $size *= 1024; - case 'k': $size *= 1024; - } - - return $size; -} - -$uploadMaxBytes = convertToBytes($limits['upload_max_filesize']); -$postMaxBytes = convertToBytes($limits['post_max_size']); -$requiredBytes = 10 * 1024 * 1024; // 10MB - -echo "\n2. 📊 Größenvergleich:\n"; -echo " - Upload max filesize: " . number_format($uploadMaxBytes) . " Bytes\n"; -echo " - Post max size: " . number_format($postMaxBytes) . " Bytes\n"; -echo " - Benötigt für 10MB: " . number_format($requiredBytes) . " Bytes\n"; - -if ($uploadMaxBytes < $requiredBytes) { - echo " ⚠️ upload_max_filesize ist zu klein für 10MB Uploads\n"; -} else { - echo " ✅ upload_max_filesize ist ausreichend\n"; -} - -if ($postMaxBytes < $requiredBytes) { - echo " ⚠️ post_max_size ist zu klein für 10MB Uploads\n"; -} else { - echo " ✅ post_max_size ist ausreichend\n"; -} - -// 3. .htaccess für Upload-Limits erstellen -echo "\n3. 🔧 .htaccess Upload-Limits erstellen...\n"; -$htaccessContent = " -# Upload-Limits für Bild-Upload -php_value upload_max_filesize 10M -php_value post_max_size 10M -php_value max_file_uploads 20 -php_value memory_limit 256M -php_value max_execution_time 300 -php_value max_input_time 300 -"; - -if (file_exists('public/.htaccess')) { - $currentHtaccess = file_get_contents('public/.htaccess'); - - // Prüfe ob Upload-Limits bereits vorhanden sind - if (strpos($currentHtaccess, 'upload_max_filesize') === false) { - // Füge Upload-Limits hinzu - $newHtaccess = $currentHtaccess . "\n" . $htaccessContent; - file_put_contents('public/.htaccess', $newHtaccess); - echo " ✅ Upload-Limits zu .htaccess hinzugefügt\n"; - } else { - echo " ℹ️ Upload-Limits bereits in .htaccess vorhanden\n"; - } -} else { - echo " ❌ public/.htaccess nicht gefunden\n"; -} - -// 4. Test-Upload-Funktionalität -echo "\n4. 🧪 Test Upload-Funktionalität...\n"; - -// Prüfe GD Extension -if (extension_loaded('gd')) { - echo " ✅ GD Extension geladen\n"; -} else { - echo " ❌ GD Extension nicht geladen - Bildverarbeitung nicht möglich\n"; -} - -// Prüfe Storage-Verzeichnis -$storagePath = 'storage/app/public/nail_polishes'; -if (is_dir($storagePath)) { - echo " ✅ Storage-Verzeichnis existiert: $storagePath\n"; -} else { - echo " ⚠️ Storage-Verzeichnis existiert nicht: $storagePath\n"; - mkdir($storagePath, 0755, true); - echo " ✅ Storage-Verzeichnis erstellt\n"; -} - -// Prüfe Schreibrechte -if (is_writable($storagePath)) { - echo " ✅ Storage-Verzeichnis beschreibbar\n"; -} else { - echo " ❌ Storage-Verzeichnis nicht beschreibbar\n"; -} - -// 5. Laravel Storage Link prüfen -echo "\n5. 🔗 Laravel Storage Link prüfen...\n"; -$publicStoragePath = 'public/storage'; -if (is_link($publicStoragePath)) { - echo " ✅ Storage Link existiert\n"; -} else { - echo " ⚠️ Storage Link existiert nicht\n"; - if (file_exists('public/storage')) { - echo " ℹ️ public/storage ist ein Verzeichnis, kein Link\n"; - } else { - echo " ℹ️ public/storage existiert nicht\n"; - } -} - -echo "\n✅ Upload-Limits Fix abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n"; -echo "📝 Versuchen Sie ein Handy-Foto hochzuladen (bis 10MB)\n"; -echo "\n📋 Falls Upload immer noch fehlschlägt:\n"; -echo "- Prüfen Sie die Browser-Entwicklertools (F12) für Details\n"; -echo "- Schauen Sie in storage/logs/laravel.log für Laravel-Fehler\n"; -echo "- Prüfen Sie die Apache-Logs für Server-Fehler\n"; -?> diff --git a/fix-user-login.sh b/fix-user-login.sh deleted file mode 100755 index e69de29..0000000 diff --git a/fix-webspace-production.sh b/fix-webspace-production.sh deleted file mode 100755 index e69de29..0000000 diff --git a/force-upload-fix.sh b/force-upload-fix.sh deleted file mode 100755 index eb12120..0000000 --- a/force-upload-fix.sh +++ /dev/null @@ -1,158 +0,0 @@ -#!/bin/bash - -echo "🚨 Force Fix: Upload-Limits erzwingen" -echo "====================================" - -# 1. Laravel Cache komplett leeren -echo "1. 🧹 Laravel Cache komplett leeren..." -php artisan cache:clear 2>/dev/null || echo " ⚠️ cache:clear übersprungen" -php artisan config:clear 2>/dev/null || echo " ⚠️ config:clear übersprungen" -php artisan route:clear 2>/dev/null || echo " ⚠️ route:clear übersprungen" -php artisan view:clear 2>/dev/null || echo " ⚠️ view:clear übersprungen" -php artisan config:cache 2>/dev/null || echo " ⚠️ config:cache übersprungen" - -# 2. Bootstrap Cache leeren -echo "2. 🗂️ Bootstrap Cache leeren..." -rm -f bootstrap/cache/*.php 2>/dev/null || echo " ⚠️ bootstrap/cache/*.php nicht gefunden" - -# 3. .htaccess Upload-Limits erzwingen -echo "3. 🔧 .htaccess Upload-Limits erzwingen..." -cat > public/.htaccess << 'EOF' - - RewriteEngine On - - # Force HTTPS - RewriteCond %{HTTPS} off - RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - - # Handle Authorization Header - RewriteCond %{HTTP:Authorization} . - RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] - - # Redirect Trailing Slashes If Not A Folder... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_URI} (.+)/$ - RewriteRule ^ %1 [L,R=301] - - # Send Requests To Front Controller... - RewriteCond %{REQUEST_FILENAME} !-d - RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^ index.php [L] - - -# Upload-Limits für Bild-Upload -php_value upload_max_filesize 10M -php_value post_max_size 10M -php_value max_file_uploads 20 -php_value memory_limit 256M -php_value max_execution_time 300 -php_value max_input_time 300 - -# Protect sensitive files - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - -EOF - -echo " ✅ .htaccess mit Upload-Limits erstellt" - -# 4. PHP-Konfiguration prüfen -echo "4. 🔍 PHP-Konfiguration prüfen..." -php fix-upload-limits.php - -# 5. Apache neu laden -echo "5. 🔄 Apache neu laden..." -systemctl reload apache2 2>/dev/null || service apache2 reload 2>/dev/null || echo " ⚠️ Apache reload fehlgeschlagen" - -# 6. Test-Script erstellen -echo "6. 🧪 Test-Script erstellen..." -cat > test-upload-limits.php << 'EOF' - ini_get('upload_max_filesize'), - 'post_max_size' => ini_get('post_max_size'), - 'max_file_uploads' => ini_get('max_file_uploads'), - 'memory_limit' => ini_get('memory_limit') -]; - -foreach ($limits as $setting => $value) { - echo " - $setting: $value\n"; -} - -// 2. Laravel Validierungsregeln prüfen -echo "\n2. Laravel Validierungsregeln:\n"; -$controllerPath = 'app/Http/Controllers/UserNailPolishController.php'; -if (file_exists($controllerPath)) { - $content = file_get_contents($controllerPath); - if (preg_match('/image.*max:(\d+)/', $content, $matches)) { - $maxKB = $matches[1]; - $maxMB = $maxKB / 1024; - echo " - Bild-Upload-Limit: {$maxKB}KB ({$maxMB}MB)\n"; - - if ($maxMB >= 10) { - echo " ✅ Upload-Limit ist ausreichend (>= 10MB)\n"; - } else { - echo " ❌ Upload-Limit ist zu klein (< 10MB)\n"; - } - } else { - echo " ❌ Keine Bild-Upload-Validierung gefunden\n"; - } -} else { - echo " ❌ Controller nicht gefunden\n"; -} - -// 3. View-Text prüfen -echo "\n3. View-Text:\n"; -$viewPath = 'resources/views/user-nail-polishes/create.blade.php'; -if (file_exists($viewPath)) { - $content = file_get_contents($viewPath); - if (preg_match('/Maximale Größe: (\d+MB)/', $content, $matches)) { - echo " - Angezeigte Größe: {$matches[1]}\n"; - - if ($matches[1] === '10MB') { - echo " ✅ View zeigt korrekte Größe an\n"; - } else { - echo " ❌ View zeigt falsche Größe an\n"; - } - } else { - echo " ❌ Keine Größenangabe in View gefunden\n"; - } -} else { - echo " ❌ View nicht gefunden\n"; -} - -echo "\n✅ Upload-Limits Test abgeschlossen!\n"; -echo "🔗 Testen Sie jetzt: https://neonail.vogt.de.com/create-nail-polish\n"; -?> -EOF - -echo " ✅ Test-Script erstellt" - -echo "" -echo "✅ Force Upload-Limits Fix abgeschlossen!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. https://neonail.vogt.de.com/create-nail-polish" -echo "2. Versuchen Sie ein Handy-Foto hochzuladen" -echo "" -echo "📝 Falls Problem besteht:" -echo "- Führen Sie php test-upload-limits.php aus" -echo "- Leeren Sie Browser-Cache" -echo "- Testen Sie in einem Inkognito-Fenster" diff --git a/htaccess-root.txt b/htaccess-root.txt deleted file mode 100755 index 01f9743..0000000 --- a/htaccess-root.txt +++ /dev/null @@ -1,24 +0,0 @@ -# NeoNail DB - Hauptverzeichnis .htaccess -# Umleitung auf public/ Ordner - -# Sicherheit - - Order allow,deny - Deny from all - - - - Order allow,deny - Deny from all - - -# Umleitung auf public/ -RewriteEngine On -RewriteRule ^$ public/ [L] -RewriteRule (.*) public/$1 [L] - -# Fallback für direkte PHP-Dateien - - Order allow,deny - Allow from all - diff --git a/install-composer-local.sh b/install-composer-local.sh deleted file mode 100755 index 1c4c061..0000000 --- a/install-composer-local.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -echo "📦 Composer lokale Installation" -echo "==============================" - -# 1. Composer herunterladen -echo "⬇️ Lade Composer herunter..." -curl -sS https://getcomposer.org/installer | php - -# 2. Composer lokal verwenden -echo "🔗 Verwende Composer lokal..." -php composer.phar --version - -echo "" -echo "🎉 Composer lokal verfügbar!" -echo "📋 Verwenden Sie:" -echo " php composer.phar install --no-dev" -echo "" -echo "📋 Oder für andere Composer-Befehle:" -echo " php composer.phar [befehl]" diff --git a/install-composer.sh b/install-composer.sh deleted file mode 100755 index e14bef2..0000000 --- a/install-composer.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -echo "📦 Composer Installation" -echo "=======================" - -# 1. PHP und curl prüfen -echo "🔍 Prüfe PHP und curl..." -if ! command -v php &> /dev/null; then - echo "❌ PHP nicht gefunden!" - exit 1 -fi - -if ! command -v curl &> /dev/null; then - echo "❌ curl nicht gefunden!" - exit 1 -fi - -# 2. Composer herunterladen -echo "⬇️ Lade Composer herunter..." -curl -sS https://getcomposer.org/installer | php - -# 3. Composer global verfügbar machen -echo "🔗 Mache Composer global verfügbar..." -sudo mv composer.phar /usr/local/bin/composer -sudo chmod +x /usr/local/bin/composer - -# 4. Test -echo "✅ Teste Composer..." -composer --version - -echo "" -echo "🎉 Composer erfolgreich installiert!" -echo "📋 Jetzt können Sie ausführen:" -echo " composer install --no-dev" diff --git a/install-gd-extension.sh b/install-gd-extension.sh deleted file mode 100755 index c79a51d..0000000 --- a/install-gd-extension.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -echo "🖼️ GD PHP Extension installieren" -echo "===============================" - -# 1. System-Update -echo "🔄 System-Update..." -apt update - -# 2. GD Extension installieren -echo "📦 Installiere GD Extension..." -apt install -y php-gd - -# 3. Weitere nötige Extensions -echo "📦 Installiere weitere Extensions..." -apt install -y libpng-dev libjpeg-dev libfreetype6-dev - -# 4. PHP-Module neu laden -echo "🔄 Lade PHP-Module neu..." -systemctl reload apache2 2>/dev/null || echo "⚠️ Apache reload übersprungen" -systemctl reload nginx 2>/dev/null || echo "⚠️ Nginx reload übersprungen" - -# 5. GD Extension testen -echo "🧪 Teste GD Extension..." -php -m | grep -i gd - -# 6. PHP-Info für GD -echo "📋 GD PHP-Info:" -php -r "if (extension_loaded('gd')) { echo '✅ GD Extension ist aktiviert\n'; echo 'Version: ' . gd_info()['GD Version'] . '\n'; } else { echo '❌ GD Extension ist NICHT aktiviert\n'; }" - -# 7. Laravel Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" - -echo "" -echo "✅ GD Extension installiert!" -echo "📋 Testen Sie jetzt das Erstellen eines Lackes mit Bild" diff --git a/install-sqlite.sh b/install-sqlite.sh deleted file mode 100755 index c2136a4..0000000 --- a/install-sqlite.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -echo "🗄️ SQLite-Treiber Installation" -echo "==============================" - -# 1. System-Update -echo "🔄 System-Update..." -apt update - -# 2. SQLite und PHP-SQLite installieren -echo "📦 Installiere SQLite..." -apt install -y sqlite3 php-sqlite3 php-pdo-sqlite - -# 3. PHP-Module neu laden -echo "🔄 Lade PHP-Module neu..." -systemctl reload apache2 2>/dev/null || echo "⚠️ Apache reload übersprungen" -systemctl reload nginx 2>/dev/null || echo "⚠️ Nginx reload übersprungen" - -# 4. PHP-Info prüfen -echo "🔍 Prüfe SQLite-Installation..." -php -m | grep -i sqlite - -echo "" -echo "✅ SQLite-Treiber installiert!" -echo "📋 Testen Sie: php -m | grep sqlite" diff --git a/laravel-test.php b/laravel-test.php deleted file mode 100755 index 3e6bb76..0000000 --- a/laravel-test.php +++ /dev/null @@ -1,114 +0,0 @@ -Laravel-Test"; - -// 1. Composer autoload testen -echo "

1. Composer Autoload:

"; -if (file_exists('vendor/autoload.php')) { - require_once 'vendor/autoload.php'; - echo "✅ Autoload geladen
"; -} else { - echo "❌ vendor/autoload.php nicht gefunden
"; - echo "Führen Sie 'composer install' aus
"; - exit; -} - -// 2. Laravel Bootstrap testen -echo "

2. Laravel Bootstrap:

"; -if (file_exists('bootstrap/app.php')) { - try { - $app = require_once 'bootstrap/app.php'; - echo "✅ Laravel App geladen
"; - } catch (Exception $e) { - echo "❌ Laravel Bootstrap Fehler: " . $e->getMessage() . "
"; - } -} else { - echo "❌ bootstrap/app.php nicht gefunden
"; -} - -// 3. .env laden testen -echo "

3. .env Konfiguration:

"; -if (file_exists('.env')) { - $env_content = file_get_contents('.env'); - echo "✅ .env Datei gefunden
"; - - // Wichtige Einstellungen prüfen - $checks = [ - 'APP_ENV' => 'production', - 'APP_DEBUG' => 'false', - 'DB_CONNECTION' => 'sqlite', - 'DB_DATABASE' => 'database.sqlite' - ]; - - foreach ($checks as $key => $expected) { - if (preg_match("/^$key=(.*)$/m", $env_content, $matches)) { - $value = trim($matches[1]); - $status = ($value === $expected) ? "✅" : "⚠️"; - echo "$status $key = $value (erwartet: $expected)
"; - } else { - echo "❌ $key nicht gefunden
"; - } - } -} else { - echo "❌ .env Datei nicht gefunden
"; -} - -// 4. SQLite-Verbindung testen -echo "

4. SQLite-Verbindung:

"; -if (file_exists('database.sqlite')) { - try { - $pdo = new PDO('sqlite:database.sqlite'); - $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - echo "✅ SQLite-Verbindung erfolgreich
"; - - // Tabellen prüfen - $tables = $pdo->query("SELECT name FROM sqlite_master WHERE type='table'")->fetchAll(PDO::FETCH_COLUMN); - echo "Gefundene Tabellen: " . implode(', ', $tables) . "
"; - - } catch (PDOException $e) { - echo "❌ SQLite-Fehler: " . $e->getMessage() . "
"; - } -} else { - echo "❌ database.sqlite nicht gefunden
"; -} - -// 5. Storage-Verzeichnis testen -echo "

5. Storage-Verzeichnis:

"; -if (is_dir('storage')) { - if (is_writable('storage')) { - echo "✅ storage/ ist schreibbar
"; - } else { - echo "❌ storage/ ist nicht schreibbar
"; - } - - // Storage-Link prüfen - if (is_link('public/storage')) { - echo "✅ Storage-Link existiert
"; - } else { - echo "⚠️ Storage-Link fehlt (php artisan storage:link)
"; - } -} else { - echo "❌ storage/ Verzeichnis nicht gefunden
"; -} - -// 6. Cache-Verzeichnis testen -echo "

6. Cache-Verzeichnis:

"; -if (is_dir('bootstrap/cache')) { - if (is_writable('bootstrap/cache')) { - echo "✅ bootstrap/cache/ ist schreibbar
"; - } else { - echo "❌ bootstrap/cache/ ist nicht schreibbar
"; - } -} else { - echo "❌ bootstrap/cache/ Verzeichnis nicht gefunden
"; -} - -echo "
"; -echo "

Empfohlene Aktionen:

"; -echo "1. Falls Composer fehlt: composer install ausführen
"; -echo "2. Falls .env falsch: env-sqlite-example.txt zu .env kopieren
"; -echo "3. Falls Berechtigungen falsch: chmod 755 storage/ bootstrap/cache/
"; -echo "4. Falls SQLite fehlt: touch database.sqlite && chmod 664 database.sqlite
"; -echo "5. Falls Storage-Link fehlt: php artisan storage:link
"; -echo "6. Migrationen ausführen: php artisan migrate --force
"; -?> diff --git a/mail-configuration-fix.md b/mail-configuration-fix.md deleted file mode 100644 index 2c2a704..0000000 --- a/mail-configuration-fix.md +++ /dev/null @@ -1,97 +0,0 @@ -# 📧 Mail-Konfiguration Problem - Lösung - -## 🚨 **Problem:** -- E-Mails werden nicht versendet -- Weder User noch Admin erhalten E-Mails -- Mail-Fehler in den Logs - -## 🔍 **Ursache:** -SMTP-Server `mail.selfhost.de:465` ist nicht erreichbar oder falsch konfiguriert. - -## 🔧 **Lösung:** - -### **Schritt 1: Auf dem Webspace ausführen** - -```bash -# 1. Ins Laravel-Verzeichnis wechseln -cd /var/www/html - -# 2. Mail Configuration Fix ausführen -./fix-mail-config.sh -``` - -### **Schritt 2: Manuell (falls Script nicht funktioniert)** - -```bash -# 1. Backup der .env erstellen -cp .env .env.backup.$(date +%Y%m%d_%H%M%S) - -# 2. Mail-Konfiguration anpassen -sed -i 's/MAIL_MAILER=smtp/MAIL_MAILER=log/' .env -sed -i 's/MAIL_HOST=mail.selfhost.de/MAIL_HOST=127.0.0.1/' .env -sed -i 's/MAIL_PORT=465/MAIL_PORT=1025/' .env -sed -i 's/MAIL_USERNAME=.*/MAIL_USERNAME=null/' .env -sed -i 's/MAIL_PASSWORD=.*/MAIL_PASSWORD=null/' .env -sed -i 's/MAIL_ENCRYPTION=ssl/MAIL_ENCRYPTION=null/' .env -sed -i 's/MAIL_FROM_ADDRESS=.*/MAIL_FROM_ADDRESS="noreply@neonail.vogt.de.com"/' .env -sed -i 's/MAIL_FROM_NAME=.*/MAIL_FROM_NAME="NeoNail DB"/' .env - -# 3. Cache leeren -php artisan config:clear - -# 4. Test-Mail senden -php artisan tinker --execute="use Illuminate\Support\Facades\Mail; Mail::raw('Test-Mail von NeoNail DB - ' . now(), function(\$message) { \$message->to('test@example.com')->subject('Test-Mail'); }); echo 'Test-Mail gesendet';" -``` - -### **Schritt 3: E-Mails in Logs prüfen** - -```bash -# Mail-Logs anzeigen -tail -f storage/logs/laravel.log | grep -i mail - -# Oder alle Logs durchsuchen -grep -i "mail\|email" storage/logs/laravel.log -``` - -## 🎯 **Was passiert jetzt:** - -### **Option 1: Log-Modus (empfohlen für Production)** -- E-Mails werden in `storage/logs/laravel.log` geschrieben -- Keine echten E-Mails versendet -- System funktioniert ohne SMTP-Server - -### **Option 2: Echte E-Mail-Versendung** -Für echte E-Mail-Versendung SMTP-Server konfigurieren: - -```env -MAIL_MAILER=smtp -MAIL_HOST=ihr-smtp-server.com -MAIL_PORT=587 -MAIL_USERNAME=ihr-username -MAIL_PASSWORD=ihr-passwort -MAIL_ENCRYPTION=tls -MAIL_FROM_ADDRESS="noreply@ihre-domain.com" -MAIL_FROM_NAME="NeoNail DB" -``` - -## 📋 **Mail-Logs prüfen:** - -```bash -# Letzte Mail-Einträge anzeigen -tail -n 50 storage/logs/laravel.log | grep -i mail - -# Spezifische Mail suchen -grep -i "willkommens-e-mail" storage/logs/laravel.log -``` - -## 🚀 **Nach dem Fix:** - -1. **Neuen User erstellen** - E-Mail wird in Logs geschrieben -2. **Logs prüfen** - E-Mail-Inhalt anzeigen -3. **Bei Bedarf** - SMTP-Server für echte E-Mails konfigurieren - -## ⚠️ **Wichtige Hinweise:** - -- **Log-Modus** ist sicher für Production ohne SMTP-Server -- **E-Mails sind in Logs verfügbar** für Debugging -- **SMTP-Konfiguration** nur bei verfügbarem Mail-Server diff --git a/make-existing-user-admin.php b/make-existing-user-admin.php deleted file mode 100644 index 7ac4eac..0000000 --- a/make-existing-user-admin.php +++ /dev/null @@ -1,71 +0,0 @@ -make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - echo "

👑 User zum Admin machen

"; - - // Alle User anzeigen - echo "

👥 Alle User:

"; - $allUsers = User::all(); - - if ($allUsers->count() > 0) { - echo ""; - echo ""; - - foreach ($allUsers as $user) { - $isAdmin = ($user->email === 'admin@neonail.com' || $user->email === 'neueradmin@neonail.com'); - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - } - echo "
IDNameEmailErstelltAktion
{$user->id}{$user->name}{$user->email}{$user->created_at}" . ($isAdmin ? "👑 Admin" : "👤 User") . "
"; - - // User zum Admin machen (Beispiel: User mit ID 2) - $userId = 2; // Ändern Sie diese ID - $user = User::find($userId); - - if ($user) { - echo "

🔧 User zum Admin machen:

"; - echo "

User: {$user->name} ({$user->email})

"; - - // Passwort ändern (optional) - $newPassword = 'admin123'; - $user->password = bcrypt($newPassword); - $user->save(); - - echo "

✅ User wurde zum Admin gemacht!

"; - echo "

Neues Passwort: {$newPassword}

"; - echo "

Login: {$user->email} / {$newPassword}

"; - } else { - echo "

❌ User mit ID {$userId} nicht gefunden

"; - } - - } else { - echo "

❌ Keine User gefunden

"; - } - - echo "

🔑 Admin-Login:

"; - echo "

Verwenden Sie eine der Admin-Emails:

"; - echo ""; - echo "

Passwort: admin123

"; - echo "

🚀 Zur Anwendung

"; - -} catch (Exception $e) { - echo "

❌ Fehler:

"; - echo "

{$e->getMessage()}

"; -} -?> diff --git a/make-user-admin.php b/make-user-admin.php deleted file mode 100644 index 54ce959..0000000 --- a/make-user-admin.php +++ /dev/null @@ -1,65 +0,0 @@ -make('Illuminate\Contracts\Console\Kernel')->bootstrap(); - - echo "

👑 Neuen Admin-User erstellen

"; - - // Prüfe ob User bereits existiert - $email = 'neueradmin@neonail.com'; - $existingUser = User::where('email', $email)->first(); - - if ($existingUser) { - echo "

✅ User existiert bereits!

"; - echo "

Name: {$existingUser->name}

"; - echo "

Email: {$existingUser->email}

"; - echo "

ID: {$existingUser->id}

"; - echo "

Erstellt: {$existingUser->created_at}

"; - } else { - // Neuen Admin-User erstellen - $newAdmin = User::create([ - 'name' => 'Neuer Admin', - 'email' => $email, - 'password' => bcrypt('admin123') - ]); - - echo "

✅ Neuer Admin-User erstellt!

"; - echo "

Name: {$newAdmin->name}

"; - echo "

Email: {$newAdmin->email}

"; - echo "

Passwort: admin123

"; - echo "

ID: {$newAdmin->id}

"; - } - - // Alle Admin-User anzeigen - echo "

👑 Alle Admin-User:

"; - $allUsers = User::all(); - - echo ""; - echo ""; - - foreach ($allUsers as $user) { - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - } - echo "
IDNameEmailErstellt
{$user->id}{$user->name}{$user->email}{$user->created_at}
"; - - echo "

🔑 Login-Daten:

"; - echo "

Email: neueradmin@neonail.com

"; - echo "

Passwort: admin123

"; - echo "

🚀 Zur Anwendung

"; - -} catch (Exception $e) { - echo "

❌ Fehler:

"; - echo "

{$e->getMessage()}

"; -} -?> diff --git a/memory/MEMORY.md b/memory/MEMORY.md new file mode 100644 index 0000000..bd9f5aa --- /dev/null +++ b/memory/MEMORY.md @@ -0,0 +1,3 @@ +# Memory Index — NeoNail DB + +- [Project Overview](project_overview.md) — Laravel 12 Nagellack-Sammlungs-App, SQLite, Bootstrap 5, Admin/User-Rollen, Foto-Upload diff --git a/memory/project_overview.md b/memory/project_overview.md new file mode 100644 index 0000000..e7d84b1 --- /dev/null +++ b/memory/project_overview.md @@ -0,0 +1,34 @@ +--- +name: project-overview +description: NeoNail DB — Laravel-Webapp für persönliche Nagellack-Sammlungen mit Fotos, Admin-Bereich und E-Mail-Benachrichtigungen +metadata: + type: project +--- + +NeoNail DB ist eine Laravel 12 / PHP 8.2 Webanwendung (SQLite-Datenbank), bei der Nutzer ihre eigene Nagellack-Sammlung verwalten und Fotos hochladen können. + +**Kernfunktionen:** +- User-Sammlung: eigene Lacke hinzufügen/entfernen (Many-to-Many via `user_nail_polishes`) +- Foto-Upload: Bilder werden im `storage/public/nail_polishes/` Ordner gespeichert +- Hersteller-Verwaltung: alle eingeloggten User können Hersteller anlegen/bearbeiten +- Admin-Bereich (`/admin`): User-CRUD, Nagellack-Katalog, Statistiken, Willkommens-E-Mails +- E-Mail: Willkommens-Mail an neue User + Bestätigungs-Mail an Admin (oliver@vogt.de.com) + +**Tech-Stack:** +- Backend: Laravel 12, PHP 8.2, SQLite (database/database.sqlite) +- Frontend: Bootstrap 5.3, Font Awesome 6, Blade-Templates +- Bild-Verarbeitung: Intervention Image v3 (im NailPolishController), direkt im UserNailPolishController +- Auth: Laravel UI (kein Breeze/Jetstream), session-basiert + +**Rollen:** +- User: kann Sammlung verwalten, Hersteller anlegen, eigene Lacke hinzufügen +- Admin: `is_admin`-Flag in users-Tabelle ODER E-Mail-Whitelist in User::isAdmin() + +**Wichtige Controller:** +- `NailPolishController` — Admin-only CRUD für den globalen Katalog +- `UserNailPolishController` — User-seitige Sammlung (index, available, add, remove, create/store) +- `AdminController` — Dashboard, User-Management, Statistiken +- `ManufacturerController` — für alle eingeloggten User + +**Why:** Persönliches Hobby-Projekt zur Verwaltung einer Nagellack-Sammlung. +**How to apply:** Bei neuen Features beachten: User sehen nur ihre eigene Sammlung, nur Admins verwalten den Gesamt-Katalog. SQLite-Datei liegt doppelt (root + database/). Viele Debug-/Fix-Skripte im Root stammen aus der Produktions-Einrichtung und können ignoriert werden. diff --git a/monitor-logs.php b/monitor-logs.php deleted file mode 100644 index 8b3b10b..0000000 --- a/monitor-logs.php +++ /dev/null @@ -1,137 +0,0 @@ - diff --git a/quick-500-fix.sh b/quick-500-fix.sh deleted file mode 100755 index ac8a467..0000000 --- a/quick-500-fix.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -echo "🚨 Quick Fix: HTTP 500 Internal Server Error" -echo "===========================================" - -# 1. Debug aktivieren -echo "1. 🐛 Debug aktivieren..." -if [ -f .env ]; then - sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env - sed -i 's/APP_ENV=production/APP_ENV=local/' .env - echo " ✅ Debug-Modus aktiviert" -else - echo " ❌ .env Datei nicht gefunden" -fi - -# 2. Berechtigungen reparieren -echo "2. 🔐 Berechtigungen reparieren..." -chmod -R 755 storage/ -chmod -R 755 bootstrap/cache/ -chown -R www-data:www-data storage/ -chown -R www-data:www-data bootstrap/cache/ -echo " ✅ Berechtigungen repariert" - -# 3. Cache leeren -echo "3. 🧹 Cache leeren..." -rm -f bootstrap/cache/*.php 2>/dev/null || echo " ⚠️ bootstrap/cache/*.php nicht gefunden" -rm -f storage/framework/cache/* 2>/dev/null || echo " ⚠️ storage/framework/cache/* nicht gefunden" -rm -f storage/framework/views/* 2>/dev/null || echo " ⚠️ storage/framework/views/* nicht gefunden" -echo " ✅ Cache geleert" - -# 4. Log-Dateien erstellen -echo "4. 📝 Log-Dateien erstellen..." -mkdir -p storage/logs/ -touch storage/logs/laravel.log -chmod 666 storage/logs/laravel.log -chown www-data:www-data storage/logs/laravel.log -echo " ✅ Log-Dateien erstellt" - -# 5. Debug-Script ausführen -echo "5. 🔍 Debug-Script ausführen..." -php debug-500-error.php - -echo "" -echo "✅ Quick Fix abgeschlossen!" -echo "" -echo "🔗 Testen Sie jetzt:" -echo "1. https://neonail.vogt.de.com" -echo "2. Falls Fehler bestehen, prüfen Sie die Debug-Ausgabe oben" -echo "3. Schauen Sie in storage/logs/laravel.log für Details" diff --git a/quick-debug.sh b/quick-debug.sh deleted file mode 100755 index 2cf2de3..0000000 --- a/quick-debug.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash - -echo "🔧 Schnelle Debug-Aktivierung" -echo "============================" - -# 1. Debug aktivieren -echo "📝 Aktiviere Debug-Modus..." -sed -i 's/APP_DEBUG=false/APP_DEBUG=true/' .env -echo "✅ APP_DEBUG=true gesetzt" - -# 2. Cache leeren -echo "🧹 Leere Laravel Cache..." -php artisan config:clear 2>/dev/null || echo "⚠️ config:clear übersprungen" -php artisan cache:clear 2>/dev/null || echo "⚠️ cache:clear übersprungen" - -# 3. Berechtigungen prüfen -echo "🔐 Prüfe Berechtigungen..." -chmod -R 777 storage/ 2>/dev/null -chmod -R 777 bootstrap/cache/ 2>/dev/null - -# 4. Test -echo "🧪 Teste Anwendung..." -curl -s http://192.168.30.81 | head -20 - -echo "" -echo "✅ Debug aktiviert!" -echo "📋 Öffnen Sie: http://192.168.30.81" -echo "📋 Fehlermeldung wird jetzt angezeigt" diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index e6a5913..1610e5a 100755 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -1,68 +1,82 @@ @extends('layouts.app') -@section('title', 'Anmelden - NeoNail DB') +@section('title', 'Anmelden – NeoNail DB') @section('content') -
-
+
+
+ + {{-- Logo / Hero --}} +
+
+ 💅 +
+

+ NeoNail DB +

+

+ Melden Sie sich an, um Ihre Sammlung zu verwalten +

+
+ + {{-- Card --}}
-
- -

NeoNail DB

-

Anmelden um Ihre Sammlung zu verwalten

-
-
+ @if($errors->any()) +
+ + {{ $errors->first() }} +
+ @endif + + @csrf
-
- - -
+ @error('email') - - {{ $message }} - +
{{ $message }}
@enderror
-
+
-
- - -
+ @error('password') - - {{ $message }} - +
{{ $message }}
@enderror
-
+
- -
-
- -
+ -
+
@endsection diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 49d34a0..3834fc7 100755 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -4,174 +4,499 @@ - @yield("title", "NeoNail Datenbank") - - + @yield('title', 'NeoNail DB') + + + + - - + - - @yield("styles") + + @yield('styles') -