From 82892b7a3e0e200cd8b5dbde92663af16b1b64e4 Mon Sep 17 00:00:00 2001 From: Celes Renata Date: Wed, 29 Apr 2026 18:59:40 +0000 Subject: [PATCH] feat: multi-distro support in deploy-docker.sh Step 0 now detects the OS and package manager, supporting: - Debian/Ubuntu (apt) - RHEL/Rocky/Fedora/CentOS (dnf/yum) - Arch Linux (pacman) - openSUSE (zypper) - WSL (uses host Windows NVIDIA driver, skips driver install) Handles Docker CE install, NVIDIA driver, NVIDIA Container Toolkit, and firewall (firewalld + ufw) across all supported distros. --- deploy-docker.sh | 199 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 164 insertions(+), 35 deletions(-) diff --git a/deploy-docker.sh b/deploy-docker.sh index 1aff84f..fa2a9a0 100755 --- a/deploy-docker.sh +++ b/deploy-docker.sh @@ -43,15 +43,81 @@ echo " Ollama: Docker container (GPU-accelerated)" echo "" # ------------------------------------------------------- -# Step 0: Ensure prerequisites on Rocky 9.7 +# Step 0: Ensure prerequisites (multi-distro support) # ------------------------------------------------------- -echo "--- Step 0: Checking prerequisites (Rocky 9.7) ---" +echo "--- Step 0: Checking prerequisites ---" ssh "$REMOTE_HOST" bash -s <<'REMOTE_SCRIPT' set -euo pipefail -# Verify we're on a RHEL-compatible system -if ! grep -qi "rocky\|rhel\|centos" /etc/os-release 2>/dev/null; then - echo " ⚠ Warning: This script is designed for Rocky Linux 9.7 — detected different OS" +# --- Detect OS and package manager --- +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS_ID="${ID:-unknown}" + OS_LIKE="${ID_LIKE:-$OS_ID}" + elif [ -f /etc/redhat-release ]; then + OS_ID="rhel" + OS_LIKE="rhel" + else + OS_ID="unknown" + OS_LIKE="unknown" + fi + + # Detect WSL + IS_WSL=false + if grep -qi microsoft /proc/version 2>/dev/null; then + IS_WSL=true + fi + + # Determine package manager + if command -v apt-get &>/dev/null; then + PKG_MGR="apt" + elif command -v dnf &>/dev/null; then + PKG_MGR="dnf" + elif command -v yum &>/dev/null; then + PKG_MGR="yum" + elif command -v pacman &>/dev/null; then + PKG_MGR="pacman" + elif command -v zypper &>/dev/null; then + PKG_MGR="zypper" + else + PKG_MGR="unknown" + fi + + echo " Detected: OS=$OS_ID (like=$OS_LIKE), pkg=$PKG_MGR, WSL=$IS_WSL" +} + +install_pkg() { + local pkg="$1" + case "$PKG_MGR" in + apt) sudo apt-get install -y "$pkg" ;; + dnf) sudo dnf -y install "$pkg" ;; + yum) sudo yum -y install "$pkg" ;; + pacman) sudo pacman -S --noconfirm "$pkg" ;; + zypper) sudo zypper install -y "$pkg" ;; + *) echo " ERROR: Unknown package manager"; exit 1 ;; + esac +} + +update_pkg_cache() { + case "$PKG_MGR" in + apt) sudo apt-get update -qq ;; + dnf|yum) ;; # dnf/yum auto-refresh + pacman) sudo pacman -Sy ;; + zypper) sudo zypper refresh -q ;; + esac +} + +detect_os + +# --- Git --- +if ! command -v git &>/dev/null; then + echo " Installing git..." + update_pkg_cache + install_pkg git + echo " ✓ Git installed" +else + echo " ✓ Git present" fi # --- Docker Engine --- @@ -59,12 +125,39 @@ if command -v docker &>/dev/null && docker info &>/dev/null; then echo " ✓ Docker already installed ($(docker --version | cut -d' ' -f3 | tr -d ','))" else echo " Installing Docker CE..." - sudo dnf -y install dnf-plugins-core - sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo - sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin - sudo systemctl enable --now docker - # Add current user to docker group (takes effect on next login) - sudo usermod -aG docker "$(whoami)" || true + case "$PKG_MGR" in + apt) + # Debian/Ubuntu/WSL + sudo apt-get update -qq + sudo apt-get install -y ca-certificates curl gnupg + sudo install -m 0755 -d /etc/apt/keyrings + curl -fsSL https://download.docker.com/linux/${OS_ID}/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 2>/dev/null + sudo chmod a+r /etc/apt/keyrings/docker.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${OS_ID} $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + sudo apt-get update -qq + sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + ;; + dnf|yum) + # RHEL/Rocky/Fedora/CentOS + sudo "$PKG_MGR" -y install dnf-plugins-core 2>/dev/null || true + local repo_distro="rhel" + if [[ "$OS_ID" == "fedora" ]]; then repo_distro="fedora"; fi + sudo dnf config-manager --add-repo "https://download.docker.com/linux/${repo_distro}/docker-ce.repo" 2>/dev/null || \ + sudo yum-config-manager --add-repo "https://download.docker.com/linux/${repo_distro}/docker-ce.repo" 2>/dev/null + sudo "$PKG_MGR" -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + ;; + pacman) + # Arch Linux + sudo pacman -S --noconfirm docker docker-compose docker-buildx + ;; + zypper) + # openSUSE + sudo zypper install -y docker docker-compose docker-buildx + ;; + esac + sudo systemctl enable --now docker 2>/dev/null || true + sudo usermod -aG docker "$(whoami)" 2>/dev/null || true echo " ✓ Docker installed and started" fi @@ -76,13 +169,31 @@ else exit 1 fi -# --- NVIDIA Driver --- -if ! command -v nvidia-smi &>/dev/null; then +# --- NVIDIA Driver (skip on WSL — uses host driver) --- +if [ "$IS_WSL" = "true" ]; then + echo " ✓ WSL detected — using host Windows NVIDIA driver" +elif ! command -v nvidia-smi &>/dev/null; then echo " Installing NVIDIA drivers..." - sudo dnf -y install epel-release - sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo - sudo dnf -y module install nvidia-driver:latest-dkms - echo " ✓ NVIDIA driver installed (reboot may be required)" + case "$PKG_MGR" in + apt) + sudo apt-get install -y nvidia-driver-560 2>/dev/null || \ + sudo apt-get install -y nvidia-driver 2>/dev/null || \ + echo " ⚠ NVIDIA driver install failed — install manually" + ;; + dnf|yum) + sudo dnf -y install epel-release 2>/dev/null || true + sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo 2>/dev/null || true + sudo dnf -y module install nvidia-driver:latest-dkms 2>/dev/null || \ + echo " ⚠ NVIDIA driver install failed — install manually" + ;; + pacman) + sudo pacman -S --noconfirm nvidia nvidia-utils 2>/dev/null || \ + echo " ⚠ NVIDIA driver install failed — install manually" + ;; + zypper) + echo " ⚠ NVIDIA driver: install manually for openSUSE" + ;; + esac else echo " ✓ NVIDIA driver present ($(nvidia-smi --query-gpu=driver_version --format=csv,noheader | head -1))" fi @@ -90,40 +201,58 @@ fi # --- NVIDIA Container Toolkit --- if command -v nvidia-ctk &>/dev/null; then echo " ✓ NVIDIA Container Toolkit already installed" +elif [ "$IS_WSL" = "true" ] && docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi &>/dev/null 2>&1; then + echo " ✓ WSL GPU passthrough working (no nvidia-ctk needed)" else echo " Installing NVIDIA Container Toolkit..." - curl -fsSL https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \ - sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo > /dev/null - sudo dnf -y install nvidia-container-toolkit - # Configure Docker runtime for NVIDIA - sudo nvidia-ctk runtime configure --runtime=docker - sudo systemctl restart docker + case "$PKG_MGR" in + apt) + curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg 2>/dev/null + curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ + sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ + sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list > /dev/null + sudo apt-get update -qq + sudo apt-get install -y nvidia-container-toolkit + ;; + dnf|yum) + curl -fsSL https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \ + sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo > /dev/null + sudo "$PKG_MGR" -y install nvidia-container-toolkit + ;; + pacman) + sudo pacman -S --noconfirm nvidia-container-toolkit 2>/dev/null || \ + echo " ⚠ Install nvidia-container-toolkit from AUR" + ;; + zypper) + echo " ⚠ NVIDIA Container Toolkit: install manually for openSUSE" + ;; + esac + sudo nvidia-ctk runtime configure --runtime=docker 2>/dev/null || true + sudo systemctl restart docker 2>/dev/null || true echo " ✓ NVIDIA Container Toolkit installed and Docker configured" fi # --- Verify GPU is accessible from Docker --- -if docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi &>/dev/null; then +if docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi &>/dev/null 2>&1; then echo " ✓ GPU passthrough verified" else - echo " ⚠ GPU passthrough test failed — NVIDIA Container Toolkit may need a reboot" - echo " Run: sudo reboot, then re-run this script" + echo " ⚠ GPU passthrough test failed — may need a reboot or manual NVIDIA setup" fi -# --- Git --- -if ! command -v git &>/dev/null; then - echo " Installing git..." - sudo dnf -y install git - echo " ✓ Git installed" -fi - -# --- Firewall (open required ports) --- +# --- Firewall (open required ports if firewall is active) --- if command -v firewall-cmd &>/dev/null && systemctl is-active firewalld &>/dev/null; then - echo " Configuring firewall..." + echo " Configuring firewalld..." for port in 3000 8001 8002 8003 8004 9000 9001 11434; do sudo firewall-cmd --permanent --add-port="${port}/tcp" 2>/dev/null || true done sudo firewall-cmd --reload 2>/dev/null || true echo " ✓ Firewall ports opened" +elif command -v ufw &>/dev/null && sudo ufw status 2>/dev/null | grep -q "active"; then + echo " Configuring ufw..." + for port in 3000 8001 8002 8003 8004 9000 9001 11434; do + sudo ufw allow "${port}/tcp" 2>/dev/null || true + done + echo " ✓ UFW ports opened" fi REMOTE_SCRIPT echo ""