# simple-cost-dashboard
#
# Une seule image sert deux usages, avec la commande par défaut adaptée au
# déploiement Kubernetes envisagé :
#   - Deployment "web"  : lance l'API + le frontend (uvicorn), commande par défaut
#   - CronJob "collect" : même image, commande surchargée :
#       command: ["python", "collector/collect.py"]
#       args: ["--config", "/config/config.json", "--db", "/data/cost_dashboard.db"]
#
# Ça évite de maintenir deux images distinctes pour deux moitiés de la même
# application.

FROM python:3.12-slim

# Dépendances système minimales (certificats TLS pour les appels AWS/Azure/
# taux de change ; rien de plus n'est nécessaire, pas de compilation requise
# par boto3/azure-identity/fastapi).
RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY api/ ./api/
COPY collector/ ./collector/
COPY db/ ./db/
COPY frontend/ ./frontend/

# Utilisateur non-root (bonne pratique, souvent imposée par les PodSecurityPolicy /
# PodSecurityStandards en Kubernetes).
RUN useradd --create-home --uid 1000 appuser

# Répertoire pour la base SQLite : à monter sur un PersistentVolume en k8s
# (sinon les données de collecte sont perdues à chaque redéploiement du pod).
RUN mkdir -p /data && chown -R appuser:appuser /data /app
VOLUME ["/data"]

ENV COST_DASHBOARD_DB=/data/cost_dashboard.db \
    PYTHONUNBUFFERED=1

USER appuser

EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
    CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')" || exit 1

# Commande par défaut : lance le serveur web. Le CronJob de collecte
# surcharge 'command'/'args' au niveau du manifeste Kubernetes (voir plus haut).
CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000", "--app-dir", "/app"]