#!/bin/bash
# ============================================
# Docker Cleanup - Disk-Overflow verhindern
# Raeumt alte Images, Container und Volumes auf
# ============================================
# Aufruf:  bash docker-cleanup.sh
# Cron:    0 3 * * 0  bash /opt/scripts/docker-cleanup.sh
# Quelle:  sgit.space/downloads
# ============================================

set -euo pipefail

LOG="/var/log/docker-cleanup.log"

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"; }

if ! command -v docker &> /dev/null; then
    echo "Fehler: Docker nicht installiert."
    exit 1
fi

log "===== Docker Cleanup gestartet ====="

# Disk vor Cleanup
BEFORE=$(docker system df --format '{{.Reclaimable}}' 2>/dev/null | head -1)
log "Speicher rueckgewinnbar: $BEFORE"

# Gestoppte Container entfernen
STOPPED=$(docker ps -aq --filter status=exited | wc -l)
if [ "$STOPPED" -gt 0 ]; then
    docker container prune -f >> "$LOG" 2>&1
    log "Gestoppte Container entfernt: $STOPPED"
fi

# Ungenutzte Images (aelter als 48h)
OLD_IMAGES=$(docker images --filter "dangling=true" -q | wc -l)
docker image prune -af --filter "until=48h" >> "$LOG" 2>&1
log "Alte Images bereinigt (>48h)"

# Ungenutzte Netzwerke
docker network prune -f >> "$LOG" 2>&1
log "Ungenutzte Netzwerke bereinigt"

# Ungenutzte Volumes (VORSICHT: nur dangling!)
DANGLING=$(docker volume ls -qf dangling=true | wc -l)
if [ "$DANGLING" -gt 0 ]; then
    log "WARNUNG: $DANGLING verwaiste Volumes gefunden"
    docker volume ls -f dangling=true --format "  {{.Name}}" | tee -a "$LOG"
    # Auskommentiert fuer Sicherheit - manuell aktivieren:
    # docker volume prune -f >> "$LOG" 2>&1
    log "Volume-Prune ist deaktiviert. Manuell pruefen!"
fi

# Build Cache
docker builder prune -f --filter "until=72h" >> "$LOG" 2>&1
log "Build Cache bereinigt (>72h)"

# Disk nach Cleanup
AFTER=$(df -h / | awk 'NR==2 {print $4 " frei (" $5 " belegt)"}')
log "Disk: $AFTER"

log "===== Docker Cleanup fertig ====="
