mirror of
https://git.techniverse.net/scriptos/tmserver-docker.git
synced 2026-07-09 21:47:02 +00:00
Graceful Shutdown: Signal-Handler für sauberes Herunterfahren aller Dienste
This commit is contained in:
@@ -219,4 +219,8 @@ EXPOSE 2350/udp
|
|||||||
EXPOSE 3450/tcp
|
EXPOSE 3450/tcp
|
||||||
EXPOSE 80/tcp
|
EXPOSE 80/tcp
|
||||||
|
|
||||||
|
# Graceful Shutdown: SIGTERM wird vom Signal-Handler im Startscript abgefangen
|
||||||
|
# und alle Dienste (XAseco, TM-Server, Apache) sauber heruntergefahren.
|
||||||
|
STOPSIGNAL SIGTERM
|
||||||
|
|
||||||
CMD ["/opt/tmserver/RunTrackmaniaServer.sh"]
|
CMD ["/opt/tmserver/RunTrackmaniaServer.sh"]
|
||||||
|
|||||||
@@ -1119,5 +1119,92 @@ echo "==> Starte Log-Rotation (stuendlich, groessenbasiert 10 MB)..."
|
|||||||
LOGROTATE_PID=$!
|
LOGROTATE_PID=$!
|
||||||
echo " Log-Rotation gestartet (PID: ${LOGROTATE_PID})"
|
echo " Log-Rotation gestartet (PID: ${LOGROTATE_PID})"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# Graceful Shutdown: Signal-Handler
|
||||||
|
# ============================================================
|
||||||
|
# Faengt SIGTERM/SIGINT ab und beendet alle Dienste sauber in
|
||||||
|
# der richtigen Reihenfolge:
|
||||||
|
# 1. XAseco-Healthcheck (verhindert Neustart waehrend Shutdown)
|
||||||
|
# 2. XAseco (schliesst DB-Connections ordentlich)
|
||||||
|
# 3. TrackmaniaServer
|
||||||
|
# 4. Apache (AdminServ/RemoteCP)
|
||||||
|
# 5. Log-Rotation
|
||||||
|
# Verhindert Datenbank-Korruption beim Container-Stop.
|
||||||
|
# ============================================================
|
||||||
|
graceful_shutdown() {
|
||||||
|
echo ""
|
||||||
|
echo "============================================================"
|
||||||
|
echo "==> Graceful Shutdown eingeleitet (Signal empfangen)..."
|
||||||
|
echo "============================================================"
|
||||||
|
|
||||||
|
# 1. XAseco-Healthcheck beenden (verhindert Neustart waehrend Shutdown)
|
||||||
|
if [ -n "${HEALTHCHECK_PID:-}" ] && kill -0 "$HEALTHCHECK_PID" 2>/dev/null; then
|
||||||
|
echo " Beende XAseco-Healthcheck (PID: ${HEALTHCHECK_PID})..."
|
||||||
|
kill "$HEALTHCHECK_PID" 2>/dev/null
|
||||||
|
wait "$HEALTHCHECK_PID" 2>/dev/null
|
||||||
|
echo " XAseco-Healthcheck beendet."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. XAseco beenden (schliesst DB-Connections ordentlich)
|
||||||
|
XASECO_PID_CURRENT=""
|
||||||
|
if [ -f "/tmp/xaseco.pid" ]; then
|
||||||
|
XASECO_PID_CURRENT=$(cat /tmp/xaseco.pid 2>/dev/null)
|
||||||
|
fi
|
||||||
|
if [ -n "$XASECO_PID_CURRENT" ] && kill -0 "$XASECO_PID_CURRENT" 2>/dev/null; then
|
||||||
|
echo " Beende XAseco (PID: ${XASECO_PID_CURRENT})..."
|
||||||
|
kill "$XASECO_PID_CURRENT" 2>/dev/null
|
||||||
|
# Warte max. 10 Sekunden auf sauberes Beenden
|
||||||
|
WAIT_COUNT=0
|
||||||
|
while kill -0 "$XASECO_PID_CURRENT" 2>/dev/null && [ $WAIT_COUNT -lt 10 ]; do
|
||||||
|
sleep 1
|
||||||
|
WAIT_COUNT=$((WAIT_COUNT + 1))
|
||||||
|
done
|
||||||
|
if kill -0 "$XASECO_PID_CURRENT" 2>/dev/null; then
|
||||||
|
echo " XAseco reagiert nicht, sende SIGKILL..."
|
||||||
|
kill -9 "$XASECO_PID_CURRENT" 2>/dev/null
|
||||||
|
fi
|
||||||
|
echo " XAseco beendet."
|
||||||
|
rm -f /tmp/xaseco.pid
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. TrackmaniaServer beenden
|
||||||
|
if [ -n "${TM_PID:-}" ] && kill -0 "$TM_PID" 2>/dev/null; then
|
||||||
|
echo " Beende TrackmaniaServer (PID: ${TM_PID})..."
|
||||||
|
kill "$TM_PID" 2>/dev/null
|
||||||
|
# Warte max. 10 Sekunden auf sauberes Beenden
|
||||||
|
WAIT_COUNT=0
|
||||||
|
while kill -0 "$TM_PID" 2>/dev/null && [ $WAIT_COUNT -lt 10 ]; do
|
||||||
|
sleep 1
|
||||||
|
WAIT_COUNT=$((WAIT_COUNT + 1))
|
||||||
|
done
|
||||||
|
if kill -0 "$TM_PID" 2>/dev/null; then
|
||||||
|
echo " TrackmaniaServer reagiert nicht, sende SIGKILL..."
|
||||||
|
kill -9 "$TM_PID" 2>/dev/null
|
||||||
|
fi
|
||||||
|
echo " TrackmaniaServer beendet."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Apache beenden (AdminServ/RemoteCP)
|
||||||
|
echo " Beende Apache..."
|
||||||
|
service apache2 stop 2>/dev/null
|
||||||
|
echo " Apache beendet."
|
||||||
|
|
||||||
|
# 5. Log-Rotation beenden
|
||||||
|
if [ -n "${LOGROTATE_PID:-}" ] && kill -0 "$LOGROTATE_PID" 2>/dev/null; then
|
||||||
|
echo " Beende Log-Rotation (PID: ${LOGROTATE_PID})..."
|
||||||
|
kill "$LOGROTATE_PID" 2>/dev/null
|
||||||
|
wait "$LOGROTATE_PID" 2>/dev/null
|
||||||
|
echo " Log-Rotation beendet."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "============================================================"
|
||||||
|
echo "==> Graceful Shutdown abgeschlossen."
|
||||||
|
echo "============================================================"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
trap graceful_shutdown SIGTERM SIGINT
|
||||||
|
echo "==> Signal-Handler registriert (SIGTERM/SIGINT -> Graceful Shutdown)"
|
||||||
|
|
||||||
# Auf TrackmaniaServer warten (Hauptprozess)
|
# Auf TrackmaniaServer warten (Hauptprozess)
|
||||||
wait $TM_PID
|
wait $TM_PID
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ services:
|
|||||||
context: .
|
context: .
|
||||||
container_name: tmserver
|
container_name: tmserver
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
stop_grace_period: 30s
|
||||||
depends_on:
|
depends_on:
|
||||||
mariadb:
|
mariadb:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@
|
|||||||
| Dokument | Beschreibung |
|
| Dokument | Beschreibung |
|
||||||
|----------|-------------|
|
|----------|-------------|
|
||||||
| [Schnellstart](schnellstart.md) | Erste Schritte und minimale Konfiguration |
|
| [Schnellstart](schnellstart.md) | Erste Schritte und minimale Konfiguration |
|
||||||
| [Konfiguration](konfiguration.md) | Persistente Serverkonfiguration (dedicated_cfg.txt) |
|
| [Konfiguration](konfiguration.md) | Persistente Serverkonfiguration (dedicated_cfg.txt), Graceful Shutdown |
|
||||||
| [Umgebungsvariablen](umgebungsvariablen.md) | Alle verfügbaren Umgebungsvariablen |
|
| [Umgebungsvariablen](umgebungsvariablen.md) | Alle verfügbaren Umgebungsvariablen |
|
||||||
| [Server-Modi](server-modi.md) | LAN- und Internet-Dedicated-Modus |
|
| [Server-Modi](server-modi.md) | LAN- und Internet-Dedicated-Modus |
|
||||||
| [AdminServ](adminserv.md) | Einrichtung der Server-Verwaltungsoberfläche |
|
| [AdminServ](adminserv.md) | Einrichtung der Server-Verwaltungsoberfläche |
|
||||||
|
|||||||
@@ -106,6 +106,22 @@ Der Ordner `GameData/Config/` enthält:
|
|||||||
| `Default.SystemConfig.Gbx` | System-Konfiguration |
|
| `Default.SystemConfig.Gbx` | System-Konfiguration |
|
||||||
| `AdminServ/ServerOptions/` | Von AdminServ exportierte Server-Einstellungen |
|
| `AdminServ/ServerOptions/` | Von AdminServ exportierte Server-Einstellungen |
|
||||||
|
|
||||||
|
## Graceful Shutdown
|
||||||
|
|
||||||
|
Beim Stoppen des Containers (`docker compose stop`, `docker compose down` oder `docker stop`) werden alle Dienste **sauber und in der richtigen Reihenfolge** heruntergefahren:
|
||||||
|
|
||||||
|
1. **XAseco-Healthcheck** – wird zuerst beendet, damit XAseco nicht während des Shutdowns neu gestartet wird
|
||||||
|
2. **XAseco** – beendet sich ordentlich und schließt alle Datenbank-Connections (verhindert DB-Korruption)
|
||||||
|
3. **TrackmaniaServer** – der Spielserver wird sauber gestoppt
|
||||||
|
4. **Apache** – AdminServ und RemoteCP werden beendet
|
||||||
|
5. **Log-Rotation** – Hintergrundprozess wird gestoppt
|
||||||
|
|
||||||
|
Jeder Dienst hat maximal 10 Sekunden Zeit, sich sauber zu beenden. Falls ein Prozess nicht reagiert, wird er zwangsweise beendet (SIGKILL). Die `stop_grace_period` in der `docker-compose.yml` ist auf 30 Sekunden gesetzt, um genügend Zeit für den gesamten Shutdown-Prozess zu geben.
|
||||||
|
|
||||||
|
Der Shutdown-Fortschritt wird in der Konsole protokolliert und kann mit `docker logs tmserver` nachvollzogen werden.
|
||||||
|
|
||||||
|
> **Hinweis:** Der Graceful Shutdown ist nach einem Image-Update automatisch aktiv – auch bei bestehenden Installationen. Es sind keine manuellen Schritte nötig.
|
||||||
|
|
||||||
## Log-Rotation
|
## Log-Rotation
|
||||||
|
|
||||||
Alle Log-Dateien im Container werden automatisch per `logrotate` rotiert, damit sie nicht unbegrenzt wachsen. Die Rotation läuft **größenbasiert** als Hintergrundprozess (stündliche Prüfung, kein Cron nötig).
|
Alle Log-Dateien im Container werden automatisch per `logrotate` rotiert, damit sie nicht unbegrenzt wachsen. Die Rotation läuft **größenbasiert** als Hintergrundprozess (stündliche Prüfung, kein Cron nötig).
|
||||||
|
|||||||
Reference in New Issue
Block a user