4NK_node/scripts/bootstrap.sh

144 lines
6.4 KiB
Bash
Executable File

#!/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."