# syntax=docker/dockerfile:1.7

# SAS V2.2 — Service de pseudonymisation/dépseudonymisation pour documents
# juridiques, basé sur Privacy Filter (OpenAI/privacy-filter) en CPU.
# Image base : Debian slim Python 3.11. torch CPU only (pas de CUDA).
FROM python:3.11-slim AS base

# Dépendances système minimales (libgomp pour torch, ca-certificates pour HF Hub)
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        libgomp1 \
        ca-certificates \
        curl \
    && rm -rf /var/lib/apt/lists/*

# Utilisateur non-root pour isoler les permissions
RUN useradd --create-home --uid 1000 sas
WORKDIR /app

# Le cache HuggingFace est monté dans un volume Docker persistant : le modèle
# Privacy Filter (~1 Go) n'est téléchargé qu'une seule fois, au premier
# démarrage. Les rebuilds ultérieurs réutilisent le volume.
ENV HF_HOME=/models \
    TRANSFORMERS_CACHE=/models \
    HF_HUB_DISABLE_TELEMETRY=1 \
    PYTHONUNBUFFERED=1 \
    PYTHONDONTWRITEBYTECODE=1 \
    PIP_NO_CACHE_DIR=1 \
    PIP_DISABLE_PIP_VERSION_CHECK=1

# Installation des dépendances Python. torch en CPU-only via l'index PyTorch
# dédié, ce qui économise ~2 Go par rapport à la variante CUDA.
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir \
        --extra-index-url https://download.pytorch.org/whl/cpu \
        -r /app/requirements.txt

# Code de l'application (les data/, static/ et /models sont des volumes,
# donc pas copiés dans l'image).
COPY service.py exporters.py pseudonymizer.py /app/
COPY static/ /app/static/

# Préparation des points de montage
RUN mkdir -p /app/data/mappings /models \
    && chown -R sas:sas /app /models

USER sas

EXPOSE 8082

# Healthcheck : le service expose /health qui renvoie {"status":"ok",…}
HEALTHCHECK --interval=30s --timeout=5s --start-period=60s --retries=3 \
    CMD curl --fail --silent http://localhost:8082/health || exit 1

# Le service lit SAS_HOST, SAS_PORT, PUBLIC_BASE via os.environ.
# SAS_HOST=0.0.0.0 est forcé pour écouter sur toutes les interfaces du
# conteneur (sinon uvicorn n'écoute que sur 127.0.0.1 et le port mapping
# Docker ne fonctionne pas).
ENV SAS_HOST=0.0.0.0 \
    SAS_PORT=8082 \
    PUBLIC_BASE=http://localhost:8082

CMD ["python", "-u", "service.py"]
