chore: add automatic Git and Docker installation with multi-distro support

Add comprehensive installation functions for Git and Docker across macOS and Linux distributions. Update dependency checking to automatically install missing dependencies instead of failing. Add distro detection, service management, and permission setup for Docker on Linux systems.
This commit is contained in:
Jose B
2025-12-11 16:05:06 -05:00
parent cf8d6e7f57
commit fd4cbfe780

View File

@@ -75,7 +75,7 @@ show_welcome() {
print_banner
log_info "This installer will:"
echo " • Check system dependencies"
echo " • Install missing dependencies (just, uv)"
echo " • Install missing dependencies (Git, Docker, just, uv)"
echo " • Set up Gitea authentication"
echo " • Clone the InternalAI platform repository"
echo " • Install the 'internalai' command-line tool"
@@ -133,32 +133,12 @@ prompt() {
check_dependencies() {
log_header "Checking Dependencies"
local deps_ok=true
# Check Git
if command -v git &> /dev/null; then
log_success "git installed ($(git --version | head -n1))"
else
log_error "git is not installed"
deps_ok=false
fi
# Check Docker
if command -v docker &> /dev/null; then
log_success "docker installed ($(docker --version | head -n1))"
else
log_error "docker is not installed"
deps_ok=false
fi
# Check Docker Compose
if docker compose version &> /dev/null 2>&1; then
log_success "docker compose installed ($(docker compose version | head -n1))"
elif command -v docker-compose &> /dev/null; then
log_success "docker-compose installed ($(docker-compose --version | head -n1))"
else
log_error "docker compose is not installed"
deps_ok=false
log_warning "git is not installed (will attempt to install)"
install_git
fi
# Check bash version
@@ -168,6 +148,29 @@ check_dependencies() {
log_success "bash ${BASH_VERSION} is installed"
fi
# Check Docker
if command -v docker &> /dev/null; then
log_success "docker installed ($(docker --version | head -n1))"
else
log_warning "docker is not installed (will attempt to install)"
install_docker
fi
# Check Docker Compose (should be included with modern Docker installations)
if docker compose version &> /dev/null 2>&1; then
log_success "docker compose installed ($(docker compose version | head -n1))"
elif command -v docker-compose &> /dev/null; then
log_success "docker-compose installed ($(docker-compose --version | head -n1))"
else
log_warning "docker compose not found after Docker installation"
log_info "Docker Compose should be included with Docker. Verifying installation..."
# Try to verify docker is working first
if docker --version &> /dev/null; then
log_info "Docker is installed but compose plugin may not be available"
log_info "This is usually not an issue with modern Docker installations"
fi
fi
# Check Just
if command -v just &> /dev/null; then
log_success "just installed ($(just --version | head -n1))"
@@ -184,14 +187,7 @@ check_dependencies() {
install_uv
fi
if [ "$deps_ok" = false ]; then
log_error "Please install missing dependencies and try again"
echo ""
log_info "Installation guides:"
log_info " • Git: https://git-scm.com/downloads"
log_info " • Docker: https://docs.docker.com/get-docker/"
exit 1
fi
log_success "All dependencies are installed!"
}
install_just() {
@@ -340,6 +336,294 @@ install_uv() {
fi
}
detect_linux_distro() {
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "$ID"
elif [ -f /etc/redhat-release ]; then
echo "rhel"
elif [ -f /etc/debian_version ]; then
echo "debian"
else
echo "unknown"
fi
}
install_git() {
log_info "Installing Git..."
if [[ "$OSTYPE" == "darwin"* ]]; then
install_git_macos
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
install_git_linux
else
log_error "Unsupported OS: $OSTYPE"
log_info "Please install Git manually: https://git-scm.com/downloads"
exit 1
fi
# Verify installation
if command -v git &> /dev/null; then
log_success "Git installed successfully ($(git --version | head -n1))"
else
log_error "Git installation failed"
exit 1
fi
}
install_git_macos() {
if command -v brew &> /dev/null; then
log_info "Installing Git via Homebrew..."
if brew install git; then
log_success "Git installed via Homebrew"
else
log_error "Failed to install Git via Homebrew"
exit 1
fi
else
# Try Xcode Command Line Tools
log_info "Installing Xcode Command Line Tools (includes Git)..."
log_info "A dialog will appear - please click 'Install'"
if xcode-select --install 2>&1 | grep -q "already installed"; then
log_info "Xcode Command Line Tools already installed"
else
log_info "Waiting for Xcode Command Line Tools installation..."
log_info "This may take a few minutes. Please complete the installation dialog."
# Wait for installation to complete
until xcode-select -p &> /dev/null; do
sleep 5
done
log_success "Xcode Command Line Tools installed"
fi
fi
}
install_git_linux() {
local distro=$(detect_linux_distro)
log_info "Installing Git on $distro..."
case "$distro" in
ubuntu|debian|pop|linuxmint)
sudo apt-get update
sudo apt-get install -y git
;;
fedora|rhel|centos|rocky|almalinux)
if command -v dnf &> /dev/null; then
sudo dnf install -y git
else
sudo yum install -y git
fi
;;
arch|manjaro)
sudo pacman -Sy --noconfirm git
;;
opensuse*|sles)
sudo zypper install -y git
;;
alpine)
sudo apk add git
;;
*)
log_error "Unsupported Linux distribution: $distro"
log_info "Please install Git manually for your distribution:"
log_info " https://git-scm.com/download/linux"
exit 1
;;
esac
}
install_docker() {
log_info "Installing Docker..."
if [[ "$OSTYPE" == "darwin"* ]]; then
install_docker_macos
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
install_docker_linux
else
log_error "Unsupported OS: $OSTYPE"
log_info "Please install Docker manually: https://docs.docker.com/get-docker/"
exit 1
fi
}
install_docker_macos() {
if command -v brew &> /dev/null; then
log_info "Installing Docker via Homebrew..."
if brew install --cask docker; then
log_success "Docker installed via Homebrew"
log_info "Starting Docker Desktop..."
open -a Docker
log_info "Waiting for Docker to start..."
# Wait for docker to be ready (up to 60 seconds)
local timeout=60
local elapsed=0
while ! docker info &> /dev/null; do
if [ $elapsed -ge $timeout ]; then
log_warning "Docker daemon did not start within ${timeout}s"
log_info "Please start Docker Desktop manually and run the installer again"
exit 1
fi
sleep 2
elapsed=$((elapsed + 2))
done
log_success "Docker is ready"
else
log_error "Failed to install Docker via Homebrew"
log_info "Please install Docker Desktop manually: https://docs.docker.com/desktop/install/mac-install/"
exit 1
fi
else
log_error "Homebrew is not installed"
log_info "Install Homebrew first: https://brew.sh"
log_info "Or install Docker Desktop manually: https://docs.docker.com/desktop/install/mac-install/"
exit 1
fi
}
install_docker_linux() {
local distro=$(detect_linux_distro)
log_info "Detected Linux distribution: $distro"
case "$distro" in
ubuntu|debian|pop|linuxmint)
install_docker_debian
;;
fedora|rhel|centos|rocky|almalinux)
install_docker_rhel
;;
arch|manjaro)
install_docker_arch
;;
*)
log_error "Unsupported Linux distribution: $distro"
log_info "Please install Docker manually: https://docs.docker.com/engine/install/"
exit 1
;;
esac
# Start and enable Docker service
start_docker_service
# Add user to docker group and activate immediately
setup_docker_permissions
}
install_docker_debian() {
log_info "Installing Docker on Debian/Ubuntu..."
# Update package index
sudo apt-get update
# Install prerequisites
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# Add Docker's official GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/$(detect_linux_distro)/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Set up the repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$(detect_linux_distro) \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker Engine
sudo apt-get update
if sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; then
log_success "Docker installed successfully"
else
log_error "Failed to install Docker"
exit 1
fi
}
install_docker_rhel() {
log_info "Installing Docker on RHEL/Fedora/CentOS..."
# Remove old versions
sudo dnf remove -y docker docker-client docker-client-latest docker-common docker-latest \
docker-latest-logrotate docker-logrotate docker-engine podman runc || true
# Install prerequisites
sudo dnf install -y dnf-plugins-core
# Add Docker repository
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
# Install Docker Engine
if sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin; then
log_success "Docker installed successfully"
else
log_error "Failed to install Docker"
exit 1
fi
}
install_docker_arch() {
log_info "Installing Docker on Arch Linux..."
# Install Docker from official repositories
if sudo pacman -Sy --noconfirm docker docker-compose; then
log_success "Docker installed successfully"
else
log_error "Failed to install Docker"
exit 1
fi
}
start_docker_service() {
log_info "Starting Docker service..."
if command -v systemctl &> /dev/null; then
sudo systemctl start docker
sudo systemctl enable docker
log_success "Docker service started and enabled"
else
log_warning "systemctl not found, please start Docker manually"
fi
}
setup_docker_permissions() {
log_info "Setting up Docker permissions..."
# Add current user to docker group
if ! groups | grep -q docker; then
sudo usermod -aG docker "$USER"
log_success "User added to docker group"
fi
# Test docker access
if docker ps &> /dev/null 2>&1; then
log_success "Docker is accessible without sudo"
return 0
fi
# If docker requires sudo, set up for immediate use
if sudo docker ps &> /dev/null 2>&1; then
log_info "Docker group membership will be active in new terminal sessions"
log_info "For this session, using docker with sudo privileges..."
# Create a wrapper function for the current script session
# This allows the rest of the script to use docker commands
docker() {
sudo /usr/bin/docker "$@"
}
export -f docker 2>/dev/null || true
log_success "Docker is ready to use (with sudo for current session)"
log_info "Note: New terminal sessions will have docker access without sudo"
else
log_error "Docker is not accessible"
exit 1
fi
}
# ============================================================================
# Gitea Authentication
# ============================================================================