# SingleChat Production Installation

## Voraussetzungen

- Node.js 18 oder höher
- Apache mit mod_ssl und mod_proxy
- SSL-Zertifikat (Let's Encrypt empfohlen)

## Installation

### 1. Abhängigkeiten installieren und Build erstellen

```bash
./install.sh
```

Dieses Skript:
- Installiert alle Node.js-Dependencies
- Baut den Client für Production
- Kopiert die gebauten Dateien nach `docroot/dist`
- Erstellt eine `.env` Datei mit einem zufälligen `SESSION_SECRET`

### 2. .env Datei anpassen

Bearbeite die `.env` Datei und passe `SESSION_SECRET` an (falls noch nicht geschehen):

```bash
nano .env
```

Wichtig: Verwende ein starkes, zufälliges Secret für `SESSION_SECRET`!

### 3. Apache-Konfiguration

Die Apache-Konfiguration sollte bereits vorhanden sein. Stelle sicher, dass sie folgendes enthält:

```apache
<VirtualHost *:443>
    ServerName ypchat.net
    
    # SSL-Konfiguration
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/ypchat.net/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ypchat.net/privkey.pem
    
    # Reverse Proxy zu Node.js
    ProxyPreserveHost On
    ProxyPass / http://localhost:4000/
    ProxyPassReverse / http://localhost:4000/
    
    # WebSocket-Support für Socket.IO
    RewriteEngine on
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule ^/?(.*) "ws://localhost:4000/$1" [P,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName www.ypchat.net

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/ypchat.net/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ypchat.net/privkey.pem

    RewriteEngine On
    RewriteRule ^ https://ypchat.net%{REQUEST_URI} [R=301,L]
</VirtualHost>
```

Wichtig: Die WebSocket-Rewrite-Regeln sind für Socket.IO erforderlich!

Nach Änderungen an der Apache-Konfiguration:

```bash
sudo systemctl reload apache2
```

### 4. Server starten

#### Option A: Manuell

```bash
npm run start:prod
```

#### Option B: Als systemd Service (empfohlen)

```bash
sudo ./install-service.sh
sudo systemctl start singlechat
sudo systemctl enable singlechat
```

### 5. Service-Verwaltung

```bash
# Status prüfen
sudo systemctl status singlechat

# Logs anzeigen
sudo journalctl -u singlechat -f

# Neustart
sudo systemctl restart singlechat

# Stoppen
sudo systemctl stop singlechat
```

## Updates

### Automatisch per Gitea Actions

Der Workflow `.gitea/workflows/deploy.yml` deployt bei jedem Push auf `main` per SSH auf den Produktionsserver, installiert dort das aktuelle Rollout-Skript und startet es.

In Gitea müssen dafür gesetzt sein:

- Repository Variables:
  - `SSH_HOST`: Produktionsserver, z.B. `rv2756.1blu.de`
  - `SSH_PORT`: SSH-Port, z.B. `22`
  - `SSH_USER`: SSH-User für den Deploy
- Repository Secret:
  - `PROD_SSH_KEY_B64`: privater SSH-Key base64-kodiert

Das Rollout-Skript kann bei Bedarf auch manuell installiert und getestet werden:

```bash
sudo install -m 755 scripts/actualize-singlechat.sh /usr/local/bin/actualize-singlechat.sh
```

Das Skript aktualisiert `/opt/ypchat` aus `ssh://git@tsschulz.de:2222/torsten/singlechat`, installiert Dependencies mit `npm ci`, baut den Client, aktualisiert `docroot/dist` und startet `ypchat` neu. Bei Bedarf können `APP_DIR`, `REPO_URL`, `BRANCH` und `SERVICE_NAME` als Environment-Variablen überschrieben werden.

Nach Code-Änderungen:

```bash
# 1. Client neu bauen
npm run build

# 2. Dateien kopieren
cp -r client/dist docroot/

# 3. Server neustarten
sudo systemctl restart singlechat
```

Oder alles in einem Schritt:

```bash
./install.sh && sudo systemctl restart singlechat
```

## Troubleshooting

### Socket.IO-Verbindung schlägt fehl

- Prüfe, ob die WebSocket-Rewrite-Regeln in Apache korrekt sind
- Prüfe die Apache-Logs: `sudo tail -f /var/log/apache2/error.log`
- Prüfe die Server-Logs: `sudo journalctl -u singlechat -f`

### CORS-Fehler

- Stelle sicher, dass die Domain in `server/index.js` korrekt konfiguriert ist
- Prüfe, ob `NODE_ENV=production` gesetzt ist

### Session-Probleme

- Stelle sicher, dass `SESSION_SECRET` in `.env` gesetzt ist
- Prüfe, ob `secure: true` für Cookies in Production aktiviert ist

### Port bereits belegt

```bash
# Prüfe, welcher Prozess Port 4000 verwendet
sudo lsof -i :4000

# Beende den Prozess oder ändere PORT in .env
```

## Umgebungsvariablen

Die folgenden Umgebungsvariablen können in `.env` gesetzt werden:

- `NODE_ENV`: `production` (automatisch gesetzt)
- `PORT`: `4000` (Standard)
- `SESSION_SECRET`: Zufälliges Secret für Sessions (wird von install.sh generiert)

## Sicherheit

- **SESSION_SECRET**: Verwende ein starkes, zufälliges Secret
- **HTTPS**: Stelle sicher, dass SSL/TLS korrekt konfiguriert ist
- **Firewall**: Port 4000 sollte nur von localhost erreichbar sein
- **Updates**: Halte Node.js und alle Dependencies aktuell
