Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 6 additions & 3 deletions docs/installation/one-command.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
# 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
```

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) ;
Expand Down
91 changes: 83 additions & 8 deletions scripts/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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"
Expand Down
Loading