688 lines
12 KiB
Markdown
688 lines
12 KiB
Markdown
# 🐛 Troubleshooting
|
||
|
||
Problembehandlung und Lösungen für häufige Probleme im Ninja Cross Parkour System.
|
||
|
||
## 📋 Inhaltsverzeichnis
|
||
|
||
- [🚨 Kritische Probleme](#-kritische-probleme)
|
||
- [🔧 Installation](#-installation)
|
||
- [🗄️ Datenbank](#️-datenbank)
|
||
- [🌐 API](#-api)
|
||
- [🏆 Achievements](#-achievements)
|
||
- [📊 Performance](#-performance)
|
||
- [🔒 Sicherheit](#-sicherheit)
|
||
- [📱 Frontend](#-frontend)
|
||
|
||
## 🚨 Kritische Probleme
|
||
|
||
### Server startet nicht
|
||
|
||
**Symptome:**
|
||
- `npm start` schlägt fehl
|
||
- Port-Fehler
|
||
- Abhängigkeitsfehler
|
||
|
||
**Lösungen:**
|
||
```bash
|
||
# Port freigeben
|
||
sudo lsof -ti:3000 | xargs kill -9
|
||
|
||
# Abhängigkeiten neu installieren
|
||
rm -rf node_modules package-lock.json
|
||
npm install
|
||
|
||
# Anderen Port verwenden
|
||
PORT=3001 npm start
|
||
|
||
# Logs prüfen
|
||
tail -f logs/server.log
|
||
```
|
||
|
||
### Datenbank-Verbindung fehlgeschlagen
|
||
|
||
**Symptome:**
|
||
- `ECONNREFUSED` Fehler
|
||
- `database connection failed`
|
||
- Timeout-Fehler
|
||
|
||
**Lösungen:**
|
||
```bash
|
||
# PostgreSQL-Status prüfen
|
||
sudo systemctl status postgresql
|
||
|
||
# PostgreSQL starten
|
||
sudo systemctl start postgresql
|
||
|
||
# Verbindung testen
|
||
psql -h localhost -U username -d ninjaserver
|
||
|
||
# .env-Datei prüfen
|
||
cat .env | grep DB_
|
||
```
|
||
|
||
### API antwortet nicht
|
||
|
||
**Symptome:**
|
||
- 500 Internal Server Error
|
||
- Timeout-Fehler
|
||
- Leere Antworten
|
||
|
||
**Lösungen:**
|
||
```bash
|
||
# Server-Status prüfen
|
||
curl http://localhost:3000/health
|
||
|
||
# Logs analysieren
|
||
tail -f logs/server.log
|
||
|
||
# Datenbank-Verbindung prüfen
|
||
psql -d ninjaserver -c "SELECT NOW();"
|
||
|
||
# Speicher prüfen
|
||
free -h
|
||
df -h
|
||
```
|
||
|
||
## 🔧 Installation
|
||
|
||
### Node.js-Version inkompatibel
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: Node.js version 14.x is not supported. Please use Node.js 16 or higher.
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Node.js-Version prüfen
|
||
node --version
|
||
|
||
# Node.js aktualisieren (Ubuntu/Debian)
|
||
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
|
||
sudo apt-get install -y nodejs
|
||
|
||
# Node.js aktualisieren (macOS)
|
||
brew install node@18
|
||
|
||
# Node.js aktualisieren (Windows)
|
||
# Download von https://nodejs.org/
|
||
```
|
||
|
||
### npm install schlägt fehl
|
||
|
||
**Symptome:**
|
||
- Permission denied
|
||
- ENOENT Fehler
|
||
- Network timeout
|
||
|
||
**Lösungen:**
|
||
```bash
|
||
# Berechtigungen prüfen
|
||
sudo chown -R $(whoami) ~/.npm
|
||
|
||
# Cache leeren
|
||
npm cache clean --force
|
||
|
||
# Registry wechseln
|
||
npm config set registry https://registry.npmjs.org/
|
||
|
||
# Mit sudo installieren (nicht empfohlen)
|
||
sudo npm install
|
||
```
|
||
|
||
### PostgreSQL nicht installiert
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: connect ECONNREFUSED 127.0.0.1:5432
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# PostgreSQL installieren (Ubuntu/Debian)
|
||
sudo apt update
|
||
sudo apt install postgresql postgresql-contrib
|
||
|
||
# PostgreSQL starten
|
||
sudo systemctl start postgresql
|
||
sudo systemctl enable postgresql
|
||
|
||
# Benutzer erstellen
|
||
sudo -u postgres createuser --interactive
|
||
sudo -u postgres createdb ninjaserver
|
||
```
|
||
|
||
### Umgebungsvariablen fehlen
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: Missing required environment variable: DB_HOST
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# .env-Datei erstellen
|
||
cp .env.example .env
|
||
|
||
# .env-Datei bearbeiten
|
||
nano .env
|
||
|
||
# Beispiel-Inhalt:
|
||
DB_HOST=localhost
|
||
DB_PORT=5432
|
||
DB_NAME=ninjaserver
|
||
DB_USER=username
|
||
DB_PASSWORD=password
|
||
JWT_SECRET=your-secret-key
|
||
```
|
||
|
||
## 🗄️ Datenbank
|
||
|
||
### Datenbank existiert nicht
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: database "ninjaserver" does not exist
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Datenbank erstellen
|
||
sudo -u postgres createdb ninjaserver
|
||
|
||
# Oder mit psql
|
||
psql -U postgres -c "CREATE DATABASE ninjaserver;"
|
||
```
|
||
|
||
### Tabellen fehlen
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: relation "players" does not exist
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Datenbank initialisieren
|
||
npm run init-db
|
||
|
||
# Oder manuell
|
||
psql -d ninjaserver -f scripts/init-db.js
|
||
```
|
||
|
||
### Verbindungslimit erreicht
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: too many connections
|
||
```
|
||
|
||
**Lösung:**
|
||
```sql
|
||
-- Aktive Verbindungen prüfen
|
||
SELECT count(*) FROM pg_stat_activity;
|
||
|
||
-- Verbindungen beenden
|
||
SELECT pg_terminate_backend(pid)
|
||
FROM pg_stat_activity
|
||
WHERE state = 'idle' AND query_start < NOW() - INTERVAL '5 minutes';
|
||
|
||
-- Verbindungslimit erhöhen
|
||
ALTER SYSTEM SET max_connections = 200;
|
||
SELECT pg_reload_conf();
|
||
```
|
||
|
||
### Datenbank-Corruption
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: database is not accepting commands
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Datenbank reparieren
|
||
pg_ctl stop
|
||
pg_ctl start -D /var/lib/postgresql/data
|
||
|
||
# Vakuum durchführen
|
||
psql -d ninjaserver -c "VACUUM FULL;"
|
||
|
||
# Backup wiederherstellen
|
||
psql -d ninjaserver < backup.sql
|
||
```
|
||
|
||
## 🌐 API
|
||
|
||
### 401 Unauthorized
|
||
|
||
**Symptom:**
|
||
```
|
||
{"success": false, "message": "API-Key erforderlich"}
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# API-Key generieren
|
||
curl -X POST http://localhost:3000/api/v1/web/generate-api-key \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"description": "Test Key"}'
|
||
|
||
# API-Key verwenden
|
||
curl -H "Authorization: Bearer YOUR_API_KEY" \
|
||
http://localhost:3000/api/v1/private/locations
|
||
```
|
||
|
||
### 403 Forbidden
|
||
|
||
**Symptom:**
|
||
```
|
||
{"success": false, "message": "Keine Berechtigung"}
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Admin-Token verwenden
|
||
curl -H "Authorization: Bearer ADMIN_TOKEN" \
|
||
http://localhost:3000/api/v1/admin/players
|
||
|
||
# Oder API-Key mit Admin-Rechten generieren
|
||
```
|
||
|
||
### 404 Not Found
|
||
|
||
**Symptom:**
|
||
```
|
||
{"success": false, "message": "Ressource nicht gefunden"}
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Korrekte URL verwenden
|
||
curl http://localhost:3000/api/v1/public/locations
|
||
|
||
# Endpoint-Liste prüfen
|
||
curl http://localhost:3000/api-docs
|
||
```
|
||
|
||
### 500 Internal Server Error
|
||
|
||
**Symptom:**
|
||
```
|
||
{"success": false, "message": "Internal Server Error"}
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Logs prüfen
|
||
tail -f logs/server.log
|
||
|
||
# Datenbank-Verbindung prüfen
|
||
psql -d ninjaserver -c "SELECT NOW();"
|
||
|
||
# Server neu starten
|
||
npm restart
|
||
```
|
||
|
||
### CORS-Fehler
|
||
|
||
**Symptom:**
|
||
```
|
||
Access to fetch at 'http://localhost:3000/api' from origin 'http://localhost:8080' has been blocked by CORS policy
|
||
```
|
||
|
||
**Lösung:**
|
||
```javascript
|
||
// CORS-Middleware konfigurieren
|
||
app.use(cors({
|
||
origin: ['http://localhost:8080', 'https://yourdomain.com'],
|
||
credentials: true
|
||
}));
|
||
```
|
||
|
||
## 🏆 Achievements
|
||
|
||
### Achievements werden nicht vergeben
|
||
|
||
**Symptom:**
|
||
- Spieler erfüllt Bedingungen, aber erhält kein Achievement
|
||
- Tägliche Prüfung läuft nicht
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Tägliche Prüfung manuell ausführen
|
||
node scripts/daily_achievements.js
|
||
|
||
# Cron-Job prüfen
|
||
node scripts/setup_cron.js status
|
||
|
||
# Cron-Job einrichten
|
||
node scripts/setup_cron.js setup
|
||
|
||
# Logs prüfen
|
||
tail -f /var/log/ninjaserver_achievements.log
|
||
```
|
||
|
||
### Achievement-Daten korrupt
|
||
|
||
**Symptom:**
|
||
- Achievements werden mehrfach vergeben
|
||
- Falsche Fortschrittswerte
|
||
|
||
**Lösung:**
|
||
```sql
|
||
-- Doppelte Achievements entfernen
|
||
DELETE FROM player_achievements
|
||
WHERE id NOT IN (
|
||
SELECT MIN(id)
|
||
FROM player_achievements
|
||
GROUP BY player_id, achievement_id
|
||
);
|
||
|
||
-- Fortschritt zurücksetzen
|
||
UPDATE player_achievements
|
||
SET progress = 0, is_completed = false
|
||
WHERE is_completed = false;
|
||
```
|
||
|
||
### Tägliche Prüfung schlägt fehl
|
||
|
||
**Symptom:**
|
||
```
|
||
Error: Daily achievement check failed
|
||
```
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Logs analysieren
|
||
grep "ERROR" /var/log/ninjaserver_achievements.log
|
||
|
||
# Datenbank-Verbindung prüfen
|
||
psql -d ninjaserver -c "SELECT NOW();"
|
||
|
||
# Berechtigungen prüfen
|
||
ls -la /var/log/ninjaserver_achievements.log
|
||
|
||
# Script manuell ausführen
|
||
node scripts/daily_achievements.js
|
||
```
|
||
|
||
## 📊 Performance
|
||
|
||
### Langsame API-Antworten
|
||
|
||
**Symptom:**
|
||
- API-Antworten dauern > 5 Sekunden
|
||
- Timeout-Fehler
|
||
|
||
**Lösung:**
|
||
```sql
|
||
-- Indizes prüfen
|
||
SELECT schemaname, tablename, indexname, idx_scan
|
||
FROM pg_stat_user_indexes
|
||
ORDER BY idx_scan DESC;
|
||
|
||
-- Langsame Queries identifizieren
|
||
SELECT query, calls, total_time, mean_time
|
||
FROM pg_stat_statements
|
||
ORDER BY mean_time DESC LIMIT 10;
|
||
|
||
-- Indizes hinzufügen
|
||
CREATE INDEX CONCURRENTLY idx_times_player_created
|
||
ON times(player_id, created_at DESC);
|
||
```
|
||
|
||
### Hohe CPU-Last
|
||
|
||
**Symptom:**
|
||
- Server verbraucht > 80% CPU
|
||
- Langsame Antwortzeiten
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Prozesse prüfen
|
||
top -p $(pgrep node)
|
||
|
||
# Speicher prüfen
|
||
free -h
|
||
|
||
# Datenbank-Verbindungen prüfen
|
||
psql -d ninjaserver -c "SELECT count(*) FROM pg_stat_activity;"
|
||
|
||
# Vakuum durchführen
|
||
psql -d ninjaserver -c "VACUUM ANALYZE;"
|
||
```
|
||
|
||
### Speicher-Leaks
|
||
|
||
**Symptom:**
|
||
- Speicherverbrauch steigt kontinuierlich
|
||
- Server stürzt ab
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Speicher-Usage prüfen
|
||
ps aux | grep node
|
||
|
||
# Server neu starten
|
||
pm2 restart ninjaserver
|
||
|
||
# Oder mit systemd
|
||
sudo systemctl restart ninjaserver
|
||
```
|
||
|
||
## 🔒 Sicherheit
|
||
|
||
### Schwache Passwörter
|
||
|
||
**Symptom:**
|
||
- Standardpasswörter in Produktion
|
||
- Sicherheitswarnungen
|
||
|
||
**Lösung:**
|
||
```bash
|
||
# Admin-Passwort ändern
|
||
npm run create-user
|
||
|
||
# Oder direkt in der Datenbank
|
||
psql -d ninjaserver -c "UPDATE adminusers SET password_hash = '\$2b\$10\$...' WHERE username = 'admin';"
|
||
```
|
||
|
||
### API-Key kompromittiert
|
||
|
||
**Symptom:**
|
||
- Unerwartete API-Aufrufe
|
||
- Unbekannte Aktivitäten
|
||
|
||
**Lösung:**
|
||
```sql
|
||
-- API-Key deaktivieren
|
||
UPDATE api_tokens SET is_active = false WHERE token = 'COMPROMISED_TOKEN';
|
||
|
||
-- Neuen API-Key generieren
|
||
-- (über API oder direkt in der Datenbank)
|
||
```
|
||
|
||
### SQL-Injection
|
||
|
||
**Symptom:**
|
||
- Unerwartete Datenbank-Abfragen
|
||
- Fehlerhafte API-Antworten
|
||
|
||
**Lösung:**
|
||
```javascript
|
||
// Parametrisierte Queries verwenden
|
||
const result = await db.query(
|
||
'SELECT * FROM players WHERE id = $1',
|
||
[playerId]
|
||
);
|
||
|
||
// Input-Validierung
|
||
if (!isValidUUID(playerId)) {
|
||
throw new Error('Invalid player ID');
|
||
}
|
||
```
|
||
|
||
## 📱 Frontend
|
||
|
||
### JavaScript-Fehler
|
||
|
||
**Symptom:**
|
||
- Konsole zeigt Fehler
|
||
- Funktionen funktionieren nicht
|
||
|
||
**Lösung:**
|
||
```javascript
|
||
// Browser-Konsole prüfen
|
||
console.error('Error details:', error);
|
||
|
||
// API-Verbindung testen
|
||
fetch('/api/v1/public/locations')
|
||
.then(response => response.json())
|
||
.then(data => console.log(data))
|
||
.catch(error => console.error('API Error:', error));
|
||
```
|
||
|
||
### CORS-Probleme
|
||
|
||
**Symptom:**
|
||
```
|
||
Access to fetch at 'http://localhost:3000/api' from origin 'http://localhost:8080' has been blocked by CORS policy
|
||
```
|
||
|
||
**Lösung:**
|
||
```javascript
|
||
// CORS-Header setzen
|
||
fetch('/api/v1/public/locations', {
|
||
method: 'GET',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
mode: 'cors'
|
||
});
|
||
```
|
||
|
||
### Session-Probleme
|
||
|
||
**Symptom:**
|
||
- Login funktioniert nicht
|
||
- Session wird nicht gespeichert
|
||
|
||
**Lösung:**
|
||
```javascript
|
||
// Session-Cookie prüfen
|
||
document.cookie
|
||
|
||
// Login-Request prüfen
|
||
fetch('/api/v1/public/login', {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
},
|
||
credentials: 'include',
|
||
body: JSON.stringify({
|
||
username: 'admin',
|
||
password: 'admin123'
|
||
})
|
||
});
|
||
```
|
||
|
||
## 🔧 Allgemeine Lösungen
|
||
|
||
### Logs analysieren
|
||
|
||
```bash
|
||
# Server-Logs
|
||
tail -f logs/server.log
|
||
|
||
# Error-Logs
|
||
grep "ERROR" logs/server.log
|
||
|
||
# Achievement-Logs
|
||
tail -f /var/log/ninjaserver_achievements.log
|
||
|
||
# System-Logs
|
||
journalctl -u ninjaserver -f
|
||
```
|
||
|
||
### System-Status prüfen
|
||
|
||
```bash
|
||
# Server-Status
|
||
curl http://localhost:3000/health
|
||
|
||
# Datenbank-Status
|
||
psql -d ninjaserver -c "SELECT NOW();"
|
||
|
||
# Speicher-Status
|
||
free -h
|
||
df -h
|
||
|
||
# Prozess-Status
|
||
ps aux | grep node
|
||
```
|
||
|
||
### Backup wiederherstellen
|
||
|
||
```bash
|
||
# Vollständiges Backup
|
||
psql -d ninjaserver < backup.sql
|
||
|
||
# Nur Daten
|
||
psql -d ninjaserver < data_backup.sql
|
||
|
||
# Nur Schema
|
||
psql -d ninjaserver < schema_backup.sql
|
||
```
|
||
|
||
### System neu starten
|
||
|
||
```bash
|
||
# Mit npm
|
||
npm restart
|
||
|
||
# Mit pm2
|
||
pm2 restart ninjaserver
|
||
|
||
# Mit systemd
|
||
sudo systemctl restart ninjaserver
|
||
|
||
# Mit Docker
|
||
docker restart ninjaserver
|
||
```
|
||
|
||
## 📞 Support kontaktieren
|
||
|
||
Wenn diese Lösungen nicht helfen:
|
||
|
||
1. **Logs sammeln:**
|
||
```bash
|
||
# Alle relevanten Logs
|
||
tail -n 100 logs/server.log > error_log.txt
|
||
tail -n 100 /var/log/ninjaserver_achievements.log >> error_log.txt
|
||
```
|
||
|
||
2. **System-Info sammeln:**
|
||
```bash
|
||
# System-Informationen
|
||
uname -a > system_info.txt
|
||
node --version >> system_info.txt
|
||
npm --version >> system_info.txt
|
||
psql --version >> system_info.txt
|
||
```
|
||
|
||
3. **Problem beschreiben:**
|
||
- Was passiert ist
|
||
- Wann es passiert ist
|
||
- Welche Schritte Sie unternommen haben
|
||
- Fehlermeldungen
|
||
|
||
4. **Support kontaktieren:**
|
||
- E-Mail: support@ninjaparkour.de
|
||
- Issue-System verwenden
|
||
- Logs und System-Info anhängen
|
||
|
||
---
|
||
|
||
**Hinweis:** Diese Anleitung wird regelmäßig aktualisiert. Bei neuen Problemen wenden Sie sich an den Support.
|