Files
AutoGPT/autogpt_platform/installer/setup-autogpt.sh
Bently 22d58367ec dx(platform): Add initial setup scripts for linux and windows (#9912)
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
2025-07-01 13:09:38 +00:00

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