feat: publish CodexPi contest snapshot
Some checks are pending
Qualité / tests (push) Waiting to run

This commit is contained in:
CodexPi
2026-11-14 20:23:59 +01:00
commit 995b17a6e2
295 changed files with 36803 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
#!/usr/bin/env bash
set -euo pipefail
BASE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
API_CONTAINER="${CODEXPI_API_CONTAINER:-codexpi-api-1}"
DOCKER_SOCKET="/var/run/docker.sock"
command -v docker >/dev/null 2>&1 || {
echo "Docker est introuvable ; contrôle d’accès ignoré." >&2
exit 0
}
if [[ ! -S "$DOCKER_SOCKET" ]]; then
echo "Le socket Docker n’est pas disponible ; un prochain contrôle réessaiera."
exit 0
fi
if ! docker info >/dev/null 2>&1; then
echo "Le service de contrôle n’accède pas au daemon Docker." >&2
exit 1
fi
socket_gid="$(stat -c '%g' "$DOCKER_SOCKET")"
repair_api() {
local api_container="$1"
local stack_base="$2"
# Do not start a stack that an administrator deliberately stopped.
if ! docker inspect "$api_container" >/dev/null 2>&1; then
echo "Le conteneur $api_container est arrêté ou absent ; aucune action."
return 0
fi
local container_groups
container_groups="$(docker inspect --format '{{json .HostConfig.GroupAdd}}' "$api_container")"
if [[ "$container_groups" == *\"$socket_gid\"* ]]; then
return 0
fi
# Never interrupt a coding or host-agent task merely to refresh Docker
# access. The timer will retry after the worker exits.
if docker top "$api_container" -eo pid,args 2>/dev/null | grep -Eq 'codexpi\.session_worker|codexpi\.host_session_worker|/codex .* exec'; then
echo "Accès Docker à actualiser dans $api_container, mais une tâche est active ; correction différée."
return 0
fi
echo "GID Docker obsolète dans $api_container ($container_groups, attendu: $socket_gid) ; recréation de l’API."
if [[ "$stack_base" == "$BASE" ]]; then
DOCKER_GID="$socket_gid" "$BASE/scripts/compose.sh" up -d --no-deps --force-recreate api
else
(cd "$stack_base" && DOCKER_GID="$socket_gid" docker compose up -d --no-deps --force-recreate api)
fi
local health=""
for _attempt in $(seq 1 60); do
health="$(docker inspect --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "$api_container" 2>/dev/null || true)"
if [[ "$health" == "healthy" ]]; then
break
fi
sleep 2
done
if [[ "$health" != "healthy" ]]; then
echo "L’API $api_container recréée n’est pas devenue saine (état: ${health:-absent})." >&2
return 1
fi
if ! docker exec "$api_container" docker info >/dev/null 2>&1; then
echo "L’API $api_container est saine mais n’accède toujours pas à Docker." >&2
return 1
fi
echo "Accès Docker de $api_container restauré avec le GID $socket_gid."
}
repair_api "$API_CONTAINER" "$BASE"
if [[ -z "${CODEXPI_API_CONTAINER:-}" && -f /home/config/CodexPi2/docker-compose.yml ]]; then
repair_api codexpi-v2-api-1 /home/config/CodexPi2
fi