Files
INFRAESTRUCTURA/vps/gitea/gitea_watchdog.sh
2026-09-20 12:10:36 +02:00

61 lines
1.8 KiB
Bash

#!/bin/bash
# Vigilante de Gitea (VPS Contabo).
# Si el contenedor no esta sano N veces seguidas, lo recrea desde /root/docker-compose.yml.
# Los datos viven en el bind /root/gitea/data, por lo que recrear NO los toca.
set -u
DOCKER=/usr/bin/docker
COMPOSE_DIR=/root
CONTAINER=gitea
HEALTH_URL=http://127.0.0.1:3000/api/healthz
LOG=/var/log/gitea-watchdog.log
STATE_DIR=/var/lib/gitea-watchdog
STATE=$STATE_DIR/fails
MAX_FAILS=2
mkdir -p "$STATE_DIR"
touch "$STATE"
log() { echo "$(date '+%F %T') $*" >> "$LOG"; }
# Rotar log si crece demasiado (1 MB)
if [ -f "$LOG" ] && [ "$(stat -c%s "$LOG" 2>/dev/null || echo 0)" -gt 1048576 ]; then
mv -f "$LOG" "$LOG.1"
fi
status=$("$DOCKER" inspect "$CONTAINER" --format '{{.State.Status}}' 2>/dev/null || echo missing)
healthy=0
if [ "$status" = "running" ]; then
body=$("$DOCKER" exec "$CONTAINER" wget -qO- --timeout=8 "$HEALTH_URL" 2>/dev/null || true)
if echo "$body" | grep -q '"status": *"pass"'; then
healthy=1
fi
fi
if [ "$healthy" = "1" ]; then
if [ "$(cat "$STATE" 2>/dev/null || echo 0)" != "0" ]; then
log "Gitea vuelve a estar OK (status=$status)."
fi
echo 0 > "$STATE"
exit 0
fi
fails=$(cat "$STATE" 2>/dev/null || echo 0)
case "$fails" in ''|*[!0-9]*) fails=0 ;; esac
fails=$((fails + 1))
echo "$fails" > "$STATE"
log "Gitea NO saludable (status=$status, fallo $fails/$MAX_FAILS)."
if [ "$fails" -ge "$MAX_FAILS" ]; then
log "Recreando contenedor '$CONTAINER' desde $COMPOSE_DIR ..."
cd "$COMPOSE_DIR" || { log "ERROR: no existe $COMPOSE_DIR"; exit 1; }
if "$DOCKER" compose version >/dev/null 2>&1; then
"$DOCKER" compose up -d --force-recreate --no-deps "$CONTAINER" >> "$LOG" 2>&1
else
docker-compose up -d --force-recreate --no-deps "$CONTAINER" >> "$LOG" 2>&1
fi
log "Recreacion lanzada (exit=$?)."
echo 0 > "$STATE"
fi