mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-01-08 22:58:01 -05:00
This PR adds two setup scripts that will setup autogpt fully, it has a windows .bat and a linux/mac .sh script, for now they are placed in a new folder called "Installer" ### Note, the installers are supposed to be run outside of the autogpt repo folder like Desktop/in a new empy folder because it will clone the repo into the current directory. I have had to add ``cross-env`` via ``pnpm add cross-env `` as on windows the env is set differently in the ``package.json`` build section ``"build": "cross-env pnpm run generate:api-client && SKIP_STORYBOOK_TESTS=true next build"`` once fully setup i plan to make it so these commands can be run with the following commands Linux/Mac ```bash curl -fsSL https://setup.agpt.co/install.sh -o install.sh && bash install.sh ``` Windows cmd/powershell ```bash powershell -c "iwr https://setup.agpt.co/install.bat -o install.bat; ./install.bat" ``` Currently the commands above dont work but will later on! ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] I have tested the linux ``install.sh`` on a ubuntu system and it setup the platform fully. - [x] I have tested the windows ``install.bat`` on my windows system and it setup the platform fully. - [x] I have tested on both OS's and checked with missing prerequisites to see if it shows the errors and it does
340 lines
12 KiB
Bash
340 lines
12 KiB
Bash
#!/bin/bash
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# AutoGPT Setup Script
|
|
# ------------------------------------------------------------------------------
|
|
# This script automates the installation and setup of AutoGPT on Linux systems.
|
|
# It checks prerequisites, clones the repository, sets up backend and frontend,
|
|
# configures Sentry (optional), and starts all services. Designed for clarity
|
|
# and maintainability. Run this script from a terminal.
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# --- Global Variables ---
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
NC='\033[0m' # No Color
|
|
REPO_DIR=""
|
|
CLONE_NEEDED=false
|
|
DOCKER_CMD="docker"
|
|
DOCKER_COMPOSE_CMD="docker compose"
|
|
LOG_DIR=""
|
|
SENTRY_ENABLED=0
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Helper Functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Print colored text
|
|
print_color() {
|
|
printf "${!1}%s${NC}\n" "$2"
|
|
}
|
|
|
|
# Print the ASCII banner
|
|
print_banner() {
|
|
print_color "BLUE" "
|
|
d8888 888 .d8888b. 8888888b. 88888888888
|
|
d88888 888 d88P Y88b 888 Y88b 888
|
|
d88P888 888 888 888 888 888 888
|
|
d88P 888 888 888 888888 .d88b. 888 888 d88P 888
|
|
d88P 888 888 888 888 d88\"\"88b 888 88888 8888888P\" 888
|
|
d88P 888 888 888 888 888 888 888 888 888 888
|
|
d8888888888 Y88b 888 Y88b. Y88..88P Y88b d88P 888 888
|
|
d88P 888 \"Y88888 \"Y888 \"Y88P\" \"Y8888P88 888 888
|
|
"
|
|
}
|
|
|
|
# Handle errors and exit
|
|
handle_error() {
|
|
echo ""
|
|
print_color "RED" "Error: $1"
|
|
print_color "YELLOW" "Press Enter to exit..."
|
|
read -r
|
|
exit 1
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Logging Functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Prepare log directory
|
|
setup_logs() {
|
|
LOG_DIR="$REPO_DIR/autogpt_platform/logs"
|
|
mkdir -p "$LOG_DIR"
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Health Check Functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Check service health by polling an endpoint
|
|
check_health() {
|
|
local url=$1
|
|
local expected=$2
|
|
local name=$3
|
|
local max_attempts=$4
|
|
local timeout=$5
|
|
|
|
if ! command -v curl &> /dev/null; then
|
|
echo "curl not found. Skipping health check for $name."
|
|
return 0
|
|
fi
|
|
|
|
echo "Checking $name health..."
|
|
for ((attempt=1; attempt<=max_attempts; attempt++)); do
|
|
echo "Attempt $attempt/$max_attempts"
|
|
response=$(curl -s --max-time "$timeout" "$url")
|
|
if [[ "$response" == *"$expected"* ]]; then
|
|
echo "✓ $name is healthy"
|
|
return 0
|
|
fi
|
|
echo "Waiting 5s before next attempt..."
|
|
sleep 5
|
|
done
|
|
echo "✗ $name health check failed after $max_attempts attempts"
|
|
return 1
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Prerequisite and Environment Functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Check for required commands
|
|
check_command() {
|
|
local cmd=$1
|
|
local name=$2
|
|
local url=$3
|
|
|
|
if ! command -v "$cmd" &> /dev/null; then
|
|
handle_error "$name is not installed. Please install it and try again. Visit $url"
|
|
else
|
|
print_color "GREEN" "✓ $name is installed"
|
|
fi
|
|
}
|
|
|
|
# Check for optional commands
|
|
check_command_optional() {
|
|
local cmd=$1
|
|
if command -v "$cmd" &> /dev/null; then
|
|
print_color "GREEN" "✓ $cmd is installed"
|
|
else
|
|
print_color "YELLOW" "$cmd is not installed. Some features will be skipped."
|
|
fi
|
|
}
|
|
|
|
# Check Docker permissions and adjust commands if needed
|
|
check_docker_permissions() {
|
|
if ! docker info &> /dev/null; then
|
|
print_color "YELLOW" "Docker requires elevated privileges. Using sudo for Docker commands..."
|
|
DOCKER_CMD="sudo docker"
|
|
DOCKER_COMPOSE_CMD="sudo docker compose"
|
|
fi
|
|
}
|
|
|
|
# Check all prerequisites
|
|
check_prerequisites() {
|
|
print_color "GREEN" "AutoGPT's Automated Setup Script"
|
|
print_color "GREEN" "-------------------------------"
|
|
print_color "BLUE" "This script will automatically install and set up AutoGPT for you."
|
|
echo ""
|
|
print_color "YELLOW" "Checking prerequisites:"
|
|
|
|
check_command git "Git" "https://git-scm.com/downloads"
|
|
check_command docker "Docker" "https://docs.docker.com/get-docker/"
|
|
check_docker_permissions
|
|
check_command npm "npm (Node.js)" "https://nodejs.org/en/download/"
|
|
check_command pnpm "pnpm (Node.js package manager)" "https://pnpm.io/installation"
|
|
check_command_optional curl "curl"
|
|
|
|
print_color "GREEN" "All prerequisites are installed! Starting installation..."
|
|
echo ""
|
|
}
|
|
|
|
# Detect installation mode and set repo directory
|
|
# (Clones if not in a repo, otherwise uses current directory)
|
|
detect_installation_mode() {
|
|
if [[ "$PWD" == */autogpt_platform/installer ]]; then
|
|
if [[ -d "../../.git" ]]; then
|
|
REPO_DIR="$(cd ../..; pwd)"
|
|
CLONE_NEEDED=false
|
|
cd ../.. || handle_error "Failed to navigate to repository root."
|
|
else
|
|
CLONE_NEEDED=true
|
|
REPO_DIR="$(pwd)/AutoGPT"
|
|
cd "$(dirname \"$(dirname \"$(dirname \"$PWD\")\")\")" || handle_error "Failed to navigate to parent directory."
|
|
fi
|
|
elif [[ -d ".git" && -d "autogpt_platform/installer" ]]; then
|
|
REPO_DIR="$PWD"
|
|
CLONE_NEEDED=false
|
|
else
|
|
CLONE_NEEDED=true
|
|
REPO_DIR="$(pwd)/AutoGPT"
|
|
fi
|
|
}
|
|
|
|
# Clone the repository if needed
|
|
clone_repository() {
|
|
if [ "$CLONE_NEEDED" = true ]; then
|
|
print_color "BLUE" "Cloning AutoGPT repository..."
|
|
if git clone https://github.com/Significant-Gravitas/AutoGPT.git "$REPO_DIR"; then
|
|
print_color "GREEN" "✓ Repo cloned successfully!"
|
|
else
|
|
handle_error "Failed to clone the repository."
|
|
fi
|
|
else
|
|
print_color "GREEN" "Using existing AutoGPT repository"
|
|
fi
|
|
}
|
|
|
|
# Prompt for Sentry enablement and set global flag
|
|
prompt_sentry_enablement() {
|
|
print_color "YELLOW" "Would you like to enable debug information to be shared so we can fix your issues? [Y/n]"
|
|
read -r sentry_answer
|
|
case "${sentry_answer,,}" in
|
|
""|y|yes)
|
|
SENTRY_ENABLED=1
|
|
;;
|
|
n|no)
|
|
SENTRY_ENABLED=0
|
|
;;
|
|
*)
|
|
print_color "YELLOW" "Invalid input. Defaulting to yes. Sentry will be enabled."
|
|
SENTRY_ENABLED=1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Setup Functions
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Set up backend services and configure Sentry if enabled
|
|
setup_backend() {
|
|
print_color "BLUE" "Setting up backend services..."
|
|
cd "$REPO_DIR/autogpt_platform" || handle_error "Failed to navigate to backend directory."
|
|
cp .env.example .env || handle_error "Failed to copy environment file."
|
|
|
|
# Set SENTRY_DSN in backend/.env
|
|
cd backend || handle_error "Failed to navigate to backend subdirectory."
|
|
cp .env.example .env || handle_error "Failed to copy backend environment file."
|
|
sentry_url="https://11d0640fef35640e0eb9f022eb7d7626@o4505260022104064.ingest.us.sentry.io/4507890252447744"
|
|
if [ "$SENTRY_ENABLED" = "1" ]; then
|
|
sed -i "s|^SENTRY_DSN=.*$|SENTRY_DSN=$sentry_url|" .env || echo "SENTRY_DSN=$sentry_url" >> .env
|
|
print_color "GREEN" "Sentry enabled in backend."
|
|
else
|
|
sed -i "s|^SENTRY_DSN=.*$|SENTRY_DSN=|" .env || echo "SENTRY_DSN=" >> .env
|
|
print_color "YELLOW" "Sentry not enabled in backend."
|
|
fi
|
|
cd .. # back to autogpt_platform
|
|
|
|
$DOCKER_COMPOSE_CMD down || handle_error "Failed to stop existing backend services."
|
|
$DOCKER_COMPOSE_CMD up -d --build || handle_error "Failed to start backend services."
|
|
print_color "GREEN" "✓ Backend services started successfully"
|
|
}
|
|
|
|
# Set up frontend application
|
|
setup_frontend() {
|
|
print_color "BLUE" "Setting up frontend application..."
|
|
cd "$REPO_DIR/autogpt_platform/frontend" || handle_error "Failed to navigate to frontend directory."
|
|
cp .env.example .env || handle_error "Failed to copy frontend environment file."
|
|
corepack enable || handle_error "Failed to enable corepack."
|
|
pnpm install || handle_error "Failed to install frontend dependencies."
|
|
print_color "GREEN" "✓ Frontend dependencies installed successfully"
|
|
}
|
|
|
|
# Run backend and frontend setup concurrently and manage logs
|
|
run_concurrent_setup() {
|
|
setup_logs
|
|
backend_log="$LOG_DIR/backend_setup.log"
|
|
frontend_log="$LOG_DIR/frontend_setup.log"
|
|
|
|
: > "$backend_log"
|
|
: > "$frontend_log"
|
|
|
|
setup_backend > "$backend_log" 2>&1 &
|
|
backend_pid=$!
|
|
echo "Backend setup finished."
|
|
|
|
setup_frontend > "$frontend_log" 2>&1 &
|
|
frontend_pid=$!
|
|
echo "Frontend setup finished."
|
|
|
|
show_spinner "$backend_pid" "$frontend_pid"
|
|
|
|
wait $backend_pid; backend_status=$?
|
|
wait $frontend_pid; frontend_status=$?
|
|
|
|
if [ $backend_status -ne 0 ]; then
|
|
print_color "RED" "Backend setup failed. See log: $backend_log"
|
|
exit 1
|
|
fi
|
|
|
|
if [ $frontend_status -ne 0 ]; then
|
|
print_color "RED" "Frontend setup failed. See log: $frontend_log"
|
|
exit 1
|
|
fi
|
|
|
|
}
|
|
|
|
# Show a spinner while background jobs run
|
|
show_spinner() {
|
|
local backend_pid=$1
|
|
local frontend_pid=$2
|
|
spin='-\|/'
|
|
i=0
|
|
messages=("Working..." "Still working..." "Setting up dependencies..." "Almost there...")
|
|
msg_index=0
|
|
msg_counter=0
|
|
clear_line=" "
|
|
|
|
while kill -0 $backend_pid 2>/dev/null || kill -0 $frontend_pid 2>/dev/null; do
|
|
i=$(( (i+1) % 4 ))
|
|
msg_counter=$(( (msg_counter+1) % 300 ))
|
|
if [ $msg_counter -eq 0 ]; then
|
|
msg_index=$(( (msg_index+1) % ${#messages[@]} ))
|
|
fi
|
|
printf "\r${clear_line}\r${YELLOW}[%c]${NC} %s" "${spin:$i:1}" "${messages[$msg_index]}"
|
|
sleep .1
|
|
done
|
|
printf "\r${clear_line}\r${GREEN}[✓]${NC} Setup completed!\n"
|
|
}
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Main Entry Point
|
|
# ------------------------------------------------------------------------------
|
|
|
|
main() {
|
|
print_banner
|
|
check_prerequisites
|
|
prompt_sentry_enablement
|
|
detect_installation_mode
|
|
clone_repository
|
|
setup_logs
|
|
run_concurrent_setup
|
|
|
|
print_color "YELLOW" "Starting frontend..."
|
|
(cd "$REPO_DIR/autogpt_platform/frontend" && pnpm dev > "$LOG_DIR/frontend_dev.log" 2>&1 &)
|
|
|
|
print_color "YELLOW" "Waiting for services to start..."
|
|
sleep 20
|
|
|
|
print_color "YELLOW" "Verifying services health..."
|
|
check_health "http://localhost:8006/health" "\"status\":\"healthy\"" "Backend" 6 15
|
|
check_health "http://localhost:3000/health" "Yay im healthy" "Frontend" 6 15
|
|
|
|
if [ $backend_status -ne 0 ] || [ $frontend_status -ne 0 ]; then
|
|
print_color "RED" "Setup failed. See logs for details."
|
|
exit 1
|
|
fi
|
|
|
|
print_color "GREEN" "Setup complete!"
|
|
print_color "BLUE" "Access AutoGPT at: http://localhost:3000"
|
|
print_color "YELLOW" "To stop services, press Ctrl+C and run 'docker compose down' in $REPO_DIR/autogpt_platform"
|
|
echo ""
|
|
print_color "GREEN" "Press Enter to exit (services will keep running)..."
|
|
read -r
|
|
}
|
|
|
|
main
|