From eb50ad546315fed16ed07fb369682a28997e517f Mon Sep 17 00:00:00 2001 From: Kevin Feiler Date: Thu, 16 Oct 2025 03:48:03 +0200 Subject: [PATCH] fixed server 2.0 --- TROUBLESHOOTING.md | 508 +++++++++++++++++++++++++++++ modules/servers/keyhelpmanager.zip | Bin 0 -> 11279 bytes 2 files changed, 508 insertions(+) create mode 100644 TROUBLESHOOTING.md create mode 100644 modules/servers/keyhelpmanager.zip diff --git a/TROUBLESHOOTING.md b/TROUBLESHOOTING.md new file mode 100644 index 0000000..97d4ede --- /dev/null +++ b/TROUBLESHOOTING.md @@ -0,0 +1,508 @@ +# Troubleshooting Guide - KeyHelp Manager WHMCS Modul + +Dieser Guide hilft bei der Fehlersuche und Behebung häufiger Probleme mit dem KeyHelp Manager Modul. + +## 📋 Inhaltsverzeichnis + +- [Fehler beim Server hinzufügen](#fehler-beim-server-hinzufügen) +- [SSL-Zertifikat-Probleme](#ssl-zertifikat-probleme) +- [API-Endpunkt-Fehler](#api-endpunkt-fehler) +- [Account-Erstellung schlägt fehl](#account-erstellung-schlägt-fehl) +- [Client Area zeigt keine Daten](#client-area-zeigt-keine-daten) +- [Template-Probleme](#template-probleme) +- [Allgemeine Debugging-Tipps](#allgemeine-debugging-tipps) + +--- + +## Fehler beim Server hinzufügen + +### Problem: "Oops! Something went wrong" beim Öffnen der Server-Konfiguration + +**Symptom:** +``` +Oops! +Something went wrong and we couldn't process your request. +Please go back to the previous page and try again. +``` + +**Ursachen:** +1. PHP-Fehler beim Laden der ConfigOptions +2. Template-Loader versucht API-Call ohne vollständige Server-Daten +3. Fehlende oder ungültige Server-Einstellungen + +**Lösung:** + +1. **WHMCS Display Errors aktivieren:** + - Gehe zu: **Setup → General Settings → Other** + - Aktiviere: **Display Errors** + - Versuche erneut, die Server-Seite zu laden + - Notiere die genaue Fehlermeldung + +2. **PHP Error Log prüfen:** + ```bash + tail -f /var/log/php/error.log + # oder + tail -f /var/www/whmcs/storage/logs/laravel.log + ``` + +3. **Modul-Datei ersetzen:** + - Stelle sicher, dass du die neueste Version verwendest + - Die Datei muss die korrigierten Template-Loader-Funktionen enthalten + +4. **Temporärer Fix - Module deaktivieren:** + ```sql + -- In phpMyAdmin oder MySQL Console + UPDATE tblservers SET type = '' WHERE id = 10; + ``` + Dann kannst du die Seite öffnen und den Server neu konfigurieren. + +--- + +## SSL-Zertifikat-Probleme + +### Problem: "cURL error 60: SSL certificate problem" + +**Vollständige Fehlermeldung:** +``` +cURL error 60: SSL: no alternative certificate subject name matches target host name '5.83.148.129' +``` + +**Ursache:** +SSL-Zertifikat wurde für einen Domain-Namen ausgestellt, aber du verwendest eine IP-Adresse. + +**Lösung:** + +✅ **Automatisch gelöst ab v2.0.1:** +Das Modul erkennt IP-Adressen automatisch und deaktiviert die SSL-Verifizierung. + +**Manuelle Lösung bei älteren Versionen:** +1. Gehe zu: **Setup → Products/Services → Servers** +2. Bearbeite deinen KeyHelp-Server +3. Füge im Feld **NOC** oder einer Custom-Option ein: `no-verify` +4. Speichern + +**Beste Lösung für Produktion:** +``` +1. Erstelle einen A-Record in DNS: + keyhelp.example.com → 5.83.148.129 + +2. Installiere Let's Encrypt auf dem KeyHelp-Server + +3. Verwende den Domain-Namen in WHMCS: + Hostname: keyhelp.example.com (statt 5.83.148.129) +``` + +➡️ Siehe [SSL_TROUBLESHOOTING.md](SSL_TROUBLESHOOTING.md) für Details + +--- + +## API-Endpunkt-Fehler + +### Problem: "KeyHelp API Error: Endpoint not found" + +**Ursache:** +Das Modul verwendet falsche API-Endpunkte. KeyHelp verwendet `/clients`, nicht `/users`. + +**Lösung:** + +✅ **Behoben ab v2.0.1:** +- Alle Endpunkte wurden auf `/clients` korrigiert +- Parameter wurden angepasst (`id_client` statt `user_id`) + +**Prüfen:** +1. Stelle sicher, dass du die neueste Modul-Version verwendest +2. Prüfe die Datei: `keyhelpmanager.php` sollte `/clients` verwenden + +**Manueller Test:** +```bash +# Teste ob der API-Endpunkt funktioniert +curl -X GET https://DEINE-IP/api/v2/clients \ + -H "X-API-Key: DEIN-API-KEY" \ + -H "Accept: application/json" \ + -k + +# Sollte eine Liste oder leeres Array zurückgeben, nicht "Endpoint not found" +``` + +➡️ Siehe [KEYHELP_API_REFERENCE.md](KEYHELP_API_REFERENCE.md) für korrekte Endpunkte + +--- + +## Account-Erstellung schlägt fehl + +### Problem: "Failed to create account in KeyHelp" + +**Mögliche Ursachen:** + +#### 1. API-Key ist falsch oder hat keine Rechte + +**Prüfung:** +```bash +curl -X GET https://DEINE-IP/api/v2/server/version \ + -H "X-API-Key: DEIN-API-KEY" \ + -H "Accept: application/json" \ + -k +``` + +**Erwartete Antwort:** +```json +{"version":"24.3.1","build":"3456"} +``` + +**Bei Fehler:** +- Erstelle einen neuen API-Key in KeyHelp +- Stelle sicher, dass der Key **Admin-Rechte** hat +- Trage ihn im **Password**-Feld der WHMCS Server-Konfiguration ein + +#### 2. Domain existiert bereits + +**Fehlermeldung:** +``` +Domain creation failed: Domain already exists +``` + +**Lösung:** +- Lösche die Domain in KeyHelp manuell +- Oder verwende eine andere Test-Domain + +#### 3. Ungültige Parameter + +**Häufige Fehler:** +``` +- Leere Domain +- Ungültiges E-Mail-Format +- Domain enthält ungültige Zeichen +- Username zu kurz/lang +``` + +**Prüfung:** +1. Gehe zu: **Utilities → Logs → Module Log** +2. Suche nach: `keyhelpmanager` +3. Prüfe Request und Response + +**Beispiel eines korrekten Requests:** +```json +{ + "login_name": "example_com", + "password": "SecurePass123!", + "email": "user@example.com", + "display_name": "Max Mustermann" +} +``` + +#### 4. Template/Hosting-Plan existiert nicht + +**Fehlermeldung:** +``` +Invalid hosting plan ID +``` + +**Lösung:** +- Wähle "Manual Configuration (No Template)" im Produkt +- Oder erstelle den Hosting-Plan in KeyHelp + +--- + +## Client Area zeigt keine Daten + +### Problem: Statistiken werden nicht angezeigt + +**Symptom:** +- Client Area lädt, aber zeigt keine Speicher-/Traffic-Statistiken +- Fortschrittsbalken fehlen + +**Ursachen:** + +#### 1. User-ID wurde nicht gespeichert + +**Prüfung:** +```sql +SELECT * FROM tblcustomfieldsvalues +WHERE relid = DEINE_SERVICE_ID; +``` + +Sollte eine Zeile mit `userid` enthalten. + +**Lösung:** +- Account neu erstellen +- Oder User-ID manuell in Custom Fields eintragen + +#### 2. API-Endpunkt /clients/{id}/statistics nicht verfügbar + +**Test:** +```bash +curl -X GET https://DEINE-IP/api/v2/clients/1/statistics \ + -H "X-API-Key: DEIN-API-KEY" \ + -H "Accept: application/json" \ + -k +``` + +**Bei Fehler:** +- Prüfe KeyHelp-Version (benötigt API v2) +- Update KeyHelp auf die neueste Version + +#### 3. Template wird nicht angezeigt + +**Ursache:** +Template-ID ist "manual" oder leer. + +**Lösung:** +Das ist normal bei "Manual Configuration" - keine Templates verfügbar. + +--- + +## Template-Probleme + +### Problem: "Error loading templates" oder Dropdown ist leer + +**Symptom:** +Bei Produktkonfiguration zeigt das Template-Dropdown: +``` +-- Error loading templates -- +``` +oder +``` +-- Select Template -- +Manual Configuration (No Template) +``` + +**Ursachen:** + +#### 1. API-Endpunkt /plans existiert nicht (KeyHelp Free) + +**Das ist normal!** KeyHelp Free hat keine Hosting-Pläne. + +**Lösung:** +- Wähle "Manual Configuration (No Template)" +- Konfiguriere Limits manuell in KeyHelp + +#### 2. Server ist nicht konfiguriert + +**Lösung:** +1. Gehe zu: **Setup → Products/Services → Servers** +2. Stelle sicher, dass der KeyHelp-Server konfiguriert ist +3. Test Connection muss erfolgreich sein + +#### 3. API-Key hat keine Rechte zum Abrufen von Plänen + +**Lösung:** +- API-Key benötigt **Admin-Rechte** +- Erstelle einen neuen Key mit vollen Rechten + +### Problem: Templates synchronisieren nicht + +**Symptom:** +Nach Erstellen neuer Hosting-Pläne in KeyHelp erscheinen diese nicht in WHMCS. + +**Lösung:** +1. Gehe zum Produkt in WHMCS +2. Tab: **Module Settings** +3. Klicke: **Sync Templates** (falls verfügbar) +4. Oder warte 5 Minuten (Cache-Zeit) + +--- + +## Allgemeine Debugging-Tipps + +### 1. WHMCS Module Log aktivieren + +``` +Setup → General Settings → Logging +✓ Enable Module Log +``` + +Dann prüfen: +``` +Utilities → Logs → Module Log +Filter: keyhelpmanager +``` + +### 2. Activity Log prüfen + +``` +System Settings → Activity Log +Suche nach: "KeyHelp" oder "SSL verification" +``` + +### 3. PHP Error Log + +**Linux:** +```bash +tail -f /var/log/php/error.log +tail -f /var/log/apache2/error.log +tail -f /var/log/nginx/error.log +``` + +**WHMCS Laravel Log:** +```bash +tail -f /var/www/whmcs/storage/logs/laravel.log +``` + +### 4. Debugging-Modus aktivieren + +In `keyhelpmanager.php` temporär hinzufügen: +```php +// Am Anfang der _keyhelpmanager_APIRequest Funktion +error_log("KeyHelp API Request: " . $method . " " . $endpoint); +error_log("KeyHelp API Data: " . json_encode($data)); +``` + +### 5. API direkt testen + +**Connection Test:** +```bash +curl -k https://5.83.148.129/api/v2/server/version \ + -H "X-API-Key: DEIN_KEY" \ + -v +``` + +**Client erstellen:** +```bash +curl -k -X POST https://5.83.148.129/api/v2/clients \ + -H "X-API-Key: DEIN_KEY" \ + -H "Content-Type: application/json" \ + -d '{ + "login_name": "testuser", + "password": "TestPass123!", + "email": "test@example.com", + "display_name": "Test User" + }' +``` + +### 6. Datenbank prüfen + +**Server-Konfiguration:** +```sql +SELECT * FROM tblservers WHERE id = 10; +``` + +**Custom Fields:** +```sql +SELECT * FROM tblcustomfields +WHERE type = 'product' +AND fieldname LIKE '%keyhelp%'; +``` + +**Service-Details:** +```sql +SELECT * FROM tblhosting WHERE id = SERVICE_ID; +``` + +### 7. Modul neu laden + +Nach Änderungen: +```bash +# Cache leeren +rm -rf /var/www/whmcs/storage/cache/* +rm -rf /var/www/whmcs/bootstrap/cache/* + +# Oder im WHMCS Admin +Setup → General Settings → Other → Clear Cache +``` + +--- + +## Häufige Fehlermeldungen + +| Fehlermeldung | Ursache | Lösung | +|---------------|---------|--------| +| "KeyHelp server not configured" | Server-Einstellungen fehlen | Server in WHMCS konfigurieren | +| "Endpoint not found" | Falsche API-Endpunkte | Modul auf v2.0.1+ aktualisieren | +| "Invalid API key" | API-Key falsch oder abgelaufen | Neuen API-Key in KeyHelp erstellen | +| "cURL error 60" | SSL-Zertifikat-Problem | Siehe SSL_TROUBLESHOOTING.md | +| "User created but no ID returned" | API-Response ungültig | KeyHelp-Version prüfen | +| "Domain already exists" | Domain ist schon vorhanden | Domain in KeyHelp löschen | +| "Connection timeout" | Server nicht erreichbar | Firewall/Netzwerk prüfen | + +--- + +## Checkliste zur Fehlersuche + +Arbeite diese Liste systematisch ab: + +- [ ] WHMCS Version 8.13+ installiert? +- [ ] PHP Version 8.3+ aktiv? +- [ ] Modul-Dateien korrekt hochgeladen? +- [ ] Server in WHMCS konfiguriert? +- [ ] Hostname/IP korrekt eingetragen? +- [ ] API-Key im Password-Feld eingetragen? +- [ ] Test Connection erfolgreich? +- [ ] SSL-Konfiguration korrekt? +- [ ] Produkt mit Server verknüpft? +- [ ] Module Log aktiviert? +- [ ] Display Errors aktiviert (für Entwicklung)? +- [ ] KeyHelp-Version aktuell? +- [ ] API v2 in KeyHelp aktiviert? +- [ ] Firewall lässt WHMCS-Server zu? + +--- + +## Support erhalten + +### 1. Informationen sammeln + +Bereite folgende Informationen vor: + +``` +WHMCS Version: _____ +PHP Version: _____ +KeyHelp Version: _____ +Modul Version: _____ +Fehlermeldung: _____ +Module Log: (kopiere relevante Zeilen) +Verwendete IP oder Domain: _____ +SSL aktiviert: Ja/Nein +``` + +### 2. Logs exportieren + +**Module Log:** +``` +Utilities → Logs → Module Log +Export → CSV +``` + +**Activity Log:** +``` +System Settings → Activity Log +Filter nach "KeyHelp" +``` + +### 3. API-Test durchführen + +```bash +# Test 1: Version abrufen +curl -k https://DEINE-IP/api/v2/server/version \ + -H "X-API-Key: DEIN_KEY" + +# Test 2: Clients auflisten +curl -k https://DEINE-IP/api/v2/clients \ + -H "X-API-Key: DEIN_KEY" +``` + +### 4. Kontakt + +**Für WHMCS-Modul:** +- E-Mail: info@avvgo.de +- Website: https://avvgo.de + +**Für KeyHelp API:** +- Forum: https://community.keyhelp.de/ +- Support: support@keyhelp.de +- Wiki: https://wiki.keyhelp.de/ + +--- + +## Weitere Ressourcen + +- [README.md](README.md) - Allgemeine Dokumentation +- [INSTALLATION.md](INSTALLATION.md) - Installations-Anleitung +- [SSL_TROUBLESHOOTING.md](SSL_TROUBLESHOOTING.md) - SSL-spezifische Probleme +- [KEYHELP_API_REFERENCE.md](KEYHELP_API_REFERENCE.md) - API-Dokumentation +- [QUICKSTART.md](QUICKSTART.md) - Schnelleinstieg + +--- + +**Version:** 2.0.1 +**Letzte Aktualisierung:** 2024 +**Entwickelt von:** Kevin Feiler / AVVGO \ No newline at end of file diff --git a/modules/servers/keyhelpmanager.zip b/modules/servers/keyhelpmanager.zip new file mode 100644 index 0000000000000000000000000000000000000000..4378f63764f3e80550164f894c58f5a26280b06f GIT binary patch literal 11279 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 literal 0 HcmV?d00001