# Hugging Face Space (Docker SDK) image for LeeChard. # Engine = nanobanana_fal (heavy AI runs remotely on fal); this box runs the API + # InsightFace (CPU) for gender/face QC. FAL_KEY and ACCESS_CODE come from Space secrets. FROM python:3.12-slim ENV PYTHONUNBUFFERED=1 \ PYTHONDONTWRITEBYTECODE=1 \ PIP_NO_CACHE_DIR=1 \ HOME=/root \ AI_PROVIDER=nanobanana_fal \ FAL_NANOBANANA_MODEL=fal-ai/nano-banana-pro/edit \ FAL_KLING_MODEL=fal-ai/bytedance/seedance/v1/pro/fast/image-to-video \ CELERY_TASK_ALWAYS_EAGER=true \ CELERY_TASK_EAGER_PROPAGATES=true \ CELERY_BROKER_URL=memory:// \ CELERY_RESULT_BACKEND=cache+memory:// \ DATABASE_URL=sqlite:////tmp/leechard.db \ SQLALCHEMY_DATABASE_URI=sqlite:////tmp/leechard.db \ STORAGE_BACKEND=local \ LOCAL_STORAGE_DIR=/tmp/leechard-storage # NOTE: set FAL_KEY and ACCESS_CODE as *Space secrets* (Settings -> Variables and secrets). WORKDIR /app # Build + runtime libs: build-essential/cmake for insightface; libglib/libgomp for opencv/onnxruntime. RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential gcc g++ cmake \ libpq-dev libjpeg-dev zlib1g-dev libglib2.0-0 libgomp1 libgl1 \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt . RUN pip install --upgrade pip && pip install -r requirements.txt COPY . . # Pre-download the InsightFace buffalo_l model (~280MB) so the first request does not # pay the fetch. Non-fatal: if the network is unavailable at build time it downloads # at first use instead. RUN python -c "from insightface.app import FaceAnalysis; a=FaceAnalysis(name='buffalo_l'); a.prepare(ctx_id=-1, det_size=(640,640))" || true EXPOSE 7860 HEALTHCHECK --interval=30s --timeout=5s --start-period=90s --retries=3 \ CMD python -c "import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:7860/health', timeout=4).status==200 else 1)" || exit 1 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860"]