# ===========================================================
#   missioflow-SuperAdmin — Docker Compose Swarm prod
#   Usage : docker stack deploy -c docker-compose.superadmin.yml missioflow-superadmin
#
#   Build : effectué sur le VPS via le job CI (.gitlab-ci.yml), pas via ce
#   compose en mode Swarm (Swarm n'utilise pas le bloc `build` ; il consomme
#   l'image déjà construite). Le bloc `build` ci-dessous reste utile pour les
#   tests locaux via `docker compose up`.
#
#   Vars d'env attendues (cf .env.superadmin + .env.superadmin.secrets) :
#   - API_BASE_URL, SESSION_COOKIE_NAME, NODE_ENV, TRAEFIK_NETWORK : statiques
#     côté repo dans .env.superadmin (pas de secret)
#   - DB_HOST, DB_PORT, DB_NAME, DB_USER : injectées par le job CI depuis
#     les GitLab CI variables (clair) → dans .env.superadmin.secrets
#   - DB_PASSWORD : GitLab CI variable masked → dans .env.superadmin.secrets
#   - SUPERADMIN_IP_ALLOWLIST : GitLab CI variable (clair) → CSV des IPs
#     autorisées à accéder au panel ; vide = pas d'allowlist
#   - MF_INTERNAL_NETWORK : nom du network Docker partagé avec la stack
#     missioflow-prod (par défaut `missioflow-prod_prod-net`) — le panel s'y
#     attache pour atteindre le service `db` (MySQL) sans exposer 3306
#     publiquement.
# ===========================================================

services:
  app:
    image: ${APP_IMAGE:-missioflow-superadmin:latest}
    build:
      context: .
      dockerfile: Dockerfile
    container_name: missioflow-superadmin-app
    restart: unless-stopped
    env_file: .env.superadmin
    environment:
      NODE_ENV: ${NODE_ENV:-production}
      API_BASE_URL: ${API_BASE_URL:-https://app.missioflow.fr/api}
      SESSION_COOKIE_NAME: ${SESSION_COOKIE_NAME:-mf_sysop_session}
      # Bloc DB direct (Option B) — toutes injectées par le CI
      DB_HOST: ${DB_HOST:-}
      DB_PORT: ${DB_PORT:-3306}
      DB_NAME: ${DB_NAME:-}
      DB_USER: ${DB_USER:-}
      DB_PASSWORD: ${DB_PASSWORD:-}
      # Durcissement IP allowlist
      SUPERADMIN_IP_ALLOWLIST: ${SUPERADMIN_IP_ALLOWLIST:-}
      # Trigger rebuild missioflow-site (Astro statique) après PATCH plan
      # cf. mf_ask #70 + src/lib/vitrine-rebuild.ts
      MISSIOFLOW_SITE_REBUILD_TRIGGER_TOKEN: ${MISSIOFLOW_SITE_REBUILD_TRIGGER_TOKEN:-}
      GITLAB_BASE_URL: ${GITLAB_BASE_URL:-}
    networks:
      - traefik-public
      - mf-internal
    deploy:
      replicas: 1
      restart_policy:
        condition: any
      labels:
        - "traefik.enable=true"
        - "traefik.swarm.network=${TRAEFIK_NETWORK:-traefik-public}"
        # Router HTTPS — sysop.missioflow.fr (priorité 100 pour gagner contre le wildcard prod)
        - "traefik.http.routers.missioflow-superadmin.rule=Host(`sysop.missioflow.fr`)"
        - "traefik.http.routers.missioflow-superadmin.priority=100"
        - "traefik.http.routers.missioflow-superadmin.entrypoints=websecure"
        - "traefik.http.routers.missioflow-superadmin.tls=true"
        - "traefik.http.routers.missioflow-superadmin.tls.certresolver=letsencrypt"
        - "traefik.http.routers.missioflow-superadmin.tls.domains[0].main=missioflow.fr"
        - "traefik.http.routers.missioflow-superadmin.tls.domains[0].sans=*.missioflow.fr"
        - "traefik.http.services.missioflow-superadmin.loadbalancer.server.port=3000"
        # Router HTTP → HTTPS redirect
        - "traefik.http.routers.missioflow-superadmin-http.rule=Host(`sysop.missioflow.fr`)"
        - "traefik.http.routers.missioflow-superadmin-http.priority=100"
        - "traefik.http.routers.missioflow-superadmin-http.entrypoints=web"
        - "traefik.http.routers.missioflow-superadmin-http.middlewares=missioflow-superadmin-redirect"
        - "traefik.http.middlewares.missioflow-superadmin-redirect.redirectscheme.scheme=https"
        - "traefik.http.middlewares.missioflow-superadmin-redirect.redirectscheme.permanent=true"
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:3000/login"]
      interval: 30s
      timeout: 5s
      start_period: 30s
      retries: 5

networks:
  traefik-public:
    name: ${TRAEFIK_NETWORK:-traefik-public}
    external: true
  # Réseau overlay partagé avec la stack missioflow-prod, attachable depuis
  # ce compose en `external: true`. Le service `db` (MySQL prod) y est
  # joignable via son service-name Swarm (cf. AGENTS.md). Le nom par défaut
  # `missioflow-prod_prod-net` correspond au pattern Swarm `<stack>_<network>`
  # pour la stack `missioflow-prod` qui déclare un network `prod-net`.
  mf-internal:
    name: ${MF_INTERNAL_NETWORK:-missioflow-prod_prod-net}
    external: true
