From bcf84714bc7ae6d49d588618b9c0bcfb2c968fa3 Mon Sep 17 00:00:00 2001 From: D4kooo Date: Wed, 10 Jun 2026 11:26:31 +0200 Subject: [PATCH] feat(install): bootstrap automatique de Docker dans l'installeur MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pour les utilisateurs non-techniciens, le script ne se contente plus d'échouer si Docker manque — il le prend en charge : - Docker absent → installation (Docker Desktop sur macOS via le .dmg officiel selon l'arch, Docker Engine sur Linux via get.docker.com). - Docker installé mais arrêté → démarrage automatique (open -a Docker / systemctl) puis attente du daemon (jusqu'à ~3 min) avant de continuer. - Au 1er lancement de Docker Desktop sur Mac, l'utilisateur valide une fenêtre (conditions) ; le script reprend seul dès que le daemon répond. Docs + README mis à jour : plus aucun prérequis à installer soi-même. Chemin Docker-présent vérifié de bout en bout (stack démarrée, /setup servi). --- README.md | 3 +- docs/installation/one-command.md | 9 ++-- scripts/install.sh | 91 +++++++++++++++++++++++++++++--- 3 files changed, 91 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 09df66c..fc7c62e 100644 --- a/README.md +++ b/README.md @@ -258,7 +258,8 @@ au démarrage — puis l'**assistant de premier lancement** (`/setup`) guide la création du compte admin et la première clé IA dans le navigateur. Détails et mise à jour : [docs/installation/one-command.md](./docs/installation/one-command.md). -> Seul prérequis : [Docker](https://docs.docker.com/get-docker/) (Compose v2). +> Aucun prérequis à installer soi-même : le script installe [Docker](https://docs.docker.com/get-docker/) +> s'il manque (Docker Desktop sur macOS, Docker Engine sur Linux). > Node.js n'est nécessaire que pour l'installation depuis les sources ci-dessous. ### Installation depuis les sources (développement) diff --git a/docs/installation/one-command.md b/docs/installation/one-command.md index 3af62df..395f051 100644 --- a/docs/installation/one-command.md +++ b/docs/installation/one-command.md @@ -1,8 +1,8 @@ # Installation en une commande La façon la plus simple d'installer Louis sur une machine (poste de cabinet, -serveur, VPS). Une seule dépendance : [Docker](https://docs.docker.com/get-docker/) -avec Compose v2. +serveur, VPS). **Aucun prérequis à installer soi-même** : si Docker manque, le +script l'installe. ```bash curl -fsSL https://raw.githubusercontent.com/Association-DataRing/Louis/main/scripts/install.sh | bash @@ -10,7 +10,10 @@ curl -fsSL https://raw.githubusercontent.com/Association-DataRing/Louis/main/scr Le script : -1. vérifie que Docker tourne ; +1. **vérifie Docker** — l'installe s'il manque (Docker Desktop sur macOS, + Docker Engine sur Linux) et le démarre s'il est arrêté. Au premier + lancement de Docker Desktop sur Mac, une fenêtre demande d'accepter les + conditions : un clic, et le script reprend tout seul ; 2. crée un dossier `./louis` contenant le `docker-compose.prod.yml` et un fichier `.env` avec des **secrets générés aléatoirement** (jamais écrasés s'ils existent — relancer le script est sans danger) ; diff --git a/scripts/install.sh b/scripts/install.sh index 7e49edf..0f9cb65 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -28,7 +28,9 @@ LOUIS_REPO_RAW="${LOUIS_REPO_RAW:-https://raw.githubusercontent.com/Association- COMPOSE_FILE="docker-compose.prod.yml" bold() { printf '\033[1m%s\033[0m\n' "$*"; } +log() { printf ' %s\n' "$*"; } ok() { printf ' \033[32m✓\033[0m %s\n' "$*"; } +warn() { printf ' \033[33m⚠\033[0m %s\n' "$*"; } fail() { printf ' \033[31m✗\033[0m %s\n' "$*" >&2; exit 1; } rand_secret() { @@ -39,16 +41,89 @@ rand_secret() { fi } +# Attend que le daemon Docker réponde (jusqu'à ~3 min), en le démarrant au +# besoin. Docker Desktop (Mac) demande au premier lancement d'accepter les +# conditions dans une fenêtre — d'où le message, puis on attend que le +# daemon soit prêt et on poursuit automatiquement. +wait_for_docker() { + if docker info >/dev/null 2>&1; then return 0; fi + case "$(uname -s)" in + Darwin) + open -a Docker >/dev/null 2>&1 || open -a "Docker Desktop" >/dev/null 2>&1 || true + log "Docker démarre — si une fenêtre s'ouvre, cliquez « Accepter » pour finaliser." ;; + Linux) + if command -v systemctl >/dev/null 2>&1; then + sudo systemctl start docker >/dev/null 2>&1 || true + fi ;; + esac + printf ' … attente du démarrage de Docker' + for _ in $(seq 1 90); do + if docker info >/dev/null 2>&1; then printf '\n'; return 0; fi + printf '.'; sleep 2 + done + printf '\n' + return 1 +} + +# Installe Docker Desktop sur macOS (téléchargement officiel, pas de Homebrew +# requis). L'utilisateur n'a qu'à valider la fenêtre Docker au 1er lancement. +install_docker_mac() { + local arch url dmg mnt + arch="$(uname -m)" + if [ "$arch" = "arm64" ]; then + url="https://desktop.docker.com/mac/main/arm64/Docker.dmg" + else + url="https://desktop.docker.com/mac/main/amd64/Docker.dmg" + fi + bold "Docker n'est pas installé — installation de Docker Desktop (~600 Mo)…" + dmg="$(mktemp -d)/Docker.dmg" + curl -fSL --progress-bar "$url" -o "$dmg" \ + || fail "Téléchargement de Docker échoué. Installez-le manuellement : https://docs.docker.com/desktop/install/mac-install/" + mnt="$(mktemp -d)" + hdiutil attach "$dmg" -nobrowse -mountpoint "$mnt" >/dev/null \ + || fail "Montage de l'image Docker échoué." + log "Copie de Docker dans /Applications…" + cp -R "$mnt/Docker.app" /Applications/ 2>/dev/null || { + hdiutil detach "$mnt" >/dev/null 2>&1 || true + fail "Copie échouée. Glissez Docker dans Applications manuellement, lancez-le, puis relancez ce script." + } + hdiutil detach "$mnt" >/dev/null 2>&1 || true + xattr -dr com.apple.quarantine /Applications/Docker.app 2>/dev/null || true + ok "Docker Desktop installé" +} + +# Installe Docker Engine sur Linux via le script officiel (apt/dnf/…). +install_docker_linux() { + bold "Docker n'est pas installé — installation via le script officiel Docker…" + if [ "$(id -u)" = "0" ]; then + curl -fsSL https://get.docker.com | sh || fail "Installation de Docker échouée." + elif command -v sudo >/dev/null 2>&1; then + curl -fsSL https://get.docker.com | sudo sh || fail "Installation de Docker échouée (sudo)." + else + fail "Ni root ni sudo disponible. Installez Docker manuellement : https://docs.docker.com/engine/install/" + fi +} + +# Garantit Docker installé ET démarré, sinon l'installe puis le démarre. +ensure_docker() { + if ! command -v docker >/dev/null 2>&1; then + case "$(uname -s)" in + Darwin) install_docker_mac ;; + Linux) install_docker_linux ;; + *) fail "OS non reconnu. Installez Docker manuellement : https://docs.docker.com/get-docker/" ;; + esac + fi + wait_for_docker \ + || fail "Docker ne répond pas. Lancez Docker Desktop, attendez qu'il soit prêt (icône fixe), puis relancez ce script." + docker compose version >/dev/null 2>&1 \ + || fail "Docker Compose v2 absent. Mettez Docker Desktop à jour (il l'inclut)." + ok "Docker opérationnel" +} + bold "Louis — installation" -# 1. Prérequis ──────────────────────────────────────────────────────────────── -command -v docker >/dev/null 2>&1 \ - || fail "Docker n'est pas installé. Installez Docker Desktop : https://docs.docker.com/get-docker/" -docker info >/dev/null 2>&1 \ - || fail "Docker est installé mais ne tourne pas. Démarrez Docker Desktop puis relancez ce script." -docker compose version >/dev/null 2>&1 \ - || fail "Le plugin Docker Compose est absent. Mettez Docker à jour (Compose v2 requis)." -ok "Docker opérationnel" +# 1. Prérequis : Docker installé et démarré (installé automatiquement si absent) +ensure_docker # 2. Dossier + compose ──────────────────────────────────────────────────────── mkdir -p "$LOUIS_DIR"