Files
LoreMind/demo/docker-compose.infra.yml

79 lines
3.0 KiB
YAML

# ==========================================================================
# LoreMind Demo - Infra permanente
# --------------------------------------------------------------------------
# - dockerproxy : expose un subset restreint de l'API Docker a l'orchestrateur
# (lecture seule sauf containers/images/networks). Remplace le mount direct
# de /var/run/docker.sock : meme avec RCE sur l'orchestrateur, un attaquant
# ne peut pas exec sur l'hote, creer des volumes, ni lire le daemon.
# - orchestrator : sert l'Angular et proxy les /api/* vers les sessions.
#
# Les conteneurs de session sont crees dynamiquement par l'orchestrateur.
# ==========================================================================
services:
dockerproxy:
image: tecnativa/docker-socket-proxy:latest
container_name: loremind-demo-dockerproxy
restart: unless-stopped
environment:
# Minimum requis par l'orchestrateur.
CONTAINERS: 1
IMAGES: 1
NETWORKS: 1
POST: 1
# Tout le reste reste a 0 (defaut) : pas d'EXEC, VOLUMES, BUILD, AUTH,
# SYSTEM, INFO, SWARM, SECRETS, CONFIGS, NODES, etc.
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- socket-proxy
# Pas de ports exposes : accessible uniquement via le reseau socket-proxy.
orchestrator:
container_name: loremind-demo-orchestrator
depends_on:
- dockerproxy
build:
context: ../
dockerfile: demo/orchestrator/Dockerfile
restart: unless-stopped
environment:
# L'orchestrateur parle a dockerproxy au lieu du socket direct.
DOCKER_HOST: tcp://dockerproxy:2375
REGISTRY: ${REGISTRY:-git.igmlcreation.fr}
TAG: ${TAG:-latest}
MAX_SESSIONS: ${MAX_SESSIONS:-10}
SESSION_TTL_MINUTES: ${SESSION_TTL_MINUTES:-20}
CORE_MEMORY_MB: ${CORE_MEMORY_MB:-700}
BRAIN_MEMORY_MB: ${BRAIN_MEMORY_MB:-300}
POSTGRES_MEMORY_MB: ${POSTGRES_MEMORY_MB:-200}
SESSIONS_NETWORK: loremind-demo-sessions
BRAIN_INTERNAL_SECRET_DEFAULT: ${BRAIN_INTERNAL_SECRET_DEFAULT:-change-me}
# Rate limit : 1 creation par IP par fenetre (en secondes).
RATE_LIMIT_WINDOW_SECONDS: ${RATE_LIMIT_WINDOW_SECONDS:-60}
networks:
- traefik
- sessions
- socket-proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.loremind-demo.rule=Host(`${DEMO_HOST:-loremind-demo.igmlcreation.fr}`)"
- "traefik.http.routers.loremind-demo.entrypoints=websecure"
- "traefik.http.routers.loremind-demo.tls.certresolver=letsencrypt"
- "traefik.http.services.loremind-demo.loadbalancer.server.port=80"
networks:
traefik:
external: true
name: ${TRAEFIK_NETWORK:-traefik}
sessions:
# Reseau interne pour les trios de session. Pas d'acces Internet direct
# (sauf via le DNS Docker), pas expose au host.
name: loremind-demo-sessions
driver: bridge
socket-proxy:
# Reseau prive entre dockerproxy et orchestrateur. Isole du reste.
name: loremind-demo-socket-proxy
driver: bridge
internal: true