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:
parent
135ae2c2a2
commit
847ba96870
3 changed files with 55 additions and 7 deletions
|
|
@ -46,20 +46,45 @@ fi
|
||||||
|
|
||||||
# ----- 1. dirs op bind-mounts -------------------------------------------
|
# ----- 1. dirs op bind-mounts -------------------------------------------
|
||||||
log "ensuring directories on 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 \
|
mkdir -p \
|
||||||
"${AGENT_STATE_DIR}" \
|
|
||||||
"${AGENT_LOG_DIR}/runs" \
|
"${AGENT_LOG_DIR}/runs" \
|
||||||
"${AGENT_LOG_DIR}/jobs" \
|
"${AGENT_LOG_DIR}/jobs" \
|
||||||
"${AGENT_REPO_CACHE}" \
|
"${AGENT_REPO_CACHE}" \
|
||||||
/var/cache/npm \
|
/var/cache/npm \
|
||||||
/var/cache/pnpm
|
/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}" \
|
chown "${AGENT_UID}:${AGENT_GID}" \
|
||||||
"${AGENT_STATE_DIR}" \
|
|
||||||
"${AGENT_LOG_DIR}" \
|
|
||||||
"${AGENT_LOG_DIR}/runs" \
|
"${AGENT_LOG_DIR}/runs" \
|
||||||
"${AGENT_LOG_DIR}/jobs" \
|
"${AGENT_LOG_DIR}/jobs" \
|
||||||
"${AGENT_REPO_CACHE}" \
|
"${AGENT_REPO_CACHE}" \
|
||||||
|
|
|
||||||
21
bin/log-cleanup.sh
Executable file
21
bin/log-cleanup.sh
Executable 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
|
||||||
|
|
@ -38,6 +38,7 @@ rm -f "${AGENT_STATE_DIR}/UNHEALTHY" "${AGENT_STATE_DIR}/TOKEN_EXPIRED"
|
||||||
|
|
||||||
# Log-rotation eenmaal aan het begin, daarna elke iteratie.
|
# Log-rotation eenmaal aan het begin, daarna elke iteratie.
|
||||||
/opt/agent/bin/rotate-logs.sh || true
|
/opt/agent/bin/rotate-logs.sh || true
|
||||||
|
/opt/agent/bin/log-cleanup.sh || true
|
||||||
|
|
||||||
# ----- seed prompt ------------------------------------------------------
|
# ----- 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.'
|
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
|
fi
|
||||||
|
|
||||||
/opt/agent/bin/rotate-logs.sh || true
|
/opt/agent/bin/rotate-logs.sh || true
|
||||||
|
/opt/agent/bin/log-cleanup.sh || true
|
||||||
done
|
done
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue