From 847ba9687005b94769a55224ea3ee0fc6ecda196 Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Tue, 5 May 2026 16:18:10 +0200 Subject: [PATCH] fix(entrypoint): ensure_writable bind-mounts + add log-cleanup (>2d) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - entrypoint.sh: chown → chmod a+rwX → fail-fast met diagnostiek voor AGENT_STATE_DIR en AGENT_LOG_DIR. Lost stille state.json permission denied op QNAP-share op (NAS-ACL blokkeert chown vanuit container). - bin/log-cleanup.sh: nieuwe hard-delete >2d (env-tunable) naast de conservatievere rotate-logs.sh (gzip 24u, delete 30d). - run-agent.sh: roept log-cleanup.sh aan bij startup en elke iteratie. Co-Authored-By: Claude Opus 4.7 (1M context) --- bin/entrypoint.sh | 39 ++++++++++++++++++++++++++++++++------- bin/log-cleanup.sh | 21 +++++++++++++++++++++ bin/run-agent.sh | 2 ++ 3 files changed, 55 insertions(+), 7 deletions(-) create mode 100755 bin/log-cleanup.sh 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