forked from open-webui/open-webui
		
	Be able to configure compose from a shell program
This commit is contained in:
		
							parent
							
								
									ac34a7978f
								
							
						
					
					
						commit
						9e1660e6bb
					
				
					 1 changed files with 211 additions and 0 deletions
				
			
		
							
								
								
									
										211
									
								
								run-compose.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										211
									
								
								run-compose.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,211 @@ | |||
| #!/bin/bash | ||||
| 
 | ||||
| # Define color and formatting codes | ||||
| BOLD='\033[1m' | ||||
| GREEN='\033[1;32m' | ||||
| WHITE='\033[1;37m' | ||||
| RED='\033[0;31m' | ||||
| NC='\033[0m' # No Color | ||||
| # Unicode character for tick mark | ||||
| TICK='\u2713' | ||||
| 
 | ||||
| # Detect GPU driver | ||||
| get_gpu_driver() { | ||||
|     # Detect NVIDIA GPUs | ||||
|     if lspci | grep -i nvidia >/dev/null; then | ||||
|         echo "nvidia" | ||||
|         return | ||||
|     fi | ||||
| 
 | ||||
|     # Detect AMD GPUs (including GCN architecture check for amdgpu vs radeon) | ||||
|     if lspci | grep -i amd >/dev/null; then | ||||
|         # List of known GCN and later architecture cards | ||||
|         # This is a simplified list, and in a real-world scenario, you'd want a more comprehensive one | ||||
|         local gcn_and_later=("Radeon HD 7000" "Radeon HD 8000" "Radeon R5" "Radeon R7" "Radeon R9" "Radeon RX") | ||||
| 
 | ||||
|         # Get GPU information | ||||
|         local gpu_info=$(lspci | grep -i 'vga.*amd') | ||||
| 
 | ||||
|         for model in "${gcn_and_later[@]}"; do | ||||
|             if echo "$gpu_info" | grep -iq "$model"; then | ||||
|                 echo "amdgpu" | ||||
|                 return | ||||
|             fi | ||||
|         done | ||||
| 
 | ||||
|         # Default to radeon if no GCN or later architecture is detected | ||||
|         echo "radeon" | ||||
|         return | ||||
|     fi | ||||
| 
 | ||||
|     # Detect Intel GPUs | ||||
|     if lspci | grep -i intel >/dev/null; then | ||||
|         echo "i915" | ||||
|         return | ||||
|     fi | ||||
| 
 | ||||
|     # If no known GPU is detected | ||||
|     echo "Unknown or unsupported GPU driver" | ||||
|     exit 1 | ||||
| } | ||||
| 
 | ||||
| # Function for rolling animation | ||||
| show_loading() { | ||||
|     local spin='-\|/' | ||||
|     local i=0 | ||||
| 
 | ||||
|     printf " " | ||||
| 
 | ||||
|     while kill -0 $1 2>/dev/null; do | ||||
|         i=$(( (i+1) %4 )) | ||||
|         printf "\b${spin:$i:1}" | ||||
|         sleep .1 | ||||
|     done | ||||
| 
 | ||||
|     # Replace the spinner with a tick | ||||
|     printf "\b${GREEN}${TICK}${NC}" | ||||
| } | ||||
| 
 | ||||
| # Usage information | ||||
| usage() { | ||||
|     echo "Usage: $0 [OPTIONS]" | ||||
|     echo "Options:" | ||||
|     echo "  --enable-gpu[count=COUNT]  Enable GPU support with the specified count." | ||||
|     echo "  --enable-api[port=PORT]    Enable API and expose it on the specified port." | ||||
|     echo "  --webui[port=PORT]         Set the port for the web user interface." | ||||
|     echo "  --data[folder=PATH]        Bind mount for ollama data folder (by default will create the 'ollama' volume)." | ||||
|     echo "  -q, --quiet                Run script in headless mode." | ||||
|     echo "  -h, --help                 Show this help message." | ||||
|     echo "" | ||||
|     echo "Examples:" | ||||
|     echo "  $0 --enable-gpu[count=1]" | ||||
|     echo "  $0 --enable-api[port=11435]" | ||||
|     echo "  $0 --enable-gpu[count=1] --enable-api[port=12345] --webui[port=3000]" | ||||
|     echo "  $0 --enable-gpu[count=1] --enable-api[port=12345] --webui[port=3000] --data[folder=./ollama-data]" | ||||
|     echo "" | ||||
|     echo "This script configures and runs a docker-compose setup with optional GPU support, API exposure, and web UI configuration." | ||||
|     echo "About the gpu to use, the script automatically detects it using the "lspci" command." | ||||
|     echo "In this case the gpu detected is: $(get_gpu_driver)" | ||||
| } | ||||
| 
 | ||||
| # Default values | ||||
| gpu_count=1 | ||||
| api_port=11435 | ||||
| webui_port=3000 | ||||
| headless=false | ||||
| 
 | ||||
| # Function to extract value from the parameter | ||||
| extract_value() { | ||||
|     echo "$1" | sed -E 's/.*\[.*=(.*)\].*/\1/; t; s/.*//' | ||||
| } | ||||
| 
 | ||||
