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:
346
install.sh
346
install.sh
@@ -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
|
||||
# ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user