scrum4me-docker/bin/entrypoint.sh
janpeter visser 47b1de93db fix: lokale Docker build werkend krijgen
Drie fixes om de container lokaal (en op de NAS) te kunnen builden en draaien:

- Dockerfile: clone scrum4me-mcp zonder --recurse-submodules. De Prisma-
  schema zit al gecommit in het scrum4me-mcp repo; de vendor/scrum4me
  submodule is alleen nodig voor schema-updates en wijst naar een
  privaat repo dat tijdens docker build niet bereikbaar is.

- Dockerfile: voeg /usr/sbin en /sbin toe aan PATH zodat gosu (in
  /usr/sbin/gosu na apt-install) gevonden wordt door entrypoint.sh.
  Zonder dit faalt de container in een restart loop.

- Verplaats alle runner scripts naar bin/ en maak etc/ aan, zodat
  COPY bin/ en COPY etc/ in de Dockerfile bestanden vinden.

Verder:
- .gitattributes om CRLF-corruptie van shell scripts op Windows te
  voorkomen (core.autocrlf=true is default actief).
- .gitignore: docker-compose.override.yml uitsluiten zodat lokale
  dev-overrides niet worden gecommit.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-02 19:18:35 +02:00

66 lines
2 KiB
Bash

#!/usr/bin/env bash
# entrypoint.sh — container-startup
#
# Verantwoordelijkheden:
# 1. Schrijfbare dirs op de bind-mounts garanderen (UID/GID matching)
# 2. Health-server starten als achtergrondproces
# 3. gosu naar de agent-user en daemon-loop starten
#
# Loopt als root tot stap 3 — daarvoor hebben we root nodig om
# bind-mounts goed te zetten als de share met andere ownership is
# aangemaakt.
set -euo pipefail
log() { printf '[entrypoint] %s\n' "$*" >&2; }
: "${AGENT_UID:=1000}"
: "${AGENT_GID:=1000}"
: "${AGENT_STATE_DIR:=/var/run/agent}"
: "${AGENT_LOG_DIR:=/var/log/agent}"
: "${AGENT_REPO_CACHE:=/var/cache/repos}"
: "${AGENT_HEALTH_PORT:=8080}"
# ----- 1. dirs op bind-mounts -------------------------------------------
log "ensuring directories on bind-mounts"
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}" \
/var/cache/npm \
/var/cache/pnpm 2>/dev/null || true
# ----- 2. health-server in de achtergrond -------------------------------
log "starting health-server on :${AGENT_HEALTH_PORT}"
gosu agent node /opt/agent/bin/health-server.js \
> "${AGENT_LOG_DIR}/health-server.log" 2>&1 &
HEALTH_PID=$!
log "health-server pid=${HEALTH_PID}"
# Initial state: starting
gosu agent /bin/bash -c 'cat > "${AGENT_STATE_DIR}/state.json"' <<EOF
{
"status": "starting",
"startedAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"lastBatchAt": null,
"lastBatchExit": null,
"consecutiveFailures": 0
}
EOF
# ----- 3. drop privileges en start daemon-loop --------------------------
log "dropping to agent user and starting run-agent.sh"
exec gosu agent /opt/agent/bin/run-agent.sh