| # Parse arguments | ||||
| while [[ $# -gt 0 ]]; do | ||||
|     key="$1" | ||||
| 
 | ||||
|     case $key in | ||||
|         --enable-gpu*) | ||||
|             enable_gpu=true | ||||
|             value=$(extract_value "$key") | ||||
|             gpu_count=${value:-1} | ||||
|             ;; | ||||
|         --enable-api*) | ||||
|             enable_api=true | ||||
|             value=$(extract_value "$key") | ||||
|             api_port=${value:-11435} | ||||
|             ;; | ||||
|         --webui*) | ||||
|             value=$(extract_value "$key") | ||||
|             webui_port=${value:-3000} | ||||
|             ;; | ||||
|         --data*) | ||||
|             value=$(extract_value "$key") | ||||
|             data_dir=${value:-"./ollama-data"} | ||||
|             ;; | ||||
|         -q|--quiet) | ||||
|             headless=true | ||||
|             ;; | ||||
|         -h|--help) | ||||
|             usage | ||||
|             exit | ||||
|             ;; | ||||
|         *) | ||||
|             # Unknown option | ||||
|             echo "Unknown option: $key" | ||||
|             usage | ||||
|             exit 1 | ||||
|             ;; | ||||
|     esac | ||||
|     shift # past argument or value | ||||
| done | ||||
| 
 | ||||
| DEFAULT_COMPOSE_COMMAND="docker compose -f docker-compose.yaml" | ||||
| if [[ $enable_gpu == true ]]; then | ||||
|     # Validate and process command-line arguments | ||||
|     if [[ -n $gpu_count ]]; then | ||||
|         if ! [[ $gpu_count =~ ^[0-9]+$ ]]; then | ||||
|             echo "Invalid GPU count: $gpu_count" | ||||
|             exit 1 | ||||
|         fi | ||||
|         # Add your GPU allocation logic here | ||||
|         export OLLAMA_GPU_DRIVER=$(get_gpu_driver) | ||||
|         export OLLAMA_GPU_COUNT=$gpu_count # Set OLLAMA_GPU_COUNT environment variable | ||||
|     fi | ||||
|     DEFAULT_COMPOSE_COMMAND+=" -f docker-compose.gpu.yaml" | ||||
| fi | ||||
| if [[ $enable_api == true ]]; then | ||||
|     DEFAULT_COMPOSE_COMMAND+=" -f docker-compose.api.yaml" | ||||
|     if [[ -n $api_port ]]; then | ||||
|         export OLLAMA_WEBAPI_PORT=$api_port # Set OLLAMA_WEBAPI_PORT environment variable | ||||
|     fi | ||||
| fi | ||||
| if [[ -n $data_dir ]]; then | ||||
|     DEFAULT_COMPOSE_COMMAND+=" -f docker-compose.data.yaml" | ||||
|     export OLLAMA_DATA_DIR=$data_dir # Set OLLAMA_DATA_DIR environment variable | ||||
| fi | ||||
| DEFAULT_COMPOSE_COMMAND+=" up -d > /dev/null 2>&1" | ||||
| 
 | ||||
| # Recap of environment variables | ||||
| echo | ||||
| echo -e "${WHITE}${BOLD}Current Setup:${NC}" | ||||
| echo -e "   ${GREEN}${BOLD}GPU Driver:${NC} ${OLLAMA_GPU_DRIVER:-Not Enabled}" | ||||
| echo -e "   ${GREEN}${BOLD}GPU Count:${NC} ${OLLAMA_GPU_COUNT:-Not Enabled}" | ||||
| echo -e "   ${GREEN}${BOLD}WebAPI Port:${NC} ${OLLAMA_WEBAPI_PORT:-Not Enabled}" | ||||
| echo -e "   ${GREEN}${BOLD}Data Folder:${NC} ${data_dir:-Using ollama volume}" | ||||
| echo -e "   ${GREEN}${BOLD}WebUI Port:${NC} $webui_port" | ||||
| echo | ||||
| 
 | ||||
| if [[ $headless == true ]]; then | ||||
|     echo -ne "${WHITE}${BOLD}Running in headless mode... ${NC}" | ||||
|     choice="y" | ||||
| else | ||||
|     # Ask for user acceptance | ||||
|     echo -ne "${WHITE}${BOLD}Do you want to proceed with current setup? (Y/n): ${NC}" | ||||
|     read -n1 -s choice | ||||
| fi | ||||
| 
 | ||||
| if [[ $choice == "" || $choice == "y" ]]; then | ||||
|     # Execute the command with the current user | ||||
|     eval "docker compose down > /dev/null 2>&1; $DEFAULT_COMPOSE_COMMAND" & | ||||
| 
 | ||||
|     # Capture the background process PID | ||||
|     PID=$! | ||||
| 
 | ||||
|     # Display the loading animation | ||||
|     show_loading $PID | ||||
| 
 | ||||
|     # Wait for the command to finish | ||||
|     wait $PID | ||||
| 
 | ||||
|     echo | ||||
|     # Check exit status | ||||
|     if [ $? -eq 0 ]; then | ||||
|         echo -e "${GREEN}${BOLD}Compose project started successfully.${NC}" | ||||
|     else | ||||
|         echo -e "${RED}${BOLD}There was an error starting the compose project.${NC}" | ||||
|     fi | ||||
| else | ||||
|     echo "Aborted." | ||||
| fi | ||||
| 
 | ||||
| echo | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue