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 # Git repositories to clone for a fresh RunPod deployment references: # AudioCraft Studio - url: https://dev.pivoine.art/valknar/audiocraft-ui.git into: $AUDIOCRAFT_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/tailscale arty setup/services arty setup/comfyui arty models/download arty models/link arty supervisor/start setup/tailscale: | echo "=========================================" echo " Setting up 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 echo " Starting Tailscale daemon..." tailscaled --tun=userspace-networking --socks5-server=localhost:1055 & 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" 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 # # 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