#!/bin/bash
# System diagnostics for MCP ComfyUI Flux - Optimized Production Setup
set -euo pipefail
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
PROJECT_NAME="${PROJECT_NAME:-mcp-comfyui-flux}"
PORT="${PORT:-8188}"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Helper functions
header() {
echo -e "\n${BLUE}=== $1 ===${NC}"
}
subheader() {
echo -e "\n${CYAN}$1${NC}"
}
success() {
echo -e "${GREEN}✓${NC} $1"
}
warning() {
echo -e "${YELLOW}⚠${NC} $1"
}
error() {
echo -e "${RED}✗${NC} $1"
}
check_command() {
if command -v "$1" >/dev/null 2>&1; then
success "$1 is installed"
return 0
else
error "$1 is not installed"
return 1
fi
}
# Main diagnostics
echo -e "${BLUE}╔══════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ MCP ComfyUI Flux - System Diagnostics ║${NC}"
echo -e "${BLUE}╚══════════════════════════════════════════════════════════╝${NC}"
echo -e "Timestamp: $(date)"
echo -e "Project: $PROJECT_NAME"
header "System Information"
subheader "Operating System:"
uname -a
if [[ -f /proc/sys/fs/binfmt_misc/WSLInterop ]]; then
success "Running in WSL2"
if [[ -f /proc/meminfo ]]; then
WSL_MEM=$(grep MemTotal /proc/meminfo | awk '{printf "%.1f", $2/1024/1024}')
echo " WSL2 Memory: ${WSL_MEM}GB"
fi
fi
header "Docker Environment"
subheader "Docker Version:"
if docker --version 2>/dev/null; then
docker --version
DOCKER_VER=$(docker --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1)
success "Docker $DOCKER_VER installed"
else
error "Docker not found"
fi
subheader "Docker Compose Version:"
if docker compose version >/dev/null 2>&1; then
docker compose version
success "Docker Compose plugin installed"
elif docker-compose --version >/dev/null 2>&1; then
docker-compose --version
warning "Using legacy docker-compose"
else
error "Docker Compose not found"
fi
subheader "Docker Daemon:"
if docker info >/dev/null 2>&1; then
success "Docker daemon is running"
echo " BuildKit: $(docker info --format '{{.ServerVersion}}' | grep -q BuildKit && echo "Enabled" || echo "Disabled")"
else
error "Docker daemon is not running"
fi
header "Container Status"
subheader "Project Containers ($PROJECT_NAME):"
if docker ps --filter "name=$PROJECT_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" | grep -q "$PROJECT_NAME"; then
docker ps --filter "name=$PROJECT_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"
# Check specific services
if docker ps --format '{{.Names}}' | grep -q "^${PROJECT_NAME}-comfyui-1$"; then
success "ComfyUI container is running"
else
warning "ComfyUI container not found"
fi
if docker ps --format '{{.Names}}' | grep -q "^${PROJECT_NAME}-mcp-server-1$"; then
success "MCP server container is running"
else
warning "MCP server container not found"
fi
else
warning "No containers running for project $PROJECT_NAME"
fi
header "Docker Images"
subheader "Project Images:"
docker images | grep -E "(mcp-comfyui|REPOSITORY)" | head -10
header "System Resources"
subheader "Disk Usage:"
AVAILABLE_SPACE=$(df -h "$PROJECT_ROOT" | awk 'NR==2 {print $4}')
USED_PERCENT=$(df -h "$PROJECT_ROOT" | awk 'NR==2 {print $5}')
echo " Available: $AVAILABLE_SPACE"
echo " Used: $USED_PERCENT"
if [[ ${USED_PERCENT%\%} -gt 90 ]]; then
warning "Disk space critically low!"
elif [[ ${USED_PERCENT%\%} -gt 80 ]]; then
warning "Disk space getting low"
else
success "Disk space adequate"
fi
subheader "Memory Usage:"
free -h
MEM_AVAILABLE=$(free -g | awk 'NR==2 {print $7}')
if [[ $MEM_AVAILABLE -lt 4 ]]; then
warning "Low available memory: ${MEM_AVAILABLE}GB"
else
success "Memory adequate: ${MEM_AVAILABLE}GB available"
fi
header "GPU Status"
if command -v nvidia-smi >/dev/null 2>&1; then
if nvidia-smi >/dev/null 2>&1; then
success "NVIDIA GPU detected"
nvidia-smi --query-gpu=name,memory.total,memory.used,temperature.gpu --format=csv,noheader
# Check if Docker has GPU access
if docker info 2>/dev/null | grep -q "nvidia"; then
success "Docker has NVIDIA runtime"
# Check if container can access GPU
if docker ps -q --filter "name=${PROJECT_NAME}-comfyui-1" >/dev/null 2>&1; then
if docker exec "${PROJECT_NAME}-comfyui-1" nvidia-smi >/dev/null 2>&1; then
success "Container has GPU access"
else
warning "Container cannot access GPU"
fi
fi
else
warning "Docker NVIDIA runtime not configured"
fi
else
warning "NVIDIA driver installed but GPU not accessible"
fi
else
warning "No NVIDIA GPU detected (CPU mode)"
fi
header "ComfyUI Service Health"
subheader "ComfyUI API (http://localhost:$PORT):"
if curl -fsS --max-time 5 "http://localhost:$PORT/system_stats" >/dev/null 2>&1; then
success "ComfyUI API is responding"
# Try to get system stats
if command -v jq >/dev/null 2>&1; then
STATS=$(curl -s "http://localhost:$PORT/system_stats" 2>/dev/null)
if [[ -n "$STATS" ]]; then
echo " System Stats:"
echo "$STATS" | jq -r '.system' 2>/dev/null | head -5 || true
fi
fi
else
error "ComfyUI API not responding on port $PORT"
fi
subheader "ComfyUI Web Interface:"
if curl -fsS --max-time 5 "http://localhost:$PORT" >/dev/null 2>&1; then
success "Web interface accessible at http://localhost:$PORT"
else
warning "Web interface not accessible"
fi
header "Models Status"
subheader "Model Directories:"
for dir in unet clip vae checkpoints loras embeddings upscale_models rmbg; do
if [[ -d "$PROJECT_ROOT/models/$dir" ]]; then
COUNT=$(find "$PROJECT_ROOT/models/$dir" -type f \( -name "*.safetensors" -o -name "*.ckpt" -o -name "*.pt" \) 2>/dev/null | wc -l)
if [[ $COUNT -gt 0 ]]; then
success "$dir: $COUNT model(s)"
else
warning "$dir: empty"
fi
else
warning "$dir: directory not found"
fi
done
# Check for specific important models
subheader "FLUX Models:"
if [[ -f "$PROJECT_ROOT/models/unet/flux1-schnell-fp8-e4m3fn.safetensors" ]]; then
success "FLUX schnell fp8 model found"
else
warning "FLUX schnell fp8 model not found"
fi
if [[ -f "$PROJECT_ROOT/models/clip/t5xxl_fp8_e4m3fn_scaled.safetensors" ]]; then
success "T5-XXL fp8 encoder found"
else
warning "T5-XXL fp8 encoder not found"
fi
header "Container Logs"
subheader "Recent ComfyUI logs:"
if docker ps -q --filter "name=${PROJECT_NAME}-comfyui-1" >/dev/null 2>&1; then
docker logs "${PROJECT_NAME}-comfyui-1" --tail 5 2>&1 | sed 's/^/ /'
# Check for specific issues in logs
if docker logs "${PROJECT_NAME}-comfyui-1" --tail 100 2>&1 | grep -q "ERROR"; then
warning "Errors found in recent logs"
else
success "No errors in recent logs"
fi
# Check PyTorch version
if docker exec "${PROJECT_NAME}-comfyui-1" python3.11 -c "import torch; print(f'PyTorch {torch.__version__}')" 2>/dev/null; then
PYTORCH_VER=$(docker exec "${PROJECT_NAME}-comfyui-1" python3.11 -c "import torch; print(torch.__version__)" 2>/dev/null)
success "PyTorch version: $PYTORCH_VER"
fi
else
warning "ComfyUI container not running"
fi
subheader "Recent MCP Server logs:"
if docker ps -q --filter "name=${PROJECT_NAME}-mcp-server-1" >/dev/null 2>&1; then
docker logs "${PROJECT_NAME}-mcp-server-1" --tail 5 2>&1 | sed 's/^/ /'
else
warning "MCP Server container not running"
fi
header "Network Configuration"
subheader "Port Status:"
if command -v ss >/dev/null 2>&1; then
if ss -lnt "( sport = :$PORT )" 2>/dev/null | grep -q LISTEN; then
success "Port $PORT is listening"
else
warning "Port $PORT is not listening"
fi
elif command -v netstat >/dev/null 2>&1; then
if netstat -an | grep -q ":$PORT.*LISTEN"; then
success "Port $PORT is listening"
else
warning "Port $PORT is not listening"
fi
fi
header "Summary"
echo -e "\n${GREEN}Diagnostics complete!${NC}"
# Overall health check
ISSUES=0
docker ps -q --filter "name=${PROJECT_NAME}-comfyui-1" >/dev/null 2>&1 || ((ISSUES++))
docker ps -q --filter "name=${PROJECT_NAME}-mcp-server-1" >/dev/null 2>&1 || ((ISSUES++))
curl -fsS --max-time 5 "http://localhost:$PORT/system_stats" >/dev/null 2>&1 || ((ISSUES++))
if [[ $ISSUES -eq 0 ]]; then
echo -e "${GREEN}✓ All systems operational${NC}"
else
echo -e "${YELLOW}⚠ Found $ISSUES issue(s) - review output above${NC}"
echo -e "\nTroubleshooting commands:"
echo " • View logs: docker compose -p $PROJECT_NAME logs -f"
echo " • Restart services: docker compose -p $PROJECT_NAME restart"
echo " • Rebuild: ./build.sh --start"
fi