From 200579c41173027c3b1fe07801ffee052a003d1b Mon Sep 17 00:00:00 2001 From: DGSoft Date: Tue, 9 Dec 2025 22:35:55 +0100 Subject: [PATCH] Fix Systemd Service with Dedicated Daemon Script - teamchat-daemon.sh: Systemd-compatible daemon that stays in foreground - Updated teamchat.service to use daemon script - Automatic service restart on failures - Health monitoring every 30 seconds - Proper signal handling for clean shutdown - Systemd journal logging integration --- teamchat-daemon.sh | 223 +++++++++++++++++++++++++++++++++++++++++++++ teamchat.service | 2 +- 2 files changed, 224 insertions(+), 1 deletion(-) create mode 100755 teamchat-daemon.sh diff --git a/teamchat-daemon.sh b/teamchat-daemon.sh new file mode 100755 index 0000000..56571ad --- /dev/null +++ b/teamchat-daemon.sh @@ -0,0 +1,223 @@ +#!/bin/bash + +# Team Chat System - Systemd Daemon +# Läuft als Systemd-Service und hält die Services am Leben + +set -e + +# Konfiguration +PROJECT_DIR="/home/OfficeDesk" +BACKEND_DIR="$PROJECT_DIR/backend" +FRONTEND_DIR="$PROJECT_DIR/frontend" +LOG_DIR="$PROJECT_DIR/logs" + +# PID-Dateien +BACKEND_PID_FILE="$LOG_DIR/backend.pid" +FRONTEND_PID_FILE="$LOG_DIR/frontend.pid" + +# Log-Dateien +BACKEND_LOG="$LOG_DIR/backend.log" +FRONTEND_LOG="$LOG_DIR/frontend.log" + +# Erstelle Log-Verzeichnis falls nicht vorhanden +mkdir -p "$LOG_DIR" + +# Farben für Ausgabe (nur wenn Terminal interaktiv) +if [[ -t 1 ]]; then + RED='\033[0;31m' + GREEN='\033[0;32m' + YELLOW='\033[1;33m' + BLUE='\033[0;34m' + NC='\033[0m' +else + RED='' + GREEN='' + YELLOW='' + BLUE='' + NC='' +fi + +# Hilfsfunktionen +log() { + echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}" >&2 +} + +error() { + echo -e "${RED}[ERROR] $1${NC}" >&2 +} + +warning() { + echo -e "${YELLOW}[WARNING] $1${NC}" >&2 +} + +info() { + echo -e "${BLUE}[INFO] $1${NC}" >&2 +} + +# Prüft ob ein Prozess läuft +is_running() { + local pid_file=$1 + if [[ -f "$pid_file" ]]; then + local pid=$(cat "$pid_file") + if kill -0 "$pid" 2>/dev/null; then + return 0 # Läuft + else + rm -f "$pid_file" # PID-Datei aufräumen + return 1 # Läuft nicht + fi + fi + return 1 # Läuft nicht +} + +# Backend starten +start_backend() { + if is_running "$BACKEND_PID_FILE"; then + warning "Backend läuft bereits (PID: $(cat $BACKEND_PID_FILE))" + return 0 + fi + + log "Starte Backend-Server..." + + cd "$BACKEND_DIR" + + # Starte Backend im Hintergrund + nohup /bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload > "$BACKEND_LOG" 2>&1 & + local backend_pid=$! + + # Warte kurz und prüfe ob der Prozess gestartet ist + sleep 2 + if kill -0 $backend_pid 2>/dev/null; then + echo $backend_pid > "$BACKEND_PID_FILE" + log "✅ Backend gestartet (PID: $backend_pid)" + else + error "Backend konnte nicht gestartet werden" + cat "$BACKEND_LOG" 2>/dev/null || true + return 1 + fi +} + +# Frontend starten +start_frontend() { + if is_running "$FRONTEND_PID_FILE"; then + warning "Frontend läuft bereits (PID: $(cat $FRONTEND_PID_FILE))" + return 0 + fi + + log "Starte Frontend-Server..." + + cd "$FRONTEND_DIR" + + # Starte Frontend im Hintergrund + nohup npm run dev > "$FRONTEND_LOG" 2>&1 & + local frontend_pid=$! + + # Warte kurz und prüfe ob der Prozess gestartet ist + sleep 3 + if kill -0 $frontend_pid 2>/dev/null; then + echo $frontend_pid > "$FRONTEND_PID_FILE" + log "✅ Frontend gestartet (PID: $frontend_pid)" + else + error "Frontend konnte nicht gestartet werden" + cat "$FRONTEND_LOG" 2>/dev/null || true + return 1 + fi +} + +# Backend stoppen +stop_backend() { + if ! is_running "$BACKEND_PID_FILE"; then + return 0 + fi + + local pid=$(cat "$BACKEND_PID_FILE") + log "Stoppe Backend (PID: $pid)..." + + if kill "$pid" 2>/dev/null; then + # Warte bis der Prozess beendet ist + local count=0 + while kill -0 "$pid" 2>/dev/null && [ $count -lt 10 ]; do + sleep 1 + ((count++)) + done + + if kill -0 "$pid" 2>/dev/null; then + kill -9 "$pid" 2>/dev/null || true + fi + + rm -f "$BACKEND_PID_FILE" + log "✅ Backend gestoppt" + else + error "Backend konnte nicht gestoppt werden" + return 1 + fi +} + +# Frontend stoppen +stop_frontend() { + if ! is_running "$FRONTEND_PID_FILE"; then + return 0 + fi + + local pid=$(cat "$FRONTEND_PID_FILE") + log "Stoppe Frontend (PID: $pid)..." + + if kill "$pid" 2>/dev/null; then + # Warte bis der Prozess beendet ist + local count=0 + while kill -0 "$pid" 2>/dev/null && [ $count -lt 10 ]; do + sleep 1 + ((count++)) + done + + if kill -0 "$pid" 2>/dev/null; then + kill -9 "$pid" 2>/dev/null || true + fi + + rm -f "$FRONTEND_PID_FILE" + log "✅ Frontend gestoppt" + else + error "Frontend konnte nicht gestoppt werden" + return 1 + fi +} + +# Signal-Handler für sauberes Beenden +cleanup() { + log "Beende Team Chat System..." + stop_frontend + stop_backend + log "✅ System beendet" + exit 0 +} + +# Signale abfangen +trap cleanup SIGTERM SIGINT + +# Hauptlogik für Systemd +log "Starte Team Chat System als Systemd-Service..." + +# Services starten +start_backend +start_frontend + +log "✅ Team Chat System läuft" +log "📍 Frontend: http://192.168.0.12" +log "📍 Backend: http://localhost:8000" + +# Warte auf Signale (Systemd hält den Prozess am Leben) +while true; do + # Prüfe alle 30 Sekunden ob die Services noch laufen + sleep 30 + + # Backend neu starten falls nötig + if ! is_running "$BACKEND_PID_FILE"; then + warning "Backend ist nicht mehr aktiv, starte neu..." + start_backend + fi + + # Frontend neu starten falls nötig + if ! is_running "$FRONTEND_PID_FILE"; then + warning "Frontend ist nicht mehr aktiv, starte neu..." + start_frontend + fi +done \ No newline at end of file diff --git a/teamchat.service b/teamchat.service index d6dc76e..da4f211 100644 --- a/teamchat.service +++ b/teamchat.service @@ -7,7 +7,7 @@ Requires=network.target Type=simple User=root WorkingDirectory=/home/OfficeDesk -ExecStart=/home/OfficeDesk/service-manager.sh start +ExecStart=/home/OfficeDesk/teamchat-daemon.sh ExecStop=/home/OfficeDesk/service-manager.sh stop Restart=always RestartSec=5