fix(entrypoint): ensure_writable bind-mounts + add log-cleanup (>2d)

- 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) <noreply@anthropic.com>
This commit is contained in:
Madhura68 2026-05-05 16:18:10 +02:00
parent 135ae2c2a2
commit 847ba96870
3 changed files with 55 additions and 7 deletions

View file

@ -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 '<onbekend>')"
log " fix op de NAS-host:"
log " chown -R ${AGENT_UID}:${AGENT_GID} <host-pad voor $dir>"
log " of: chmod -R 0775 <host-pad voor $dir>"
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}" \

21
bin/log-cleanup.sh Executable file
View file

@ -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

View file

@ -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