# Deployment-Anleitung: Socket.IO mit SSL

Socket.IO läuft jetzt direkt auf HTTPS-Port 3051 (nicht über Apache-Proxy).

## Schritte nach dem Deployment

### 1. Firewall-Port öffnen

```bash
# UFW (Ubuntu Firewall)
sudo ufw allow 3051/tcp
```

### 2. Apache-Konfiguration aktualisieren

```bash
sudo cp /var/www/tt-tagebuch.de/apache.conf.example /etc/apache2/sites-available/tt-tagebuch.de-le-ssl.conf
sudo systemctl restart apache2
```

### 3. systemd-Service konfigurieren (als www-data)

**WICHTIG:** Der Service sollte als `www-data` laufen, nicht als `nobody`!

```bash
# Service-Datei installieren
sudo cp /var/www/tt-tagebuch.de/tt-tagebuch.service /etc/systemd/system/
sudo systemctl daemon-reload
```

Die Service-Datei konfiguriert:
- User: `www-data` (Standard-Webserver-Benutzer)
- Group: `www-data`
- Port: 3050 (HTTP) und 3051 (HTTPS)

### 4. SSL-Zertifikat-Berechtigungen setzen

**WICHTIG:** Der Node.js-Prozess muss Zugriff auf die SSL-Zertifikate haben!

```bash
cd /var/www/tt-tagebuch.de/backend
chmod +x scripts/fixCertPermissions.sh
sudo ./scripts/fixCertPermissions.sh
```

Dieses Skript:
- Erstellt die Gruppe `ssl-cert` (falls nicht vorhanden)
- Fügt den Service-Benutzer (`www-data`) zur Gruppe hinzu
- Setzt die Berechtigungen für die Zertifikate

### 5. Backend neu starten

**WICHTIG:** Der Backend-Server muss neu gestartet werden, damit der HTTPS-Server auf Port 3051 läuft!

```bash
# Falls als systemd-Service:
sudo systemctl restart tt-tagebuch

# Oder falls als PM2-Prozess:
pm2 restart tt-tagebuch-backend
```

### 6. Prüfen, ob HTTPS-Server läuft

```bash
# Prüfe, ob Port 3051 geöffnet ist
sudo netstat -tlnp | grep 3051
# Oder:
sudo ss -tlnp | grep 3051

# Prüfe Backend-Logs
sudo journalctl -u tt-tagebuch -f
# Oder bei PM2:
pm2 logs tt-tagebuch-backend
```

Du solltest folgende Meldung sehen:
```
🚀 HTTPS-Server für Socket.IO läuft auf Port 3051
```

### 7. Diagnose-Skript ausführen

```bash
cd /var/www/tt-tagebuch.de/backend
node scripts/checkSocketIOServer.js
```

Dieses Skript prüft:
- Ob SSL-Zertifikate existieren
- Ob Port 3051 geöffnet ist
- Ob der Server erreichbar ist

### 8. Testen

Im Browser sollte Socket.IO jetzt direkt zu `wss://tt-tagebuch.de:3051` verbinden.

## Troubleshooting

### Port 3051 ist nicht erreichbar

1. **Prüfe Firewall:**
   ```bash
   sudo ufw status
   sudo ufw allow 3051/tcp
   ```

2. **Prüfe, ob der Server läuft:**
   ```bash
   sudo netstat -tlnp | grep 3051
   sudo ss -tlnp | grep 3051
   ```

3. **Prüfe Backend-Logs auf Fehler:**
   ```bash
   sudo journalctl -u tt-tagebuch -n 50
   # Oder:
   pm2 logs tt-tagebuch-backend --lines 50
   ```

4. **Prüfe, ob HTTPS-Server gestartet wurde:**
   - Suche in den Logs nach: `🚀 HTTPS-Server für Socket.IO läuft auf Port 3051`
   - Falls nicht vorhanden, prüfe auf Fehler: `⚠️  HTTPS-Server konnte nicht gestartet werden`

### SSL-Zertifikat-Fehler / Berechtigungsfehler

**Fehler:** `EACCES: permission denied, open '/etc/letsencrypt/live/tt-tagebuch.de/privkey.pem'`

**Lösung:**
```bash
cd /var/www/tt-tagebuch.de/backend
chmod +x scripts/fixCertPermissions.sh
sudo ./scripts/fixCertPermissions.sh
sudo systemctl restart tt-tagebuch
```

Stelle sicher, dass die Zertifikate existieren:
```bash
ls -la /etc/letsencrypt/live/tt-tagebuch.de/
```

Falls die Zertifikate nicht existieren:
```bash
sudo certbot certonly --standalone -d tt-tagebuch.de
```

### Service läuft als "nobody"

**Problem:** Der Service läuft als `nobody`, was zu eingeschränkt ist.

**Lösung:**
1. Installiere die Service-Datei (siehe Schritt 3)
2. Führe das Berechtigungs-Skript aus (siehe Schritt 4)
3. Starte den Service neu

```bash
# Prüfe aktuellen Service-User
sudo systemctl show -p User tt-tagebuch.service

# Installiere Service-Datei
sudo cp /var/www/tt-tagebuch.de/tt-tagebuch.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl restart tt-tagebuch

# Prüfe, ob jetzt als www-data läuft
sudo systemctl show -p User tt-tagebuch.service
```

### Frontend verbindet nicht

1. **Prüfe Browser-Konsole auf Fehler**
2. **Prüfe, ob `import.meta.env.PROD` korrekt gesetzt ist:**
   - In Produktion sollte die Socket.IO-URL `https://tt-tagebuch.de:3051` sein
   - In Entwicklung sollte sie `http://localhost:3005` sein

3. **Prüfe, ob die Socket.IO-URL korrekt ist:**
   - Öffne Browser-Entwicklertools → Network
   - Suche nach WebSocket-Verbindungen
   - Die URL sollte `wss://tt-tagebuch.de:3051/socket.io/...` sein

### Server lauscht nur auf localhost

Der Server sollte auf `0.0.0.0` lauschen (nicht nur auf `localhost`). 
Dies ist bereits in der Konfiguration eingestellt:
```javascript
httpsServer.listen(httpsPort, '0.0.0.0', () => {
  console.log(`🚀 HTTPS-Server für Socket.IO läuft auf Port ${httpsPort}`);
});
```

Falls der Server trotzdem nicht erreichbar ist, prüfe die Backend-Logs.
