version: "3.8"

# ===================================================================
# My Truck — Stack complète Asustor (sans build d'image, volume-mount)
#
# Architecture :
#   ┌─────────────────────────────────────────────────────────────┐
#   │  Asustor Reverse Proxy HTTPS 8443  ──►  nginx 8080 (this)   │
#   │                                          │                   │
#   │       /api/*  ─────────►  cariste-backend:8002 (FastAPI)    │
#   │       /api/ws  (WS) ─►   cariste-backend:8002 (WebSocket)   │
#   │       /*       ─────►   static React build (mounted)        │
#   └─────────────────────────────────────────────────────────────┘
#

# AVANT DE DÉPLOYER :
#   1) Tes fichiers sont dans /volume1/Web/cariste-api/ ✅
#   2) Toutes les variables sensibles sont déjà renseignées ci-dessous
#   3) Configure le reverse proxy Asustor 8443 ► localhost:8080
#      (App Central → ADM → Manuel → Services Web → Reverse Proxy)
#
# ===================================================================

services:
  cariste-backend:
    image: python:3.11-slim
    container_name: cariste-backend
    restart: unless-stopped
    working_dir: /app
    expose:
      - "8002"
    ports:
      - "8002:8002"            # exposé en local au cas où tu veux tester direct
    extra_hosts:
      - "host.docker.internal:host-gateway"
    volumes:
      - /volume1/Web/cariste-api/backend:/app
      - cariste-pip-cache:/root/.cache/pip
      # Mises à jour auto-déployées via panel /admin/updates (super-admin only)
      # — accès au socket Docker pour restart les containers
      - /var/run/docker.sock:/var/run/docker.sock:rw
      # — accès écriture aux fichiers du host pour extraire le nouveau ZIP
      - /volume1/Web/cariste-api:/host-deploy:rw
    environment:
      MYSQL_HOST: "host.docker.internal"
      MYSQL_PORT: "3306"
      MYSQL_USER: "cariste_api"
      MYSQL_PASSWORD: "WfnLBMaSb3wpsqzY5usikKjW"
      MYSQL_DB: "gp-eff_gestion_palettes"
      # Origines autorisées pour les apps mobiles + le navigateur web.
      # Pour l'app web servie par nginx (même origine), pas de CORS nécessaire.
      # Pour les apps natives Android/iOS (Capacitor), garde "*" ou liste-les.
      CORS_ORIGINS: "https://appli.gp-eff.fr,capacitor://localhost,http://localhost"
      JWT_SECRET: "Q2YgoKYu26zmW5szvJ6sWjD97EJPmzqr"
      SSO_SECRET: "9f2c8a1b4e6d3f7a0c2e5b8d1a4f7c0e3b6a9d2c5f8e1b4a7d0c3f6e9b2a5d8c"
      # Panel "Mises à jour" — répertoire racine côté container (mappé sur /volume1/Web/cariste-api)
      HOST_DEPLOY_DIR: "/host-deploy"
      DOCKER_SOCK: "/var/run/docker.sock"
      PYTHONUNBUFFERED: "1"
    command: >
      sh -c "echo '==> Installation dépendances...' &&
      pip install --no-cache-dir --upgrade pip &&
      pip install --no-cache-dir -r requirements.txt &&
      echo '==> Démarrage API My Truck...' &&
      python -m uvicorn server:app --host 0.0.0.0 --port 8002 --proxy-headers --forwarded-allow-ips='*'"
    networks:
      - cariste-net

  cariste-frontend:
    image: node:20-alpine
    container_name: cariste-frontend
    restart: unless-stopped
    working_dir: /app
    volumes:
      - /volume1/Web/cariste-api/frontend:/app
      - cariste-yarn-cache:/usr/local/share/.cache/yarn
    environment:
      # Vide ⇒ même origine que la page (servie par nginx). Pas de CORS, pas de Mixed Content.
      REACT_APP_BACKEND_URL: ""
      FORCE_REBUILD: "0"
    command: >
      sh -c "echo '==> Installation dépendances yarn...' &&
      yarn install --frozen-lockfile --network-timeout 1000000 &&
      NEEDS_BUILD=0;
      if [ ! -d build ] || [ ! -f build/index.html ]; then NEEDS_BUILD=1;
      elif [ \"$$FORCE_REBUILD\" = \"1\" ]; then NEEDS_BUILD=1;
      elif [ -n \"$$(find src public package.json -newer build/index.html -print -quit 2>/dev/null)\" ]; then
        echo '==> Sources modifiées depuis le dernier build, rebuild auto.';
        NEEDS_BUILD=1;
      fi;
      if [ \"$$NEEDS_BUILD\" = \"1\" ]; then
        echo '==> Build production React (2-3 min)...' &&
        rm -rf build &&
        yarn build;
      else
        echo '==> Build à jour, je le réutilise.';
      fi &&
      echo '==> Build prêt, en attente que nginx serve. Container reste actif.' &&
      tail -f /dev/null"
    networks:
      - cariste-net

  cariste-nginx:
    image: nginx:1.27-alpine
    container_name: cariste-nginx
    restart: unless-stopped
    ports:
      - "8085:8080"          # ← Cloudflare Tunnel doit cibler ce port (8085) pour éviter le conflit avec ADM
    volumes:
      - /volume1/Web/cariste-api/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - /volume1/Web/cariste-api/frontend/build:/usr/share/nginx/html:ro
    depends_on:
      - cariste-backend
      - cariste-frontend
    networks:
      - cariste-net

volumes:
  cariste-pip-cache:
  cariste-yarn-cache:

networks:
  cariste-net:
    driver: bridge
