#!/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