Update Socket.IO deployment documentation and fixCertPermissions.sh script for improved service user configuration

This commit enhances the Socket.IO deployment documentation by adding a new section on configuring the systemd service to run as `www-data`, ensuring proper permissions for SSL certificate access. It also updates the fixCertPermissions.sh script to handle cases where the service user is not defined or is set to `nobody`, defaulting to `www-data` and verifying its existence. These changes improve the overall security and functionality of the deployment process.
This commit is contained in:
Torsten Schulz (local)
2025-11-16 09:50:26 +01:00
parent 56c708d3a0
commit a81c3453b5
3 changed files with 85 additions and 10 deletions

View File

@@ -18,7 +18,22 @@ sudo cp /var/www/tt-tagebuch.de/apache.conf.example /etc/apache2/sites-available
sudo systemctl restart apache2
```
### 3. SSL-Zertifikat-Berechtigungen setzen
### 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!
@@ -30,10 +45,10 @@ sudo ./scripts/fixCertPermissions.sh
Dieses Skript:
- Erstellt die Gruppe `ssl-cert` (falls nicht vorhanden)
- Fügt den Service-Benutzer zur Gruppe hinzu
- Fügt den Service-Benutzer (`www-data`) zur Gruppe hinzu
- Setzt die Berechtigungen für die Zertifikate
### 4. Backend neu starten
### 5. Backend neu starten
**WICHTIG:** Der Backend-Server muss neu gestartet werden, damit der HTTPS-Server auf Port 3051 läuft!
@@ -45,7 +60,7 @@ sudo systemctl restart tt-tagebuch
pm2 restart tt-tagebuch-backend
```
### 5. Prüfen, ob HTTPS-Server läuft
### 6. Prüfen, ob HTTPS-Server läuft
```bash
# Prüfe, ob Port 3051 geöffnet ist
@@ -54,7 +69,7 @@ sudo netstat -tlnp | grep 3051
sudo ss -tlnp | grep 3051
# Prüfe Backend-Logs
sudo journalctl -u tt-tagebuch-backend -f
sudo journalctl -u tt-tagebuch -f
# Oder bei PM2:
pm2 logs tt-tagebuch-backend
```
@@ -64,7 +79,7 @@ Du solltest folgende Meldung sehen:
🚀 HTTPS-Server für Socket.IO läuft auf Port 3051
```
### 6. Diagnose-Skript ausführen
### 7. Diagnose-Skript ausführen
```bash
cd /var/www/tt-tagebuch.de/backend
@@ -76,7 +91,7 @@ Dieses Skript prüft:
- Ob Port 3051 geöffnet ist
- Ob der Server erreichbar ist
### 7. Testen
### 8. Testen
Im Browser sollte Socket.IO jetzt direkt zu `wss://tt-tagebuch.de:3051` verbinden.
@@ -98,7 +113,7 @@ Im Browser sollte Socket.IO jetzt direkt zu `wss://tt-tagebuch.de:3051` verbinde
3. **Prüfe Backend-Logs auf Fehler:**
```bash
sudo journalctl -u tt-tagebuch-backend -n 50
sudo journalctl -u tt-tagebuch -n 50
# Oder:
pm2 logs tt-tagebuch-backend --lines 50
```
@@ -129,6 +144,28 @@ Falls die Zertifikate nicht existieren:
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**

View File

@@ -20,9 +20,17 @@ fi
# Prüfe, welcher Benutzer den systemd-Service ausführt
SERVICE_USER=$(sudo systemctl show -p User tt-tagebuch.service 2>/dev/null | cut -d= -f2)
if [ -z "$SERVICE_USER" ]; then
echo "⚠️ Konnte Service-Benutzer nicht ermitteln. Verwende 'www-data' als Standard."
# Wenn kein User definiert ist oder "nobody", verwende www-data
if [ -z "$SERVICE_USER" ] || [ "$SERVICE_USER" = "nobody" ]; then
echo "⚠️ Service-Benutzer ist '$SERVICE_USER' oder nicht definiert."
echo " Verwende 'www-data' als Standard (empfohlen für Webserver-Services)."
SERVICE_USER="www-data"
# Prüfe, ob www-data existiert
if ! id "$SERVICE_USER" &>/dev/null; then
echo "❌ Benutzer '$SERVICE_USER' existiert nicht!"
exit 1
fi
fi
echo "🔧 Konfiguriere SSL-Zertifikat-Berechtigungen..."

30
tt-tagebuch.service Normal file
View File

@@ -0,0 +1,30 @@
[Unit]
Description=TT-Tagebuch Node.js Service
After=network.target mysql.service
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/tt-tagebuch.de/backend
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=tt-tagebuch
# Umgebungsvariablen
Environment=NODE_ENV=production
# PORT: HTTP-Server für API (wird von Apache auf Port 443 proxied)
Environment=PORT=3050
# HTTPS_PORT: HTTPS-Server für Socket.IO (direkt erreichbar auf Port 3051)
Environment=HTTPS_PORT=3051
# Sicherheit
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target