# Hugging Face Spaces Dockerfile for https://github.com/chenyme/grok2api # # Spaces routes traffic to port 7860 by default. The upstream project defaults # to 8000, so this image overrides SERVER_PORT and starts Granian on 7860. FROM python:3.13-slim AS builder ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ UV_PROJECT_ENVIRONMENT=/opt/venv \ PATH="/opt/venv/bin:/root/.local/bin:$PATH" WORKDIR /src ARG GROK2API_REPO=https://github.com/chenyme/grok2api.git ARG GROK2API_REF=main RUN apt-get update \ && apt-get install -y --no-install-recommends \ build-essential \ ca-certificates \ curl \ git \ libffi-dev \ libssl-dev \ pkg-config \ && rm -rf /var/lib/apt/lists/* COPY --from=ghcr.io/astral-sh/uv:0.6 /uv /uvx /usr/local/bin/ RUN git clone --depth 1 --branch "${GROK2API_REF}" "${GROK2API_REPO}" . \ && uv sync --frozen --no-dev --no-install-project \ && find /opt/venv -type d \( -name "__pycache__" -o -name "tests" -o -name "test" -o -name "testing" \) -prune -exec rm -rf {} + \ && find /opt/venv -type f -name "*.pyc" -delete \ && rm -rf /root/.cache /tmp/uv-cache FROM python:3.13-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ TZ=Asia/Shanghai \ VIRTUAL_ENV=/opt/venv \ PATH="/opt/venv/bin:$PATH" \ SERVER_HOST=0.0.0.0 \ SERVER_PORT=7860 \ SERVER_WORKERS=1 \ DATA_DIR=/app/data \ LOG_DIR=/app/logs RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ tzdata \ && rm -rf /var/lib/apt/lists/* \ && useradd -m -u 1000 user WORKDIR /app COPY --from=builder --chown=user:user /opt/venv /opt/venv COPY --from=builder --chown=user:user /src /app RUN mkdir -p /app/data /app/logs \ && chmod +x /app/scripts/entrypoint.sh /app/scripts/init_storage.sh \ && chown -R user:user /app USER user EXPOSE 7860 HEALTHCHECK --interval=30s --timeout=5s --start-period=30s --retries=3 \ CMD python -c "import os, urllib.request; urllib.request.urlopen(f'http://127.0.0.1:{os.environ.get(\"SERVER_PORT\", \"7860\")}/health', timeout=5).read()" || exit 1 ENTRYPOINT ["/app/scripts/entrypoint.sh"] CMD ["sh", "-c", "exec granian --interface asgi --host ${SERVER_HOST} --port ${SERVER_PORT} --workers ${SERVER_WORKERS} app.main:app"]