#!/usr/bin/env bash set -euo pipefail # Script d'amorçage 4NK_node # - Installe git s'il est absent # - Installe Docker Engine + docker compose plugin s'ils sont absents # - Ajoute l'utilisateur courant au groupe docker dès le début # - Installe Node.js et npm via nvm (dernière LTS par défaut) # - Affiche les versions installées echo "[bootstrap] Démarrage du script d'amorçage" if [ "${EUID}" -ne 0 ]; then SUDO="sudo" else SUDO="" fi OS_ID="$(. /etc/os-release && echo "${ID:-debian}")" OS_CODENAME="$(. /etc/os-release && echo "${VERSION_CODENAME:-buster}")" echo "[bootstrap] OS: ${OS_ID} (${OS_CODENAME})" # 1) Ajouter l'utilisateur au groupe docker dès le début (si le groupe existe plus tard, on rejouera) if getent group docker >/dev/null 2>&1; then echo "[bootstrap] Ajout de l'utilisateur ${USER} au groupe docker (si non présent)" ${SUDO} usermod -aG docker "${USER}" || true else echo "[bootstrap] Groupe docker non présent pour l'instant; il sera créé à l'installation de Docker. Une seconde tentative aura lieu après l'installation." fi # 2) Mise à jour des index paquets (APT) if command -v apt-get >/dev/null 2>&1; then echo "[bootstrap] Mise à jour APT" ${SUDO} DEBIAN_FRONTEND=noninteractive apt-get -y update ${SUDO} DEBIAN_FRONTEND=noninteractive apt-get -y install ca-certificates curl gnupg lsb-release elif command -v yum >/dev/null 2>&1; then echo "[bootstrap] Vérification curl (yum)" command -v curl >/dev/null 2>&1 || ${SUDO} yum install -y curl ca-certificates || true elif command -v dnf >/dev/null 2>&1; then echo "[bootstrap] Vérification curl (dnf)" command -v curl >/dev/null 2>&1 || ${SUDO} dnf install -y curl ca-certificates || true fi # 3) Installer git si absent if ! command -v git >/dev/null 2>&1; then echo "[bootstrap] Installation de git" if command -v apt-get >/dev/null 2>&1; then ${SUDO} DEBIAN_FRONTEND=noninteractive apt-get -y install git elif command -v yum >/dev/null 2>&1; then ${SUDO} yum install -y git elif command -v dnf >/dev/null 2>&1; then ${SUDO} dnf install -y git else echo "[bootstrap][ERREUR] Gestionnaire de paquets non pris en charge pour git." >&2 exit 1 fi else echo "[bootstrap] git déjà installé: $(git --version)" fi # 3b) Installer tree si absent if ! command -v tree >/dev/null 2>&1; then echo "[bootstrap] Installation de tree" if command -v apt-get >/dev/null 2>&1; then ${SUDO} DEBIAN_FRONTEND=noninteractive apt-get -y install tree elif command -v yum >/dev/null 2>&1; then ${SUDO} yum install -y tree elif command -v dnf >/dev/null 2>&1; then ${SUDO} dnf install -y tree else echo "[bootstrap][ERREUR] Gestionnaire de paquets non pris en charge pour tree." >&2 exit 1 fi else echo "[bootstrap] tree déjà installé: $(tree --version | head -n1)" fi # 4) Installer Docker + plugin compose si absent if ! command -v docker >/dev/null 2>&1; then echo "[bootstrap] Installation de Docker Engine et du plugin compose" if command -v apt-get >/dev/null 2>&1; then # Dépôt officiel Docker (compatible anciens Debian/Ubuntu) ${SUDO} install -m 0755 -d /etc/apt/keyrings || true curl -fsSL https://download.docker.com/linux/${OS_ID}/gpg | ${SUDO} gpg --dearmor -o /etc/apt/keyrings/docker.asc ${SUDO} chmod a+r /etc/apt/keyrings/docker.asc echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/${OS_ID} ${OS_CODENAME} stable" | ${SUDO} tee /etc/apt/sources.list.d/docker.list >/dev/null ${SUDO} DEBIAN_FRONTEND=noninteractive apt-get -y update ${SUDO} DEBIAN_FRONTEND=noninteractive apt-get -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin docker-ce-rootless-extras || { echo "[bootstrap] Tentative d'installation minimale (sans extras)"; ${SUDO} DEBIAN_FRONTEND=noninteractive apt-get -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin || true; } ${SUDO} systemctl enable --now docker || true elif command -v yum >/dev/null 2>&1; then ${SUDO} yum install -y yum-utils ${SUDO} yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ${SUDO} yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin ${SUDO} systemctl enable --now docker || true elif command -v dnf >/dev/null 2>&1; then ${SUDO} dnf -y install dnf-plugins-core ${SUDO} dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo ${SUDO} dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin ${SUDO} systemctl enable --now docker || true else echo "[bootstrap][ERREUR] Gestionnaire de paquets non pris en charge pour Docker." >&2 exit 1 fi else echo "[bootstrap] Docker déjà installé: $(docker --version)" fi # Re-tenter l'ajout au groupe docker maintenant que Docker est installé if getent group docker >/dev/null 2>&1; then echo "[bootstrap] Ajout de l'utilisateur ${USER} au groupe docker (post-install)" ${SUDO} usermod -aG docker "${USER}" || true fi # 5) Installer nvm + Node.js (dernière LTS) si node/npm absents if ! command -v node >/dev/null 2>&1 || ! command -v npm >/dev/null 2>&1; then echo "[bootstrap] Installation de nvm (Node Version Manager) et de Node.js (LTS)" export NVM_DIR="$HOME/.nvm" if [ ! -d "$NVM_DIR" ]; then curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash fi # Charger nvm dans le shell courant [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # Installer la dernière LTS nvm install --lts nvm alias default 'lts/*' else echo "[bootstrap] Node/npm déjà installés: node $(node --version), npm $(npm --version)" fi echo "[bootstrap] Versions installées:" command -v git >/dev/null 2>&1 && git --version || echo "git: non installé" command -v docker >/dev/null 2>&1 && docker --version || echo "docker: non installé" if docker compose version >/dev/null 2>&1; then docker compose version; else echo "docker compose: non installé"; fi command -v node >/dev/null 2>&1 && node --version || echo "node: non installé" command -v npm >/dev/null 2>&1 && npm --version || echo "npm: non installé" command -v tree >/dev/null 2>&1 && tree --version | head -n1 || echo "tree: non installé" echo "[bootstrap] Terminé. Si c'est la première installation Docker, déconnectez-vous/reconnectez-vous pour que l'appartenance au groupe docker prenne effet."