mirror of
https://github.com/OHV-IT/collabrix.git
synced 2025-12-15 16:48:36 +01:00
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
This commit is contained in:
parent
b10078dc2e
commit
200579c411
223
teamchat-daemon.sh
Executable file
223
teamchat-daemon.sh
Executable file
@ -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
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user