diff --git a/backups/setup-ai-stack.sh b/backups/setup-ai-stack.sh index 5e0c9c8..39e5b07 100644 --- a/backups/setup-ai-stack.sh +++ b/backups/setup-ai-stack.sh @@ -2,6 +2,8 @@ set -e mkdir -p ~/ai-stack +mkdir -p ~/ai-stack/localai/models +mkdir -p ~/ai-stack/localai/config LOG_FILE=~/ai-stack/setup.log exec > >(tee -a "$LOG_FILE") 2>&1 @@ -9,26 +11,7 @@ echo "๐Ÿ“ฆ AI Stack Setup Script" echo "Log: $LOG_FILE" echo -# Containers to manage -CONTAINERS=("open-webui" "jupyterlab" "tg-webui" "comfyui") - - -# Handle update option -if [[ "$1" == "--update" ]]; then - echo "๐Ÿ”„ Updating running containers..." - for name in "${CONTAINERS[@]}"; do - if docker ps --format '{{.Names}}' | grep -q "^$name$"; then - echo "๐Ÿงผ Updating $name..." - docker pull "$(docker inspect --format='{{.Config.Image}}' $name)" - docker stop $name - docker rm $name - else - echo "โš ๏ธ Container $name is not running, skipping." - fi - done - echo "โœ… Update complete. Rerun the script without --update to restart containers." - exit 0 -fi +docker network inspect ai-stack-net >/dev/null 2>&1 || docker network create ai-stack-net check_container_running() { local name="$1" @@ -39,49 +22,261 @@ check_container_running() { return 1 } +# Handle update option +if [[ "$1" == "--update" ]]; then + echo "๐Ÿ”„ Updating containers..." + + # JupyterLab + if check_container_running "jupyterlab"; then + echo "๐Ÿงผ Updating JupyterLab..." + docker stop jupyterlab + docker rm jupyterlab + docker pull jupyter/scipy-notebook:latest + docker run -d \ + --name jupyterlab \ + --network ai-stack-net \ + --gpus all \ + -p 8888:8888 \ + -v jupyter_data:/home/jovyan/work \ + jupyter/scipy-notebook:latest + echo "โœ… JupyterLab updated." + else + echo "โš ๏ธ JupyterLab is not running, skipping update." + fi + + # --- LocalAI custom build and update --- + LOCALAI_REPO=~/git-repos/LocalAI + DOCKERFILE_URL="https://gitea.qortal.link/crowetic/AI-Dev/raw/branch/main/Dockerfile" + + echo "๐Ÿ” Rebuilding LocalAI (custom)..." + + # Backup and remove existing repo + if [ -d "$LOCALAI_REPO" ]; then + echo "๐Ÿ“ฆ Backing up existing LocalAI repo..." + mv "$LOCALAI_REPO" "${LOCALAI_REPO}_backup_$(date +%s)" + fi + + # Clone latest LocalAI + git clone https://github.com/mudler/LocalAI.git "$LOCALAI_REPO" + + # Remove default Docker-related files + cd "$LOCALAI_REPO" + rm -f Dockerfile Dockerfile.aio docker-compose.yaml + + # Prepare and build LocalAI binary + # NOTE - This portion required quite a few custom additions in order to build correctly... if you are running this from a machine that hasn't built it already, just better probably to await the implementation of the Docker-Compose methods + # Docker-compose methods will be coming soon. + echo "๐Ÿ”ง Running make prepare..." + make prepare + + # echo "๐Ÿง  Building LocalAI binary with GPU, localrecall, and localagi..." + # make build \ + # TAGS="localrecall,localagi,gpu" \ + # BACKENDS="llama-cuda whispercpp stablediffusion ollama" \ + # GPU_SUPPORT="cuda" + + + # # Download your custom Dockerfile + # echo "๐Ÿ“ฅ Downloading custom Dockerfile..." + # curl -fsSL "$DOCKERFILE_URL" -o Dockerfile + + # # Build the container + # echo "๐Ÿ”จ Building custom LocalAI Docker image..." + # docker build -t localai:custom . + + # # Remove existing container + # docker stop localai 2>/dev/null || true + # docker rm localai 2>/dev/null || true + + # # Create model and config directories if needed + # mkdir -p ~/ai-stack/localai/models + # mkdir -p ~/ai-stack/localai/config + + # # Run new container + # docker run -d \ + # --name localai \ + # --gpus all \ + # -p 8080:8080 \ + # -v ~/ai-stack/localai/models:/models \ + # -v ~/ai-stack/localai/config:/config \ + # -e ENABLE_BACKENDS=llama-cuda,ollama \ + # -e INCLUDE_DEFAULT_MODELS=true \ + # -e AUTOLOAD_MODELS=true \ + # -e MODEL_PATH=/models \ + # --restart unless-stopped \ + # localai:custom + + # echo "โœ… LocalAI (custom) is now running at http://localhost:8080" + + + # ๐Ÿ” Updating LocalAI (GPU build) + if check_container_running "localai"; then + echo "๐Ÿง  Updating LocalAI..." + docker stop localai + docker rm localai + else + echo "โž• Installing LocalAI..." + fi + + docker pull localai/localai:latest-aio-gpu-nvidia-cuda-12 + + docker run -d \ + --name localai \ + --gpus all \ + -p 8080:8080 \ + -v ~/ai-stack/localai/models:/models \ + -v ~/ai-stack/localai/config:/config \ + -e ENABLE_BACKENDS=llama-cuda,ollama \ + -e INCLUDE_DEFAULT_MODELS=true \ + -e AUTOLOAD_MODELS=true \ + -e MODEL_PATH=/models \ + --restart unless-stopped \ + localai/localai:latest-aio-gpu-nvidia-cuda-12 + + echo "โœ… LocalAI running at http://localhost:8080" + + + + echo "๐Ÿ” Updating Whisper.cpp (custom GPU build)..." + WHISPER_DIR=~/ai-stack/whisper.cpp + if [ -d "$WHISPER_DIR" ]; then + cd "$WHISPER_DIR" + git pull origin master + docker stop whispercpp-gpu 2>/dev/null || true + docker rm whispercpp-gpu 2>/dev/null || true + docker build -t whispercpp-gpu -f Dockerfile.gpu . + echo "โœ… Whisper.cpp GPU image rebuilt." + else + echo "โš ๏ธ Whisper.cpp directory not found โ€” skipping update." + fi + + echo "๐Ÿ” Updating Stable Diffusion WebUI..." + SD_DIR=~/ai-stack/stable-diffusion + if [ -d "$SD_DIR" ]; then + cd "$SD_DIR" + git pull origin master + docker stop stable-diffusion 2>/dev/null || true + docker rm stable-diffusion 2>/dev/null || true + docker build -t a1111-webui . + docker run -d --gpus all \ + --name stable-diffusion \ + --network ai-stack-net \ + -p 7860:7860 \ + -v ~/ai-stack/sd-models:/app/models/Stable-diffusion \ + -v ~/ai-stack/stable-diffusion/outputs:/app/outputs \ + a1111-webui + echo "โœ… Stable Diffusion WebUI updated and restarted." + else + echo "โš ๏ธ Stable Diffusion directory not found โ€” skipping update." + fi + + echo "๐Ÿ” Updating Text-generation-webui..." + TG_DIR=~/ai-stack/tg-webui + if [ -d "$TG_DIR" ]; then + cd "$TG_DIR" + git pull origin master + docker stop tg-webui 2>/dev/null || true + docker rm tg-webui 2>/dev/null || true + docker build -t tg-webui . + docker run -d --gpus all \ + --name tg-webui \ + --network ai-stack-net \ + -p 7861:7861 \ + -v ~/ai-stack/tg-models:/app/models \ + tg-webui + echo "โœ… Text-generation-webui updated and restarted." + else + echo "โš ๏ธ Text-generation-webui directory not found โ€” skipping update." + fi + + echo "๐Ÿ” Updating ComfyUI (custom build)..." + COMFYUI_DIR=~/ai-stack/comfyui + if [ -d "$COMFYUI_DIR" ]; then + cd "$COMFYUI_DIR" + git pull origin master + docker stop comfyui 2>/dev/null || true + docker rm comfyui 2>/dev/null || true + docker build -t comfyui-custom . + docker run -d --gpus all \ + --name comfyui \ + --network ai-stack-net \ + -p 8188:8188 \ + -v ~/ai-stack/comfyui/workspace:/app/output \ + comfyui-custom + echo "โœ… ComfyUI updated and restarted." + else + echo "โš ๏ธ ComfyUI directory not found โ€” skipping update." + fi + + echo "โœ… Update complete!" + exit 0 +fi + # Function to clean up existing container clean_container() { local name=$1 docker rm -f "$name" 2>/dev/null || true } -# ๐Ÿง  Open WebUI + Ollama -echo "๐Ÿง  Setting up Open WebUI + Ollama..." -clean_container open-webui -docker run -d -p 3000:8080 --gpus=all \ - -v ollama:/root/.ollama \ - -v open-webui:/app/backend/data \ - --name open-webui \ - --restart always \ - ghcr.io/open-webui/open-webui:ollama - -# โž• JupyterLab -read -p "โž• Install JupyterLab for Python/AI Dev? [y/N]: " jupyter -if [[ "$jupyter" =~ ^[Yy]$ ]]; then - echo "๐Ÿ“” Installing JupyterLab..." - clean_container jupyterlab - docker run -d \ - --name jupyterlab \ - --gpus all \ - -p 8888:8888 \ - -v jupyter_data:/home/jovyan/work \ - jupyter/scipy-notebook:latest - - echo "๐Ÿ” Jupyter token:" - docker logs jupyterlab 2>&1 | grep token | tee ~/ai-stack/jupyter_token.txt - echo "๐Ÿ“ Token saved to ~/ai-stack/jupyter_token.txt" +if [[ "$1" != "--update" ]]; then + if check_container_running "open-webui"; then + echo "โœ… Skipping Open WebUI + Ollama install (already running)." + else + read -p "โž• Install Open WebUI + Ollama? [y/N]: " openui + if [[ "$openui" =~ ^[Yy]$ ]]; then + echo "๐Ÿง  Setting up Open WebUI + Ollama..." + docker stop open-webui 2>/dev/null || true + docker rm open-webui 2>/dev/null || true + docker run -d -p 3000:8080 --gpus all \ + -v ollama:/root/.ollama \ + -v open-webui:/app/backend/data \ + --name open-webui \ + --network ai-stack-net \ + --restart always \ + ghcr.io/open-webui/open-webui:ollama + echo "๐ŸŒ Open WebUI running at http://localhost:3000" + fi + fi fi -# โž• Whisper.cpp with GPU Support (Build Locally) -read -p "โž• Install Whisper.cpp (GPU-accelerated, custom Docker build)? [y/N]: " whisper -if [[ "$whisper" =~ ^[Yy]$ ]]; then - echo "๐Ÿ”Š Cloning and building Whisper.cpp with GPU support..." - - WHISPER_DIR=~/ai-stack/whisper.cpp - mkdir -p ~/ai-stack - git clone https://github.com/ggerganov/whisper.cpp "$WHISPER_DIR" || true - cat > "$WHISPER_DIR/Dockerfile.gpu" </dev/null || true + docker rm jupyterlab 2>/dev/null || true + docker run -d \ + --name jupyterlab \ + --network ai-stack-net \ + --gpus all \ + -p 8888:8888 \ + -v jupyter_data:/home/jovyan/work \ + jupyter/scipy-notebook:latest + echo "๐Ÿ” Jupyter token (saved to ~/ai-stack/jupyter_token.txt):" + mkdir -p ~/ai-stack + docker logs jupyterlab 2>&1 | grep token | tee ~/ai-stack/jupyter_token.txt + fi + fi +fi + + +if [[ "$1" != "--update" ]]; then + if check_container_running "whispercpp-gpu"; then + echo "โœ… Skipping Whisper.cpp install (already running)." + else + read -p "โž• Install Whisper.cpp (GPU-accelerated, custom Docker build)? [y/N]: " whisper + if [[ "$whisper" =~ ^[Yy]$ ]]; then + echo "๐Ÿ”Š Cloning and building Whisper.cpp with GPU support..." + + WHISPER_DIR=~/ai-stack/whisper.cpp + mkdir -p "$WHISPER_DIR" + git clone https://github.com/ggerganov/whisper.cpp "$WHISPER_DIR" || true + + cat > "$WHISPER_DIR/Dockerfile.gpu" < ~/ai-stack/stable-diffusion/Dockerfile <<'EOF' +if [[ "$1" != "--update" ]]; then + if check_container_running "stable-diffusion"; then + echo "โœ… Skipping Stable Diffusion install (already running)." + else + read -p "โž• Install Stable Diffusion UI (AUTOMATIC1111, custom GPU build)? [y/N]: " sd + if [[ "$sd" =~ ^[Yy]$ ]]; then + echo "๐ŸŽจ Cloning and building AUTOMATIC1111 WebUI..." + + SD_DIR=~/ai-stack/stable-diffusion + mkdir -p ~/ai-stack + git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui "$SD_DIR" || true + cd "$SD_DIR" + + echo "๐Ÿ“„ Writing Dockerfile..." + cat > Dockerfile <<'EOF' FROM nvidia/cuda:12.2.0-base-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive -# Install dependencies RUN apt-get update && \ - apt-get install -y git python3 python3-pip python3-venv ffmpeg libgl1 libglib2.0-0 && \ + apt-get install -y git python3 python3-pip ffmpeg libgl1 libglib2.0-0 && \ apt-get clean WORKDIR /app COPY . /app -# Create venv and install deps -RUN python3 -m venv venv && \ - . venv/bin/activate && \ - pip install --upgrade pip && \ +RUN pip install --upgrade pip && \ pip install -r requirements_versions.txt && \ pip install -r requirements.txt EXPOSE 7860 - -CMD ["/bin/bash", "-c", ". venv/bin/activate && python launch.py --listen --xformers --api"] - +CMD ["/bin/bash", "-c", "python launch.py --listen --xformers --api"] EOF - echo "๐Ÿณ Building Docker image 'a1111-webui'..." - docker stop stable-diffusion 2>/dev/null || true - docker rm stable-diffusion 2>/dev/null || true - docker build -t a1111-webui . - echo "๐Ÿ“‚ Mounting model directory from ~/ai-stack/sd-models" - mkdir -p ~/ai-stack/sd-models + echo "๐Ÿณ Building Docker image 'a1111-webui'..." + docker stop stable-diffusion 2>/dev/null || true + docker rm stable-diffusion 2>/dev/null || true + docker build -t a1111-webui . - echo "๐Ÿš€ Starting Stable Diffusion WebUI..." - docker run -d --gpus all \ - --name stable-diffusion \ - -p 7860:7860 \ - -v ~/ai-stack/sd-models:/stable-diffusion-webui/models/Stable-diffusion \ - -v ~/ai-stack/stable-diffusion/outputs:/stable-diffusion-webui/outputs \ - a1111-webui + echo "๐Ÿ“‚ Mounting model directory from ~/ai-stack/sd-models" + mkdir -p ~/ai-stack/sd-models ~/ai-stack/stable-diffusion/outputs - echo "๐ŸŒ Access Stable Diffusion WebUI at http://localhost:7860" -fi + echo "๐Ÿš€ Running Stable Diffusion WebUI on port 7860..." + docker run -d --gpus all \ + --name stable-diffusion \ + --network ai-stack-net \ + -p 7860:7860 \ + -v ~/ai-stack/sd-models:/app/models/Stable-diffusion \ + -v ~/ai-stack/stable-diffusion/outputs:/app/outputs \ + a1111-webui -if [[ "$1" == "--update" ]]; then - echo "๐Ÿ” Updating Stable Diffusion WebUI..." - SD_DIR=~/ai-stack/stable-diffusion - if [ -d "$SD_DIR" ]; then - cd "$SD_DIR" - git pull origin master - docker build -t a1111-webui . - docker stop stable-diffusion 2>/dev/null || true - docker rm stable-diffusion 2>/dev/null || true - docker run -d --gpus all \ - --name stable-diffusion \ - -p 7860:7860 \ - -v ~/ai-stack/sd-models:/stable-diffusion-webui/models/Stable-diffusion \ - -v ~/ai-stack/stable-diffusion/outputs:/stable-diffusion-webui/outputs \ - a1111-webui - echo "โœ… Stable Diffusion updated and restarted." - else - echo "โš ๏ธ Stable Diffusion directory not found โ€” skipping update." + echo "๐ŸŒ Access at http://localhost:7860" + fi fi fi +if [[ "$1" != "--update" ]]; then + if check_container_running "tg-webui"; then + echo "โœ… Skipping Text-generation-webui install (already running)." + else + read -p "โž• Install Text-generation-webui? [y/N]: " tg + if [[ "$tg" =~ ^[Yy]$ ]]; then + echo "๐Ÿง  Cloning and building Text-generation-webui..." + TG_DIR=~/ai-stack/tg-webui + git clone https://github.com/oobabooga/text-generation-webui "$TG_DIR" || true + cd "$TG_DIR" -# โž• Text-generation-webui (custom Docker build with GPU + API) -read -p "โž• Install Text-generation-webui? [y/N]: " tg -if [[ "$tg" =~ ^[Yy]$ ]]; then - echo "๐Ÿงช Cloning and building Text-generation-webui..." - - TG_DIR=~/ai-stack/tg-webui - git clone https://github.com/oobabooga/text-generation-webui "$TG_DIR" || true - cd "$TG_DIR" - - echo "๐Ÿ“ Creating Dockerfile for build..." - cat > Dockerfile <<'EOF' + echo "๐Ÿ“„ Writing Dockerfile..." + cat > Dockerfile <<'EOF' FROM nvidia/cuda:12.2.0-base-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive @@ -222,65 +387,161 @@ RUN apt-get update && \ WORKDIR /app COPY . /app -# Install dependencies RUN pip install --upgrade pip && \ (pip install -r requirements.txt || pip install torch torchvision torchaudio sentencepiece transformers) EXPOSE 7861 - CMD ["/bin/bash", "-c", "python server.py --listen --api"] EOF - echo "๐Ÿณ Building Docker image 'tg-webui'..." - docker stop tg-webui 2>/dev/null || true - docker rm tg-webui 2>/dev/null || true - docker build -t tg-webui . + echo "๐Ÿณ Building Docker image 'tg-webui'..." + docker stop tg-webui 2>/dev/null || true + docker rm tg-webui 2>/dev/null || true + docker build -t tg-webui . - echo "๐Ÿ“‚ Mounting model directory from ~/ai-stack/tg-models" - mkdir -p ~/ai-stack/tg-models + echo "๐Ÿ“‚ Mounting model directory from ~/ai-stack/tg-models" + mkdir -p ~/ai-stack/tg-models - echo "๐Ÿš€ Running text-generation-webui on port 7861..." - docker run -d --gpus all \ - --name tg-webui \ - -p 7861:7861 \ - -v ~/ai-stack/tg-models:/app/models \ - tg-webui + echo "๐Ÿš€ Running text-generation-webui on port 7861..." + docker run -d --gpus all \ + --name tg-webui \ + --network ai-stack-net \ + -p 7861:7861 \ + -v ~/ai-stack/tg-models:/app/models \ + tg-webui - echo "๐ŸŒ Access at http://localhost:7861" + echo "๐ŸŒ Access at http://localhost:7861" + fi + fi fi -echo "๐Ÿ” Updating Text-generation-webui..." -TG_DIR=~/ai-stack/tg-webui -if [ -d "$TG_DIR" ]; then - cd "$TG_DIR" - git pull origin master - docker stop tg-webui 2>/dev/null || true - docker rm tg-webui 2>/dev/null || true - docker build -t tg-webui . - docker run -d --gpus all \ - --name tg-webui \ - -p 7861:7861 \ - -v ~/ai-stack/tg-models:/app/models \ - tg-webui - echo "โœ… Text-generation-webui updated and restarted." -else - echo "โš ๏ธ Text-generation-webui directory not found โ€” skipping update." + +if [[ "$1" != "--update" ]]; then + if check_container_running "comfyui"; then + echo "โœ… Skipping ComfyUI install (already running)." + else + read -p "โž• Install ComfyUI (custom Docker build)? [y/N]: " comfy + if [[ "$comfy" =~ ^[Yy]$ ]]; then + echo "๐Ÿงฉ Cloning and building ComfyUI..." + + COMFYUI_DIR=~/ai-stack/comfyui + git clone https://github.com/comfyanonymous/ComfyUI "$COMFYUI_DIR" || true + cd "$COMFYUI_DIR" + + echo "๐Ÿ“„ Writing Dockerfile..." + cat > Dockerfile <<'EOF' +FROM nvidia/cuda:12.2.0-base-ubuntu22.04 + +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get update && \ + apt-get install -y git python3 python3-pip ffmpeg libgl1 libglib2.0-0 && \ + apt-get clean + +WORKDIR /app +COPY . /app + +RUN pip install --upgrade pip && pip install -r requirements.txt + +EXPOSE 8188 +CMD ["python3", "main.py", "--listen", "--port", "8188"] +EOF + + echo "๐Ÿณ Building Docker image 'comfyui-custom'..." + docker stop comfyui 2>/dev/null || true + docker rm comfyui 2>/dev/null || true + docker build -t comfyui-custom . + + echo "๐Ÿ“‚ Preparing workspace volume..." + mkdir -p ~/ai-stack/comfyui/workspace + + echo "๐Ÿš€ Running ComfyUI on port 8188..." + docker run -d --gpus all \ + --name comfyui \ + --network ai-stack-net \ + -p 8188:8188 \ + -v ~/ai-stack/comfyui/workspace:/app/output \ + comfyui-custom + + echo "๐ŸŒ ComfyUI running at http://localhost:8188" + fi + fi fi +if [[ "$1" != "--update" ]]; then + if check_container_running "localai"; then + echo "โœ… Skipping LocalAI install (already running)." + else + read -p "โž• Install LocalAI (GPU-accelerated)? [y/N]: " localai_prompt + if [[ "$localai_prompt" =~ ^[Yy]$ ]]; then + echo "๐Ÿง  Installing LocalAI (NVIDIA CUDA 12)..." + + mkdir -p ~/ai-stack/localai/models + mkdir -p ~/ai-stack/localai/config -# โž• ComfyUI (Docker - graph-based Stable Diffusion) -read -p "โž• Install ComfyUI (graph-based Stable Diffusion UI)? [y/N]: " comfy -if [[ "$comfy" =~ ^[Yy]$ ]]; then - echo "๐Ÿงฉ Installing ComfyUI (Docker)..." - clean_container comfyui - docker run -d --gpus all \ - --name comfyui \ - -p 8188:8188 \ - -v comfyui_data:/workspace \ - ghcr.io/cmdr2/comfyui:latest - echo "๐ŸŒ ComfyUI running at http://localhost:8188" + echo "๐Ÿ“„ Creating default models.yaml..." +# cat > ~/ai-stack/localai/config/models.yaml </dev/null || true - # docker rm localai 2>/dev/null || true - - # # Create model and config directories if needed - # mkdir -p ~/ai-stack/localai/models - # mkdir -p ~/ai-stack/localai/config - - # # Run new container - # docker run -d \ - # --name localai \ - # --gpus all \ - # -p 8080:8080 \ - # -v ~/ai-stack/localai/models:/models \ - # -v ~/ai-stack/localai/config:/config \ - # -e ENABLE_BACKENDS=llama-cuda,ollama \ - # -e INCLUDE_DEFAULT_MODELS=true \ - # -e AUTOLOAD_MODELS=true \ - # -e MODEL_PATH=/models \ - # --restart unless-stopped \ - # localai:custom - - # echo "โœ… LocalAI (custom) is now running at http://localhost:8080" - - - # ๐Ÿ” Updating LocalAI (GPU build) - if check_container_running "localai"; then - echo "๐Ÿง  Updating LocalAI..." - docker stop localai - docker rm localai - else - echo "โž• Installing LocalAI..." - fi - - docker pull localai/localai:latest-aio-gpu-nvidia-cuda-12 - - docker run -d \ - --name localai \ - --gpus all \ - -p 8080:8080 \ - -v ~/ai-stack/localai/models:/models \ - -v ~/ai-stack/localai/config:/config \ - -e ENABLE_BACKENDS=llama-cuda,ollama \ - -e INCLUDE_DEFAULT_MODELS=true \ - -e AUTOLOAD_MODELS=true \ - -e MODEL_PATH=/models \ - --restart unless-stopped \ - localai/localai:latest-aio-gpu-nvidia-cuda-12 - - echo "โœ… LocalAI running at http://localhost:8080" - - - - echo "๐Ÿ” Updating Whisper.cpp (custom GPU build)..." + # whisper-cpp + echo "๐Ÿ” Updating Whisper.cpp (custom GPU build)..." WHISPER_DIR=~/ai-stack/whisper.cpp if [ -d "$WHISPER_DIR" ]; then - cd "$WHISPER_DIR" - git pull origin master - docker stop whispercpp-gpu 2>/dev/null || true - docker rm whispercpp-gpu 2>/dev/null || true - docker build -t whispercpp-gpu -f Dockerfile.gpu . - echo "โœ… Whisper.cpp GPU image rebuilt." + cd "$WHISPER_DIR" + git pull origin master + docker stop whispercpp-gpu 2>/dev/null || true + docker rm whispercpp-gpu 2>/dev/null || true + docker build -t whispercpp-gpu -f Dockerfile.gpu . + echo "โœ… Whisper.cpp GPU image rebuilt." else - echo "โš ๏ธ Whisper.cpp directory not found โ€” skipping update." + echo "โš ๏ธ Whisper.cpp directory not found โ€” skipping update." fi + # stable-diffusion echo "๐Ÿ” Updating Stable Diffusion WebUI..." SD_DIR=~/ai-stack/stable-diffusion if [ -d "$SD_DIR" ]; then - cd "$SD_DIR" - git pull origin master - docker stop stable-diffusion 2>/dev/null || true - docker rm stable-diffusion 2>/dev/null || true - docker build -t a1111-webui . - docker run -d --gpus all \ - --name stable-diffusion \ + cd "$SD_DIR" + git pull origin master + docker stop stable-diffusion 2>/dev/null || true + docker rm stable-diffusion 2>/dev/null || true + docker build -t a1111-webui . + docker run -d --gpus all \ + --name stable-diffusion \ --network ai-stack-net \ - -p 7860:7860 \ - -v ~/ai-stack/sd-models:/app/models/Stable-diffusion \ - -v ~/ai-stack/stable-diffusion/outputs:/app/outputs \ - a1111-webui - echo "โœ… Stable Diffusion WebUI updated and restarted." - else - echo "โš ๏ธ Stable Diffusion directory not found โ€” skipping update." - fi - + -p 7860:7860 \ + -v ~/ai-stack/sd-models:/app/models/Stable-diffusion \ + -v ~/ai-stack/stable-diffusion/outputs:/app/outputs \ + a1111-webui + echo "โœ… Stable Diffusion WebUI updated and restarted." + else + echo "โš ๏ธ Stable Diffusion directory not found โ€” skipping update." + fi + + # tg-webui echo "๐Ÿ” Updating Text-generation-webui..." TG_DIR=~/ai-stack/tg-webui if [ -d "$TG_DIR" ]; then - cd "$TG_DIR" - git pull origin master - docker stop tg-webui 2>/dev/null || true - docker rm tg-webui 2>/dev/null || true - docker build -t tg-webui . - docker run -d --gpus all \ - --name tg-webui \ + cd "$TG_DIR" + git pull origin master + docker stop tg-webui 2>/dev/null || true + docker rm tg-webui 2>/dev/null || true + docker build -t tg-webui . + docker run -d --gpus all \ + --name tg-webui \ --network ai-stack-net \ - -p 7861:7861 \ - -v ~/ai-stack/tg-models:/app/models \ - tg-webui - echo "โœ… Text-generation-webui updated and restarted." + -p 7861:7861 \ + -v ~/ai-stack/tg-models:/app/models \ + tg-webui + echo "โœ… Text-generation-webui updated and restarted." else - echo "โš ๏ธ Text-generation-webui directory not found โ€” skipping update." + echo "โš ๏ธ Text-generation-webui directory not found โ€” skipping update." fi + # comfyui echo "๐Ÿ” Updating ComfyUI (custom build)..." COMFYUI_DIR=~/ai-stack/comfyui if [ -d "$COMFYUI_DIR" ]; then - cd "$COMFYUI_DIR" - git pull origin master - docker stop comfyui 2>/dev/null || true - docker rm comfyui 2>/dev/null || true - docker build -t comfyui-custom . - docker run -d --gpus all \ - --name comfyui \ + cd "$COMFYUI_DIR" + git pull origin master + docker stop comfyui 2>/dev/null || true + docker rm comfyui 2>/dev/null || true + docker build -t comfyui-custom . + docker run -d --gpus all \ + --name comfyui \ --network ai-stack-net \ - -p 8188:8188 \ - -v ~/ai-stack/comfyui/workspace:/app/output \ - comfyui-custom - echo "โœ… ComfyUI updated and restarted." + -p 8188:8188 \ + -v ~/ai-stack/comfyui/workspace:/app/output \ + comfyui-custom + echo "โœ… ComfyUI updated and restarted." else - echo "โš ๏ธ ComfyUI directory not found โ€” skipping update." + echo "โš ๏ธ ComfyUI directory not found โ€” skipping update." fi - + echo "โœ… Update complete!" exit 0 fi @@ -218,6 +187,10 @@ clean_container() { docker rm -f "$name" 2>/dev/null || true } +# Handle INSTALL (no --update passed) ------------------------------------------------------------------------INSTALL SECTION BELOW + + +# open-webui INSTALL if [[ "$1" != "--update" ]]; then if check_container_running "open-webui"; then echo "โœ… Skipping Open WebUI + Ollama install (already running)." @@ -240,6 +213,7 @@ if [[ "$1" != "--update" ]]; then fi +# jupyterlab INSTALL if [[ "$1" != "--update" ]]; then if check_container_running "jupyterlab"; then echo "โœ… Skipping JupyterLab install (already running)." @@ -271,11 +245,11 @@ if [[ "$1" != "--update" ]]; then read -p "โž• Install Whisper.cpp (GPU-accelerated, custom Docker build)? [y/N]: " whisper if [[ "$whisper" =~ ^[Yy]$ ]]; then echo "๐Ÿ”Š Cloning and building Whisper.cpp with GPU support..." - + WHISPER_DIR=~/ai-stack/whisper.cpp mkdir -p "$WHISPER_DIR" git clone https://github.com/ggerganov/whisper.cpp "$WHISPER_DIR" || true - + cat > "$WHISPER_DIR/Dockerfile.gpu" < Dockerfile <<'EOF' FROM nvidia/cuda:12.2.0-base-ubuntu22.04 @@ -339,15 +314,15 @@ RUN pip install --upgrade pip && \ EXPOSE 7860 CMD ["/bin/bash", "-c", "python launch.py --listen --xformers --api"] EOF - + echo "๐Ÿณ Building Docker image 'a1111-webui'..." docker stop stable-diffusion 2>/dev/null || true docker rm stable-diffusion 2>/dev/null || true docker build -t a1111-webui . - + echo "๐Ÿ“‚ Mounting model directory from ~/ai-stack/sd-models" mkdir -p ~/ai-stack/sd-models ~/ai-stack/stable-diffusion/outputs - + echo "๐Ÿš€ Running Stable Diffusion WebUI on port 7860..." docker run -d --gpus all \ --name stable-diffusion \ @@ -356,12 +331,14 @@ EOF -v ~/ai-stack/sd-models:/app/models/Stable-diffusion \ -v ~/ai-stack/stable-diffusion/outputs:/app/outputs \ a1111-webui - + echo "๐ŸŒ Access at http://localhost:7860" fi fi fi + +# tg-webui INSTALL if [[ "$1" != "--update" ]]; then if check_container_running "tg-webui"; then echo "โœ… Skipping Text-generation-webui install (already running)." @@ -369,11 +346,11 @@ if [[ "$1" != "--update" ]]; then read -p "โž• Install Text-generation-webui? [y/N]: " tg if [[ "$tg" =~ ^[Yy]$ ]]; then echo "๐Ÿง  Cloning and building Text-generation-webui..." - + TG_DIR=~/ai-stack/tg-webui git clone https://github.com/oobabooga/text-generation-webui "$TG_DIR" || true cd "$TG_DIR" - + echo "๐Ÿ“„ Writing Dockerfile..." cat > Dockerfile <<'EOF' FROM nvidia/cuda:12.2.0-base-ubuntu22.04 @@ -393,15 +370,15 @@ RUN pip install --upgrade pip && \ EXPOSE 7861 CMD ["/bin/bash", "-c", "python server.py --listen --api"] EOF - + echo "๐Ÿณ Building Docker image 'tg-webui'..." docker stop tg-webui 2>/dev/null || true docker rm tg-webui 2>/dev/null || true docker build -t tg-webui . - + echo "๐Ÿ“‚ Mounting model directory from ~/ai-stack/tg-models" mkdir -p ~/ai-stack/tg-models - + echo "๐Ÿš€ Running text-generation-webui on port 7861..." docker run -d --gpus all \ --name tg-webui \ @@ -409,14 +386,14 @@ EOF -p 7861:7861 \ -v ~/ai-stack/tg-models:/app/models \ tg-webui - + echo "๐ŸŒ Access at http://localhost:7861" fi fi fi - +# comfy ui INSTALL if [[ "$1" != "--update" ]]; then if check_container_running "comfyui"; then echo "โœ… Skipping ComfyUI install (already running)." @@ -424,11 +401,11 @@ if [[ "$1" != "--update" ]]; then read -p "โž• Install ComfyUI (custom Docker build)? [y/N]: " comfy if [[ "$comfy" =~ ^[Yy]$ ]]; then echo "๐Ÿงฉ Cloning and building ComfyUI..." - + COMFYUI_DIR=~/ai-stack/comfyui git clone https://github.com/comfyanonymous/ComfyUI "$COMFYUI_DIR" || true cd "$COMFYUI_DIR" - + echo "๐Ÿ“„ Writing Dockerfile..." cat > Dockerfile <<'EOF' FROM nvidia/cuda:12.2.0-base-ubuntu22.04 @@ -447,15 +424,14 @@ RUN pip install --upgrade pip && pip install -r requirements.txt EXPOSE 8188 CMD ["python3", "main.py", "--listen", "--port", "8188"] EOF - echo "๐Ÿณ Building Docker image 'comfyui-custom'..." docker stop comfyui 2>/dev/null || true docker rm comfyui 2>/dev/null || true docker build -t comfyui-custom . - + echo "๐Ÿ“‚ Preparing workspace volume..." mkdir -p ~/ai-stack/comfyui/workspace - + echo "๐Ÿš€ Running ComfyUI on port 8188..." docker run -d --gpus all \ --name comfyui \ @@ -463,12 +439,14 @@ EOF -p 8188:8188 \ -v ~/ai-stack/comfyui/workspace:/app/output \ comfyui-custom - + echo "๐ŸŒ ComfyUI running at http://localhost:8188" fi fi fi + +# localai INSTALL if [[ "$1" != "--update" ]]; then if check_container_running "localai"; then echo "โœ… Skipping LocalAI install (already running)." @@ -479,20 +457,13 @@ if [[ "$1" != "--update" ]]; then mkdir -p ~/ai-stack/localai/models mkdir -p ~/ai-stack/localai/config - - echo "๐Ÿ“„ Creating default models.yaml..." -# cat > ~/ai-stack/localai/config/models.yaml <