61 lines
1.8 KiB
Bash
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
|