diff --git a/install.sh b/install.sh index 064e394..99f1f5d 100755 --- a/install.sh +++ b/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 # ============================================================================