# ═══════════════════════════════════════════════════════════════ # Proxy Bidireccional OpenAI ↔ Anthropic # Optimizado para Hugging Face Spaces (Docker SDK) # ═══════════════════════════════════════════════════════════════ # ──── Etapa 1: Base ligera ──── FROM python:3.11-slim AS base # Evitar prompts interactivos y buffering en logs ENV DEBIAN_FRONTEND=noninteractive \ PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # Dependencias del sistema mínimas RUN apt-get update && \ apt-get install -y --no-install-recommends \ ca-certificates \ curl && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* # ──── Etapa 2: Dependencias Python ──── FROM base AS dependencies WORKDIR /tmp COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # ──── Etapa 3: Aplicación ──── FROM base AS production # ───────────────────────────────────────────────────────── # Hugging Face Spaces requiere: # • Usuario con UID 1000 # • Puerto 7860 # • Directorio de trabajo /home/user/app # ───────────────────────────────────────────────────────── # Crear usuario no-root (requerido por HF) RUN useradd -m -u 1000 user # Copiar paquetes Python instalados desde etapa anterior COPY --from=dependencies /usr/local/lib/python3.11/site-packages \ /usr/local/lib/python3.11/site-packages COPY --from=dependencies /usr/local/bin /usr/local/bin # Directorio de trabajo de HF Spaces WORKDIR /home/user/app # Copiar código fuente COPY --chown=user:user proxy.py . COPY --chown=user:user requirements.txt . # ───────────────────────────────────────────────────────── # Variables de entorno por defecto # (Se sobreescriben con los Secrets de HF Spaces) # ───────────────────────────────────────────────────────── ENV ANTHROPIC_BASE_URL=https://api.anthropic.com \ OPENAI_BASE_URL=https://api.openai.com \ PROXY_HOST=0.0.0.0 \ PROXY_PORT=7860 # Puerto que HF Spaces espera EXPOSE 7860 # Cambiar a usuario no-root USER user # ───────────────────────────────────────────────────────── # Healthcheck para que HF sepa que la app está viva # ───────────────────────────────────────────────────────── HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ CMD curl -f http://localhost:7860/health || exit 1 # ───────────────────────────────────────────────────────── # Arranque con Uvicorn # • workers=4 → manejo de múltiples requests # • limit-concurrency=100 → protección contra sobrecarga # ───────────────────────────────────────────────────────── CMD ["python", "-m", "uvicorn", \ "proxy:app", \ "--host", "0.0.0.0", \ "--port", "7860", \ "--workers", "4", \ "--limit-concurrency", "100", \ "--timeout-keep-alive", "120", \ "--log-level", "info"]