Spaces:
Sleeping
Sleeping
| # 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}"] | |