diff --git a/bin/entrypoint.sh b/bin/entrypoint.sh index 7f9fcd6..1f35587 100644 --- a/bin/entrypoint.sh +++ b/bin/entrypoint.sh @@ -46,20 +46,45 @@ fi # ----- 1. dirs op bind-mounts ------------------------------------------- log "ensuring directories on bind-mounts" + +# Helper: garandeer dat $1 schrijfbaar is voor de agent-user. +# Escalatie: chown → chmod a+rwX → fail-fast met diagnostiek. +# Nodig omdat bind-mounts vanaf de NAS-share de Dockerfile-chown +# overschrijven en QNAP-ACLs een tweede chown vaak blokkeren. +ensure_writable() { + local dir="$1" + mkdir -p "$dir" + chown "${AGENT_UID}:${AGENT_GID}" "$dir" 2>/dev/null || true + if gosu agent test -w "$dir"; then + log "$dir OK (writable als UID=${AGENT_UID})" + return 0 + fi + chmod a+rwX "$dir" 2>/dev/null || true + if gosu agent test -w "$dir"; then + log "WARN: $dir was niet writable — chmod a+rwX toegepast" + return 0 + fi + log "FATAL: $dir niet writable als UID=${AGENT_UID}" + log " huidige stat: $(stat -c '%U:%G %a' "$dir" 2>/dev/null || echo '')" + log " fix op de NAS-host:" + log " chown -R ${AGENT_UID}:${AGENT_GID} " + log " of: chmod -R 0775 " + log " (zie docker-compose.yml volumes-mapping voor het host-pad)" + exit 1 +} + +ensure_writable "${AGENT_STATE_DIR}" +ensure_writable "${AGENT_LOG_DIR}" + +# Sub-dirs en cache-paden — niet kritiek genoeg voor fail-fast; chown +# best-effort. /var/cache writability is al boven gecheckt. mkdir -p \ - "${AGENT_STATE_DIR}" \ "${AGENT_LOG_DIR}/runs" \ "${AGENT_LOG_DIR}/jobs" \ "${AGENT_REPO_CACHE}" \ /var/cache/npm \ /var/cache/pnpm - -# Alleen ownership corrigeren als de share als andere user is aangemaakt -# — niet recursief op /var/cache/repos want dat kan groot zijn en de -# eerste boot vertragen. chown "${AGENT_UID}:${AGENT_GID}" \ - "${AGENT_STATE_DIR}" \ - "${AGENT_LOG_DIR}" \ "${AGENT_LOG_DIR}/runs" \ "${AGENT_LOG_DIR}/jobs" \ "${AGENT_REPO_CACHE}" \ diff --git a/bin/log-cleanup.sh b/bin/log-cleanup.sh new file mode 100755 index 0000000..dbd8a0d --- /dev/null +++ b/bin/log-cleanup.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# log-cleanup.sh — verwijder log-bestanden ouder dan N dagen +# +# Default 2 dagen. Override via env AGENT_LOG_HARD_DELETE_DAYS. +# Werkt op alles onder ${AGENT_LOG_DIR} (runs/, jobs/, *.log, +# health-server.log, repo-bootstrap.log). +# +# Loopt parallel aan rotate-logs.sh (compressie + 30d delete) en is +# bewust apart zodat de gzip-rotatie onafhankelijk blijft van de +# hard delete. + +set -uo pipefail + +: "${AGENT_LOG_DIR:=/var/log/agent}" +: "${AGENT_LOG_HARD_DELETE_DAYS:=2}" + +find "${AGENT_LOG_DIR}" -type f \ + \( -name '*.log' -o -name '*.log.gz' -o -name '*.txt' -o -name '*.json' \) \ + -mtime "+${AGENT_LOG_HARD_DELETE_DAYS}" -delete 2>/dev/null || true + +find "${AGENT_LOG_DIR}/jobs" -mindepth 1 -type d -empty -delete 2>/dev/null || true diff --git a/bin/run-agent.sh b/bin/run-agent.sh index 26a60f1..d392c9c 100644 --- a/bin/run-agent.sh +++ b/bin/run-agent.sh @@ -38,6 +38,7 @@ rm -f "${AGENT_STATE_DIR}/UNHEALTHY" "${AGENT_STATE_DIR}/TOKEN_EXPIRED" # Log-rotation eenmaal aan het begin, daarna elke iteratie. /opt/agent/bin/rotate-logs.sh || true +/opt/agent/bin/log-cleanup.sh || true # ----- seed prompt ------------------------------------------------------ SEED_PROMPT='Pak de volgende job uit de Scrum4Me-queue en draai de queue leeg volgens de loop in /opt/agent/CLAUDE.md. Niet stoppen tussen jobs door. Sluit pas af zodra wait_for_job na de volledige block-time terugkomt zonder claim.' @@ -125,4 +126,5 @@ while true; do fi /opt/agent/bin/rotate-logs.sh || true + /opt/agent/bin/log-cleanup.sh || true done