# Image pour Hugging Face Spaces — mode DEEP (vraie reconnaissance MiewID). # HF Spaces (CPU basic) = 16 Go RAM gratuits → suffisant pour MiewID (PyTorch). # Le Space utilise ce fichier comme Dockerfile racine (poussé par le script de déploiement). FROM python:3.12-slim WORKDIR /app # Binaires système : Tesseract (OCR fr+en) + poppler (PDF) pour lire les affiches. RUN apt-get update \ && apt-get install -y --no-install-recommends tesseract-ocr tesseract-ocr-fra poppler-utils \ && rm -rf /var/lib/apt/lists/* # Deps de base + pile deep (torch/transformers/timm pour MiewID). COPY backend/requirements.txt ./backend/requirements.txt RUN pip install --no-cache-dir -r backend/requirements.txt \ && pip install --no-cache-dir torch torchvision "transformers<5" timm # Cache des modèles dans /app/.cache (inscriptible par appuser après chown). # PRÉ-TÉLÉCHARGE les poids du détecteur COCO dans l'image : sinon ~160 Mo sont # téléchargés au 1er upload, ce qui échouait silencieusement en non-root (cache # par défaut non inscriptible) → « gate animal » désactivé. Cache déterministe ici. ENV TORCH_HOME=/app/.cache/torch \ HF_HOME=/app/.cache/huggingface RUN python -c "from torchvision.models.detection import fasterrcnn_resnet50_fpn, FasterRCNN_ResNet50_FPN_Weights as W; fasterrcnn_resnet50_fpn(weights=W.DEFAULT)" # Audit MIT #3 — MiewID est chargé avec trust_remote_code=True : il EXÉCUTE du # code Python distant (depuis le repo HF) à chaque chargement. Sans révision # épinglée, un repo compromis = exécution de code arbitraire au cold start. On # FIGE le commit hash audité (immuable) ET on pré-télécharge code+poids À CETTE # révision dans l'image → plus aucun fetch distant au runtime, code gelé. # SHA vérifié le 2025-02-13 (huggingface.co/api/models/conservationxlabs/miewid-msv3). ENV CHATS_MIEWID_REVISION=4f1d7f2b521149e5fe34bb85f377248ce9971a7d RUN python -c "from transformers import AutoModel; AutoModel.from_pretrained('conservationxlabs/miewid-msv3', trust_remote_code=True, revision='4f1d7f2b521149e5fe34bb85f377248ce9971a7d')" COPY backend ./backend COPY web ./web # Utilisateur NON ROOT (uid 1000 = convention HF Spaces) : si l'app est # compromise, l'attaquant n'a pas les droits root dans le conteneur. Seuls # data/ (uploads + SQLite) et le cache HF sont inscriptibles. RUN useradd -m -u 1000 appuser \ && mkdir -p /app/data /app/.cache/huggingface \ && chown -R appuser:appuser /app/data /app/.cache USER appuser WORKDIR /app/backend # MiewID + tête fine-tunée + vrai envoi courriel. La détection lourde reste off # (recadrage COCO lent ; on garde l'image entière, ce qui convient à MiewID). ENV CHATS_EMBEDDER=deep \ CHATS_REID_HEAD=1 \ CHATS_DETECT=0 \ CHATS_DEV_OTP=0 \ PYTHONUNBUFFERED=1 # HF Spaces attend l'app sur le port 7860 (app_port dans le README du Space). EXPOSE 7860 CMD ["sh", "-c", "uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-7860}"]