Files
Sebastian Krüger 875c25d802
All checks were successful
Build and Push RunPod Docker Image / build-and-push (push) Successful in 15s
fix: tailscale stale dir
2025-11-27 23:37:36 +01:00

254 lines
8.9 KiB
YAML

name: "RunPod AI Service Orchestrator"
version: "0.1.0"
description: "Process-based AI service orchestrator for RunPod GPU instances with ComfyUI integration"
author: "valknar@pivoine.art"
license: "MIT"
# Environment profiles for selective repository management
envs:
# RunPod environment variables
default:
COMFYUI_ROOT: services/comfyui
AUDIOCRAFT_ROOT: services/audiocraft
UPSCALE_ROOT: services/upscale
# Git repositories to clone for a fresh RunPod deployment
references:
# AudioCraft Studio
- url: https://dev.pivoine.art/valknar/audiocraft-ui.git
into: $AUDIOCRAFT_ROOT
# Upscale UI
- url: https://dev.pivoine.art/valknar/upscale-ui.git
into: $UPSCALE_ROOT
# ComfyUI base installation
- url: https://github.com/comfyanonymous/ComfyUI.git
into: $COMFYUI_ROOT
description: "ComfyUI - Node-based interface for image/video/audio generation"
# ComfyUI Essential Custom Nodes
- url: https://github.com/ltdrdata/ComfyUI-Manager.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-Manager
description: "ComfyUI Manager - Install/manage custom nodes and models"
- url: https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-VideoHelperSuite
description: "Video operations and processing"
- url: https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-AnimateDiff-Evolved
description: "AnimateDiff for video generation"
- url: https://github.com/cubiq/ComfyUI_IPAdapter_plus.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI_IPAdapter_plus
description: "IP-Adapter for style transfer"
- url: https://github.com/ltdrdata/ComfyUI-Impact-Pack.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-Impact-Pack
description: "Auto face enhancement and detailer"
# ComfyUI Optional Custom Nodes
- url: https://github.com/kijai/ComfyUI-CogVideoXWrapper.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-CogVideoXWrapper
description: "CogVideoX integration for text-to-video"
- url: https://github.com/ltdrdata/ComfyUI-Inspire-Pack.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-Inspire-Pack
description: "Additional inspiration tools"
- url: https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-Advanced-ControlNet
description: "Advanced ControlNet features"
- url: https://github.com/MrForExample/ComfyUI-3D-Pack.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-3D-Pack
description: "3D asset generation"
- url: https://github.com/ssitu/ComfyUI_UltimateSDUpscale.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI_UltimateSDUpscale
description: "Ultimate SD Upscale for high-quality image upscaling"
- url: https://github.com/kijai/ComfyUI-KJNodes.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-KJNodes
description: "Kijai optimizations for HunyuanVideo and Wan2.2 (FP8 scaling, video helpers, model loading)"
- url: https://github.com/Fannovel16/comfyui_controlnet_aux.git
into: $COMFYUI_ROOT/custom_nodes/comfyui_controlnet_aux
description: "ControlNet preprocessors (Canny, Depth, OpenPose, MLSD) for Wan2.2 Fun Control"
- url: https://github.com/city96/ComfyUI-GGUF.git
into: $COMFYUI_ROOT/custom_nodes/ComfyUI-GGUF
description: "GGUF quantization support for memory-efficient model loading"
- url: https://github.com/11cafe/comfyui-workspace-manager.git
into: $COMFYUI_ROOT/custom_nodes/comfyui-workspace-manager
description: "Workspace manager for ComfyUI - workflow/model organization"
- url: https://dev.pivoine.art/valknar/comfyui-extras.git
into: $COMFYUI_ROOT/custom_nodes/comfyui-extras
# Deployment scripts for RunPod instances
scripts:
setup: |
arty deps
arty setup/services
arty setup/comfyui
arty models/download
arty models/link
setup/services: |
echo "========================================="
echo " Setting up services python venvs"
echo "========================================="
echo ""
# Install dependencies for each custom node
echo "Setting up venvs for all services..."
cd services
installed_count=0
skipped_count=0
for dir in */; do
cd $dir
python3 -m venv venv && source venv/bin/activate
pip install --upgrade pip
if [ -f "requirements.txt" ]; then
echo ""
echo "📦 Installing ${dir%/} dependencies..."
if pip install -r "requirements.txt"; then
installed_count=$((installed_count + 1))
echo " ✓ ${dir%/} dependencies installed"
else
echo " ⚠ Warning: Some dependencies for ${dir%/} may have failed"
installed_count=$((installed_count + 1))
fi
else
skipped_count=$((skipped_count + 1))
fi
deactivate
cd -
done
echo ""
echo "✓ Service environments configured successfully"
echo " Services with dependencies: $installed_count"
echo " Services without requirements.txt: $skipped_count"
setup/comfyui: |
echo "========================================="
echo " Setting up ComfyUI"
echo "========================================="
echo ""
cd $COMFYUI_ROOT
# Activate ComfyUI venv
if [ ! -d "venv" ]; then
echo "❌ ERROR: ComfyUI venv not found. Run setup/venvs first!"
exit 1
fi
source venv/bin/activate
# Install common extension dependencies
echo "Installing common extension dependencies..."
pip install GitPython opencv-python-headless diffusers insightface onnxruntime
# Create model directory structure
echo "Creating ComfyUI model directories..."
mkdir -p $COMFYUI_ROOT/models/{checkpoints,unet,vae,loras,clip,clip_vision,controlnet,ipadapter,embeddings,upscale_models,video_models,animatediff_models,animatediff_motion_lora,audio_models,configs,diffusers,diffusion_models,musicgen,latent_upscale_models}
# Install dependencies for each custom node
echo "Installing dependencies for all custom nodes..."
cd custom_nodes
installed_count=0
skipped_count=0
for dir in */; do
if [ -f "${dir}requirements.txt" ]; then
echo ""
echo "📦 Installing ${dir%/} dependencies..."
if pip install -r "${dir}requirements.txt"; then
installed_count=$((installed_count + 1))
echo " ✓ ${dir%/} dependencies installed"
else
echo " ⚠ Warning: Some dependencies for ${dir%/} may have failed"
installed_count=$((installed_count + 1))
fi
else
skipped_count=$((skipped_count + 1))
fi
done
deactivate
echo ""
echo "✓ Extension dependencies installation complete"
echo " Extensions with dependencies: $installed_count"
echo " Extensions without requirements.txt: $skipped_count"
models/download: |
artifact_civitai_download.sh download -c ./models/models_civitai.yaml --cache-dir ./.cache/civitai
artifact_huggingface_download.sh download -c ./models/models_huggingface.yaml --cache-dir ./.cache/huggingface
models/link: |
artifact_civitai_download.sh link -c ./models/models_civitai.yaml --cache-dir $PWD/.cache/civitai --output-dir ./services/comfyui/models
artifact_huggingface_download.sh link -c ./models/models_huggingface.yaml --cache-dir $PWD/.cache/huggingface --output-dir ./services/comfyui/models
tailscale/start: |
echo "========================================="
echo " Starting tailscale"
echo "========================================="
echo ""
if [ ! "$TAILSCALE_AUTHKEY" ]; then
echo " ⚠ Tailscale disabled (no TAILSCALE_AUTHKEY in env)"
echo " Services requiring VPN connectivity will not work"
exit 1
fi
# Persist Tailscale state to network volume for stable IP across restarts
TAILSCALE_STATE="/workspace/.tailscale"
mkdir -p "$TAILSCALE_STATE"
echo " Starting Tailscale daemon..."
tailscaled --tun=userspace-networking --socks5-server=localhost:1055 --statedir="$TAILSCALE_STATE" &
sleep 3
echo " Connecting to Tailscale network..."
HOSTNAME="runpod-ai-orchestrator"
tailscale up --authkey="$TAILSCALE_AUTHKEY" --advertise-tags=tag:gpu --hostname="$HOSTNAME" || {
echo " ⚠ Tailscale connection failed, continuing without VPN"
}
# Get Tailscale IP if connected
TAILSCALE_IP=$(tailscale ip -4 2>/dev/null || echo "not connected")
if [ "$TAILSCALE_IP" == "not connected" ]; then
echo " ⚠ Tailscale failed to obtain IP"
exit 1
fi
echo " ✓ Tailscale connected"
echo " Hostname: $HOSTNAME"
echo " IP: $TAILSCALE_IP"
#
# Supervisor Control Scripts
#
supervisor/start: |
mkdir -p .logs/
supervisord -c supervisord.conf
supervisor/stop: |
supervisorctl -c supervisord.conf shutdown
supervisor/status: |
supervisorctl -c supervisord.conf status
supervisor/restart: |
supervisorctl -c supervisord.conf restart all
supervisor/reload: |
supervisorctl -c supervisord.conf reload