# compose.demo.yml — Public demo instance # # Runs a capped, mock-only Linnet session for demo.circuitforge.tech/linnet. # - DEMO_MODE=true: caps concurrent sessions, disables export # - CF_VOICE_MOCK=1: synthetic ToneEvent stream (no inference, no HF_TOKEN needed) # - Port 8523 (API internal), 8524 (frontend via nginx) # # Usage: # docker compose -f compose.demo.yml -p linnet-demo up -d # docker compose -f compose.demo.yml -p linnet-demo down # # Caddy: demo.circuitforge.tech/linnet* → host port 8524 services: linnet-api: build: context: . dockerfile: Dockerfile environment: DEMO_MODE: "true" CF_VOICE_MOCK: "1" LINNET_PORT: "8523" LINNET_FRONTEND_PORT: "8524" LINNET_BASE_URL: "/linnet" DEMO_MAX_SESSIONS: "3" DEMO_SESSION_TTL_S: "300" networks: - linnet-demo-net restart: unless-stopped # API is internal-only — frontend nginx proxies to it linnet-web: build: context: . dockerfile: docker/web/Dockerfile args: VITE_BASE_URL: /linnet/ VITE_API_BASE: /linnet ports: - "8524:80" volumes: - ./docker/web/nginx.conf:/etc/nginx/conf.d/default.conf:ro networks: - linnet-demo-net depends_on: - linnet-api restart: unless-stopped networks: linnet-demo-net: driver: bridge