Spaces:
Paused
Paused
| # Felix Framework - ZeroGPU Optimized Dockerfile for HuggingFace Spaces | |
| # Multi-stage build for optimized production deployment | |
| # Build stage for dependency compilation | |
| FROM python:3.12-slim as builder | |
| # Set build-time variables | |
| ARG TORCH_VERSION=2.0.1 | |
| ARG CUDA_VERSION=cu118 | |
| # Install build dependencies | |
| RUN apt-get update && apt-get install -y \ | |
| build-essential \ | |
| git \ | |
| curl \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # Create virtual environment | |
| RUN python -m venv /opt/venv | |
| ENV PATH="/opt/venv/bin:$PATH" | |
| # Upgrade pip and install wheel | |
| RUN pip install --no-cache-dir --upgrade pip wheel setuptools | |
| # Install PyTorch with CUDA support for ZeroGPU | |
| RUN pip install --no-cache-dir \ | |
| torch==${TORCH_VERSION} \ | |
| torchvision \ | |
| torchaudio \ | |
| --index-url https://download.pytorch.org/whl/${CUDA_VERSION} | |
| # Copy requirements and install Python dependencies | |
| COPY requirements.txt /tmp/requirements.txt | |
| RUN pip install --no-cache-dir -r /tmp/requirements.txt | |
| # Production stage | |
| FROM python:3.12-slim as runtime | |
| # Set production environment variables | |
| ENV PYTHONDONTWRITEBYTECODE=1 \ | |
| PYTHONUNBUFFERED=1 \ | |
| PYTHONPATH="/app:$PYTHONPATH" \ | |
| PATH="/opt/venv/bin:$PATH" \ | |
| ENVIRONMENT=production \ | |
| PORT=7860 | |
| # Install runtime dependencies | |
| RUN apt-get update && apt-get install -y \ | |
| # Essential system libraries | |
| libgomp1 \ | |
| libgl1-mesa-glx \ | |
| libglib2.0-0 \ | |
| libsm6 \ | |
| libxext6 \ | |
| libxrender-dev \ | |
| libfontconfig1 \ | |
| # CUDA runtime libraries (for ZeroGPU) | |
| libcudnn8 \ | |
| # Network utilities | |
| curl \ | |
| wget \ | |
| # Process monitoring | |
| htop \ | |
| && rm -rf /var/lib/apt/lists/* | |
| # Create non-root user for security | |
| RUN groupadd -r felix && useradd -r -g felix -m -s /bin/bash felix | |
| # Copy virtual environment from builder | |
| COPY --from=builder /opt/venv /opt/venv | |
| # Set working directory | |
| WORKDIR /app | |
| # Copy application files with proper ownership | |
| COPY --chown=felix:felix . /app/ | |
| # Create necessary directories | |
| RUN mkdir -p /app/logs /app/cache /app/tmp && \ | |
| chown -R felix:felix /app/logs /app/cache /app/tmp | |
| # Create performance monitoring directories | |
| RUN mkdir -p /app/metrics /app/benchmarks && \ | |
| chown -R felix:felix /app/metrics /app/benchmarks | |
| # Verify Felix Framework core components | |
| RUN python -c " | |
| import sys | |
| sys.path.insert(0, '/app') | |
| try: | |
| from src.core.helix_geometry import HelixGeometry | |
| helix = HelixGeometry(33.0, 0.001, 100.0, 33) | |
| pos = helix.get_position_at_t(0.5) | |
| print(f'✅ Felix core validation successful: position {pos}') | |
| except Exception as e: | |
| print(f'❌ Felix core validation failed: {e}') | |
| sys.exit(1) | |
| " | |
| # Verify ZeroGPU compatibility | |
| RUN python -c " | |
| import torch | |
| import sys | |
| print(f'🔧 PyTorch version: {torch.__version__}') | |
| print(f'🔧 CUDA available: {torch.cuda.is_available()}') | |
| if torch.cuda.is_available(): | |
| print(f'🎮 CUDA version: {torch.version.cuda}') | |
| print(f'🎮 GPU count: {torch.cuda.device_count()}') | |
| else: | |
| print('⚠️ CUDA not available in container (normal for build stage)') | |
| # Test spaces import | |
| try: | |
| import spaces | |
| print('✅ Spaces module available for ZeroGPU') | |
| except ImportError: | |
| print('⚠️ Spaces module not available (will use mock in development)') | |
| print('🌪️ Felix Framework Docker build completed successfully') | |
| " | |
| # Create startup script for health monitoring | |
| RUN cat > /app/startup.sh << 'EOF' | |
| #!/bin/bash | |
| set -e | |
| echo "🌪️ Starting Felix Framework..." | |
| echo "Environment: $ENVIRONMENT" | |
| echo "Port: $PORT" | |
| echo "ZeroGPU: ${SPACES_ZERO_GPU:-false}" | |
| # Health check function | |
| health_check() { | |
| python -c " | |
| import sys | |
| sys.path.insert(0, '/app') | |
| from app import health_check | |
| result = health_check() | |
| if result['status'] == 'healthy': | |
| print('✅ Health check passed') | |
| exit(0) | |
| else: | |
| print('❌ Health check failed') | |
| exit(1) | |
| " | |
| } | |
| # Start background health monitoring | |
| ( | |
| while true; do | |
| sleep 30 | |
| health_check || echo "⚠️ Health check warning at $(date)" | |
| done | |
| ) & | |
| # Log system information | |
| python -c " | |
| import sys | |
| sys.path.insert(0, '/app') | |
| from app import get_system_info | |
| import json | |
| info = get_system_info() | |
| print('🔍 System Information:') | |
| print(json.dumps(info, indent=2)) | |
| " | |
| # Start the application | |
| exec python app.py "$@" | |
| EOF | |
| RUN chmod +x /app/startup.sh | |
| # Switch to non-root user | |
| USER felix | |
| # Health check endpoint | |
| HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ | |
| CMD curl -f http://localhost:${PORT}/health || exit 1 | |
| # Expose port for HuggingFace Spaces | |
| EXPOSE ${PORT} | |
| # Labels for container metadata | |
| LABEL org.opencontainers.image.title="Felix Framework - ZeroGPU" | |
| LABEL org.opencontainers.image.description="Helix-based multi-agent cognitive architecture with ZeroGPU acceleration" | |
| LABEL org.opencontainers.image.version="1.0.0" | |
| LABEL org.opencontainers.image.authors="Felix Framework Contributors" | |
| LABEL org.opencontainers.image.url="https://github.com/CalebisGross/thefelix" | |
| LABEL org.opencontainers.image.source="https://github.com/CalebisGross/thefelix" | |
| LABEL org.opencontainers.image.vendor="Felix Framework" | |
| LABEL org.opencontainers.image.licenses="MIT" | |
| # Performance optimization labels | |
| LABEL felix.framework.version="1.0.0" | |
| LABEL felix.zerogpu.enabled="true" | |
| LABEL felix.optimization.level="production" | |
| LABEL felix.architecture="helix-based" | |
| # Set default command | |
| CMD ["/app/startup.sh"] |