#!/usr/bin/env bash set -euo pipefail BASE="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" UNIT_DIR="$BASE/deploy/systemd" UNITS=(codexpi.service codexpi-docker-access.service codexpi-docker-access.timer) if [[ "$BASE" != "/home/config/CodexPi" ]]; then echo "Installation refusée hors du répertoire de production /home/config/CodexPi" >&2 exit 1 fi for unit in "${UNITS[@]}"; do if [[ ! -f "$UNIT_DIR/$unit" ]]; then echo "Unité CodexPi introuvable: $UNIT_DIR/$unit" >&2 exit 1 fi done command -v docker >/dev/null || { echo "Docker est introuvable" >&2; exit 1; } command -v sudo >/dev/null || { echo "sudo est requis pour installer les unités systemd" >&2; exit 1; } command -v systemctl >/dev/null || { echo "systemd est requis pour installer la surveillance Docker" >&2; exit 1; } "$BASE/scripts/compose.sh" config >/dev/null codexpi_uid="$(stat -c '%u' "$BASE")" codexpi_gid="$(stat -c '%g' "$BASE")" docker_gid="$(stat -c '%g' /var/run/docker.sock)" if [[ ! "$codexpi_uid" =~ ^[0-9]+$ || ! "$codexpi_gid" =~ ^[0-9]+$ || ! "$docker_gid" =~ ^[0-9]+$ ]]; then echo "Impossible de déterminer les groupes numériques de CodexPi et Docker" >&2 exit 1 fi # Prefer the host group name so systemd resolves its current GID again after a # Docker package update. A numeric GID remains a valid fallback on hosts where # the socket group has no entry in /etc/group. docker_group="$(getent group "$docker_gid" 2>/dev/null | cut -d: -f1 || true)" docker_group="${docker_group:-$docker_gid}" if [[ ! "$docker_group" =~ ^[a-zA-Z0-9_.-]+$ ]]; then echo "Nom de groupe Docker invalide: $docker_group" >&2 exit 1 fi generated_units="$(mktemp -d)" trap 'rm -rf -- "$generated_units"' EXIT for unit in "${UNITS[@]}"; do sed \ -e "s/__CODEXPI_UID__/$codexpi_uid/g" \ -e "s/__CODEXPI_GID__/$codexpi_gid/g" \ -e "s/__DOCKER_GROUP__/$docker_group/g" \ "$UNIT_DIR/$unit" >"$generated_units/$unit" sudo install -o root -g root -m 0644 "$generated_units/$unit" "/etc/systemd/system/$unit" done sudo systemctl daemon-reload sudo systemctl enable codexpi.service sudo systemctl enable --now codexpi-docker-access.timer sudo systemctl start --no-block codexpi-docker-access.service echo "Démarrage et auto-réparation de l’accès Docker activés. Aucun redémarrage du Pi n'a été effectué." echo "Compte CodexPi: UID $codexpi_uid, GID $codexpi_gid ; groupe Docker: $docker_group ($docker_gid)." echo "Pour démarrer immédiatement la pile: sudo systemctl start codexpi.service"