From a81c3453b5ed8dde2282ac73d6da934e6b834026 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sun, 16 Nov 2025 09:50:26 +0100 Subject: [PATCH] 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. --- DEPLOYMENT_SOCKET_IO.md | 53 +++++++++++++++++++++++---- backend/scripts/fixCertPermissions.sh | 12 +++++- tt-tagebuch.service | 30 +++++++++++++++ 3 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 tt-tagebuch.service diff --git a/DEPLOYMENT_SOCKET_IO.md b/DEPLOYMENT_SOCKET_IO.md index e284034..0a4c9b6 100644 --- a/DEPLOYMENT_SOCKET_IO.md +++ b/DEPLOYMENT_SOCKET_IO.md @@ -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** diff --git a/backend/scripts/fixCertPermissions.sh b/backend/scripts/fixCertPermissions.sh index 4c5a45d..d619c59 100755 --- a/backend/scripts/fixCertPermissions.sh +++ b/backend/scripts/fixCertPermissions.sh @@ -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..." diff --git a/tt-tagebuch.service b/tt-tagebuch.service new file mode 100644 index 0000000..1cb3273 --- /dev/null +++ b/tt-tagebuch.service @@ -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 +