# Deployment Guide: Netcup Webspace & Code-Server Proxy Diese Anleitung erklärt, wie die Kaffeekasse-SaaS-Anwendung sowohl auf einem Netcup Webspace als auch über code-server Proxy-Weiterleitung betrieben werden kann. ## Übersicht Die Anwendung ist so entwickelt, dass sie automatisch erkennt, ob sie: 1. **Direkt** auf einem Webspace läuft (z.B. `https://example.com/`) 2. **Hinter einem Reverse Proxy** läuft (z.B. `https://code-server.example.com/proxy/8080/`) ## 1. Deployment auf Netcup Webspace ### Voraussetzungen - PHP 8.0 oder höher - MySQL/MariaDB Datenbank - Apache mit mod_rewrite aktiviert - HTTPS-Zertifikat (Let's Encrypt empfohlen) ### Schritte 1. **Dateien hochladen** ```bash # Via FTP/SFTP alle Dateien hochladen # Document Root sollte auf /public/ zeigen ``` 2. **.env Datei konfigurieren** ```bash cp .env.example .env nano .env ``` Wichtige Einstellungen: ```env APP_URL=https://ihre-domain.de APP_BASE_PATH= DB_HOST=localhost DB_NAME=ihre_datenbank DB_USER=ihr_benutzer DB_PASS=ihr_passwort MAIL_FROM=noreply@ihre-domain.de PASSWORD_RESET_URL=https://ihre-domain.de/reset-password?token={{token}} ``` 3. **Verzeichnisrechte setzen** ```bash chmod 755 storage/ chmod 755 storage/cache/ chmod 755 storage/logs/ chmod 755 storage/uploads/ ``` 4. **Installation durchführen** - Besuchen Sie `https://ihre-domain.de/install` - Folgen Sie dem Setup-Assistenten ### Apache Virtual Host Konfiguration (falls nötig) ```apache ServerName ihre-domain.de DocumentRoot /var/www/kaffeekasse/public Options -Indexes +FollowSymLinks AllowOverride All Require all granted # SSL Konfiguration SSLEngine on SSLCertificateFile /etc/letsencrypt/live/ihre-domain.de/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/ihre-domain.de/privkey.pem ``` ## 2. Deployment mit Code-Server Proxy ### Voraussetzungen - Code-Server läuft und ist erreichbar - PHP 8.0+ CLI verfügbar - SQLite oder MySQL/MariaDB ### Schritte 1. **.env Datei konfigurieren** ```env APP_URL=http://localhost:8080 APP_BASE_PATH=/proxy/8080 # Für SQLite (einfacher für Entwicklung) DB_HOST=sqlite DB_NAME=/config/workspace/kaffeeliste-neustart/storage/database.sqlite # Oder MySQL DB_HOST=127.0.0.1 DB_NAME=kaffeekasse DB_USER=root DB_PASS= ``` 2. **PHP Development Server starten** ```bash cd /config/workspace/kaffeeliste-neustart php -S 0.0.0.0:8080 -t public public/router.php ``` 3. **Zugriff über Code-Server Proxy** - Die Anwendung ist nun erreichbar über: `https://ihr-code-server.de/proxy/8080/` - Code-Server setzt automatisch den Header `X-Forwarded-Prefix` - Die Anwendung erkennt dies und passt alle URLs an ### Automatischer Start (Optional) Erstellen Sie ein Systemd-Service oder Screen-Session: ```bash # Screen-Session screen -dmS kaffeekasse bash -c 'cd /config/workspace/kaffeeliste-neustart && php -S 0.0.0.0:8080 -t public public/router.php' # Später wieder verbinden screen -r kaffeekasse ``` ## 3. Wie funktioniert die automatische Erkennung? ### Base Path Detection Die Funktion `base_path()` in `app/Support/helpers.php` prüft in dieser Reihenfolge: 1. **`$_SERVER['KAFFEEKASSE_PROXY_PREFIX']`** - Manuell gesetzter Prefix 2. **`$_SERVER['HTTP_X_FORWARDED_PREFIX']`** - Von Code-Server gesetzt 3. **`$_ENV['APP_BASE_PATH']`** - Aus .env Datei ```php function base_path(): string { foreach ([ $_SERVER['KAFFEEKASSE_PROXY_PREFIX'] ?? null, $_SERVER['HTTP_X_FORWARDED_PREFIX'] ?? null, $_ENV['APP_BASE_PATH'] ?? null, ] as $prefix) { $prefix = trim((string) $prefix); if ($prefix !== '') { return normalize_base_path($prefix); } } return ''; } ``` ### URL-Generierung Alle URLs werden dynamisch generiert: ```php // Beispiele url('/') // → / oder /proxy/8080/ url('/admin/login') // → /admin/login oder /proxy/8080/admin/login tenant_url('standort1', 'bookings') // → /t/standort1/bookings oder /proxy/8080/t/standort1/bookings asset_url('app.css') // → /assets/app.css oder /proxy/8080/assets/app.css ``` ### .htaccess Proxy-Unterstützung Die `.htaccess` leitet HTTPS-Informationen vom Proxy weiter: ```apache # Proxy-Unterstützung: X-Forwarded-* Header durchreichen RewriteCond %{HTTP:X-Forwarded-Proto} ^https$ RewriteRule ^ - [E=HTTPS:on] ``` ## 4. Troubleshooting ### Problem: URLs zeigen auf falschen Pfad **Lösung:** Prüfen Sie die Base Path Detection: ```php // Temporär in public/index.php hinzufügen zum Debuggen var_dump([ 'base_path' => base_path(), 'current_path' => current_path(), 'KAFFEEKASSE_PROXY_PREFIX' => $_SERVER['KAFFEEKASSE_PROXY_PREFIX'] ?? null, 'HTTP_X_FORWARDED_PREFIX' => $_SERVER['HTTP_X_FORWARDED_PREFIX'] ?? null, 'APP_BASE_PATH' => $_ENV['APP_BASE_PATH'] ?? null, ]); ``` ### Problem: CSS/Assets werden nicht geladen **Ursache:** Base Path wird nicht korrekt erkannt **Lösung:** Setzen Sie `APP_BASE_PATH` explizit in der `.env`: ```env # Für Code-Server Proxy auf Port 8080 APP_BASE_PATH=/proxy/8080 # Für Subdirectory-Installation APP_BASE_PATH=/kaffeekasse ``` ### Problem: Formular-Submissions funktionieren nicht **Ursache:** CSRF-Token oder falsche Action-URLs **Lösung:** 1. Prüfen Sie, ob Sessions funktionieren 2. Stellen Sie sicher, dass alle Forms `` enthalten 3. Verwenden Sie immer `url()` oder `tenant_url()` für Action-Attribute ### Problem: Redirect-Loops **Ursache:** Proxy-Header werden nicht korrekt weitergeleitet **Lösung für Nginx Reverse Proxy:** ```nginx location /proxy/8080/ { proxy_pass http://localhost:8080/; proxy_set_header X-Forwarded-Prefix /proxy/8080; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } ``` ## 5. Sicherheitshinweise ### Für Netcup Webspace 1. **HTTPS erzwingen** - Fügen Sie in `.htaccess` hinzu: ```apache RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] ``` 2. **Verzeichnisse schützen** - Stellen Sie sicher, dass nur `/public` öffentlich erreichbar ist - Dateien außerhalb von `/public` sollten nicht direkt aufrufbar sein 3. **APP_KEY setzen** ```bash # Generieren Sie einen sicheren Key php -r "echo bin2hex(random_bytes(32)) . PHP_EOL;" ``` ### Für Code-Server 1. **Nicht für Production verwenden** - Code-Server Proxy ist für Entwicklung gedacht - Für Production: Netcup Webspace oder dedizierter Server 2. **Zugriffsbeschränkung** - Schützen Sie Code-Server mit starkem Passwort - Verwenden Sie HTTPS - Beschränken Sie IP-Zugriff wenn möglich ## 6. Migrations-Checkliste ### Von Code-Server zu Netcup - [ ] Datenbank exportieren (falls SQLite → MySQL) - [ ] `.env` Datei anpassen (APP_URL, APP_BASE_PATH, DB_*) - [ ] Dateien via FTP/SFTP hochladen - [ ] Verzeichnisrechte setzen - [ ] Datenbank importieren - [ ] Installation testen - [ ] HTTPS-Zertifikat einrichten - [ ] Cron-Jobs einrichten (falls benötigt) ### Von Netcup zu Code-Server - [ ] Datenbank exportieren - [ ] `.env` Datei anpassen (APP_BASE_PATH=/proxy/8080) - [ ] PHP Development Server starten - [ ] Über Proxy-URL testen ## 7. Performance-Optimierung ### Für Netcup Webspace 1. **OPcache aktivieren** (php.ini): ```ini opcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 ``` 2. **Session-Speicher optimieren**: ```ini session.save_handler=files session.save_path=/tmp ``` ### Für Code-Server 1. **SQLite für Entwicklung**: - Schneller Setup - Keine separate Datenbank nötig - Gut für Tests 2. **Development Server Optionen**: ```bash # Mit mehr Workers php -S 0.0.0.0:8080 -t public public/router.php ``` ## Support Bei Problemen: 1. Prüfen Sie die Logs in `storage/logs/` 2. Aktivieren Sie Debug-Modus: `APP_DEBUG=1` in `.env` 3. Prüfen Sie PHP Error Logs 4. Konsultieren Sie die Hauptdokumentation in `DEPLOY.md`