services: backend: build: context: ./backend dockerfile: Dockerfile environment: - PORT=8080 # Les specs sont lues depuis /specs (monté en lecture seule, voir volumes). - SPECS_DIR=/specs # Les annotations sont écrites dans /annotations (monté en lecture-écriture). - ANNOTATIONS_DIR=/annotations # Les comptes gérés via le site sont écrits dans /users (monté en lecture-écriture). - USERS_DIR=/users # --- Authentification --- # :? fait échouer le démarrage si le secret est absent (jamais de clé vide). - JWT_SECRET=${JWT_SECRET:?JWT_SECRET requis (>= 32 caracteres)} - JWT_EXPIRATION_MINUTES=${JWT_EXPIRATION_MINUTES:-720} # Compte ADMINISTRATEUR unique (seul compte défini hors du site). Les autres # comptes se gèrent dans l'application (page « Gestion des accès »). - ADMIN_USER=${ADMIN_USER:?ADMIN_USER requis} - ADMIN_PASSWORD=${ADMIN_PASSWORD:?ADMIN_PASSWORD requis} # Amorçage facultatif des comptes initiaux au 1er démarrage (si le store est vide) : # "login:mdp:role,...". Laissé vide = pas d'amorçage personnalisé (défaut interne). - SEED_USERS=${SEED_USERS:-} volumes: # Specs montées EN LECTURE SEULE depuis le dépôt. Les éditions faites dans l'IDE # sont donc visibles en direct par le site (après rafraîchissement du navigateur). # Le ':ro' empêche toute écriture depuis le conteneur. - ../docs/specs-pre-projet:/specs:ro # Annotations EN LECTURE-ÉCRITURE : persistées sur l'hôte dans ./annotations # (un fichier JSON par document). Facile à récupérer/exporter et à transmettre. - ./annotations:/annotations # Comptes gérés EN LECTURE-ÉCRITURE : persistés sur l'hôte dans ./users/users.json # (mots de passe hachés bcrypt). Conservés entre deux ateliers. - ./users:/users restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 5s retries: 3 start_period: 15s frontend: build: context: ./frontend dockerfile: Dockerfile ports: - "2002:80" # hôte 2002 -> nginx (frontend). Caddy proxifiera vers ce port. depends_on: backend: condition: service_healthy restart: unless-stopped