From c93cc491ffa94999a81de8efcb3728cd3b3594d0 Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Tue, 24 Mar 2026 09:01:26 -0700 Subject: [PATCH] feat(infra): add docker-compose.ecosystem.yml for full ByteLyst stack --- docker-compose.ecosystem.yml | 652 +++++++++++++++++++++++++++++++++++ 1 file changed, 652 insertions(+) create mode 100644 docker-compose.ecosystem.yml diff --git a/docker-compose.ecosystem.yml b/docker-compose.ecosystem.yml new file mode 100644 index 00000000..6ea4ea4d --- /dev/null +++ b/docker-compose.ecosystem.yml @@ -0,0 +1,652 @@ +# docker-compose.ecosystem.yml — Full ByteLyst Ecosystem +# +# Brings up all infrastructure, platform services, dashboards, and product +# backends + web apps in a single Docker Compose stack. +# +# Prerequisites: +# 1. Copy .env.ecosystem.example → .env.ecosystem and fill in values +# 2. All product repos must be sibling directories of this repo +# +# Usage: +# docker compose -f docker-compose.ecosystem.yml --env-file .env.ecosystem up --build +# +# Port Map: +# Infrastructure: cosmos-emulator 8081, azurite 10000, mailpit 1025/8025, +# loki 3100, grafana 3000, traefik 80/8080 +# Platform: platform-service 4003, extraction-service 4005, mcp-server 4007 +# Dashboards: admin-web 3001, tracker-web 3003 +# Products: peakpulse 4010, chronomind 4011, jarvisjr 4012, +# nomgap 4013, mindlyst 4014, lysnrai 4015, +# notelett 4016, flowmonk 4017, actiontrail 4018, +# localmemgpt 4019 +# Product webs: chronomind 3030, jarvisjr 3035, flowmonk 3040, +# notelett 3045, mindlyst 3050, nomgap 3055, +# actiontrail 3060, localmemgpt 3070, lysnrai 3002 + +services: + + # ═════════════════════════════════════════════════════════════════ + # INFRASTRUCTURE + # ═════════════════════════════════════════════════════════════════ + + cosmos-emulator: + image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview + ports: + - '8081:8081' + - '1234:1234' + environment: + - PROTOCOL=http + - ENABLE_EXPLORER=true + - GATEWAY_PUBLIC_ENDPOINT=cosmos-emulator + healthcheck: + test: ['CMD-SHELL', 'curl -sf http://127.0.0.1:8080/ready || exit 1'] + interval: 10s + timeout: 5s + retries: 12 + start_period: 20s + restart: unless-stopped + + azurite: + image: mcr.microsoft.com/azure-storage/azurite:3.35.0 + command: azurite-blob --blobHost 0.0.0.0 --blobPort 10000 --location /data --skipApiVersionCheck + ports: + - '10000:10000' + volumes: + - azurite-data:/data + healthcheck: + test: ['CMD', 'nc', '-z', '127.0.0.1', '10000'] + interval: 10s + timeout: 5s + retries: 6 + restart: unless-stopped + + mailpit: + image: axllent/mailpit:v1.27.5 + ports: + - '1025:1025' + - '8025:8025' + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:8025'] + interval: 10s + timeout: 5s + retries: 6 + restart: unless-stopped + + loki: + image: grafana/loki:3.3.2 + ports: + - '3100:3100' + volumes: + - ./services/monitoring/loki/loki-config.yml:/etc/loki/local-config.yaml + - loki-data:/loki + command: -config.file=/etc/loki/local-config.yaml + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:3100/ready'] + interval: 15s + timeout: 5s + retries: 3 + restart: unless-stopped + + grafana: + image: grafana/grafana:11.4.0 + ports: + - '3000:3000' + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=bytelyst + - GF_USERS_ALLOW_SIGN_UP=false + volumes: + - ./services/monitoring/grafana/provisioning:/etc/grafana/provisioning + - ./services/monitoring/grafana/dashboards:/var/lib/grafana/dashboards + - grafana-data:/var/lib/grafana + depends_on: + loki: + condition: service_started + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:3000/api/health'] + interval: 15s + timeout: 5s + retries: 3 + restart: unless-stopped + + gateway: + image: traefik:v3.3 + command: + - '--api.insecure=true' + - '--providers.docker=true' + - '--providers.docker.exposedbydefault=false' + - '--entrypoints.web.address=:80' + - '--accesslog=true' + - '--accesslog.format=json' + ports: + - '80:80' + - '8080:8080' + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + depends_on: + loki: + condition: service_started + restart: unless-stopped + + # ═════════════════════════════════════════════════════════════════ + # PLATFORM SERVICES (from this repo) + # ═════════════════════════════════════════════════════════════════ + + platform-service: + build: + context: . + dockerfile: services/platform-service/Dockerfile + ports: + - '4003:4003' + env_file: + - .env.ecosystem + environment: + - PORT=4003 + - COSMOS_AUTO_INIT=true + - PLATFORM_SERVICE_URL=http://platform-service:4003 + - EXTRACTION_SERVICE_URL=http://extraction-service:4005 + - MCP_SERVER_URL=http://mcp-server:4007 + - MAILPIT_UI_URL=http://mailpit:8025 + depends_on: + mailpit: + condition: service_healthy + azurite: + condition: service_healthy + cosmos-emulator: + condition: service_healthy + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.platform.rule=PathPrefix(`/platform`)' + - 'traefik.http.services.platform.loadbalancer.server.port=4003' + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4003/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + extraction-service: + build: + context: . + dockerfile: services/extraction-service/Dockerfile + ports: + - '4005:4005' + env_file: + - .env.ecosystem + environment: + - PORT=4005 + - PYTHON_SIDECAR_URL=http://localhost:4006 + depends_on: + cosmos-emulator: + condition: service_healthy + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.extraction.rule=PathPrefix(`/extraction`)' + - 'traefik.http.services.extraction.loadbalancer.server.port=4005' + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4005/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + mcp-server: + build: + context: . + dockerfile: services/mcp-server/Dockerfile + ports: + - '4007:4007' + env_file: + - .env.ecosystem + environment: + - PORT=4007 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + - EXTRACTION_SERVICE_URL=http://extraction-service:4005 + depends_on: + platform-service: + condition: service_healthy + extraction-service: + condition: service_healthy + labels: + - 'traefik.enable=true' + - 'traefik.http.routers.mcp.rule=PathPrefix(`/mcp`)' + - 'traefik.http.services.mcp.loadbalancer.server.port=4007' + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4007/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + # ═════════════════════════════════════════════════════════════════ + # PLATFORM DASHBOARDS (from this repo) + # ═════════════════════════════════════════════════════════════════ + + admin-web: + build: + context: . + dockerfile: dashboards/admin-web/Dockerfile + ports: + - '3001:3001' + env_file: + - .env.ecosystem + environment: + - PORT=3001 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + - EXTRACTION_SERVICE_URL=http://extraction-service:4005 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:3001'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + tracker-web: + build: + context: . + dockerfile: dashboards/tracker-web/Dockerfile + ports: + - '3003:3003' + env_file: + - .env.ecosystem + environment: + - PORT=3003 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:3003'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + # ═════════════════════════════════════════════════════════════════ + # PRODUCT BACKENDS (from sibling repos) + # ═════════════════════════════════════════════════════════════════ + + peakpulse-backend: + build: + context: ../learning_ai_peakpulse + dockerfile: backend/Dockerfile + ports: + - '4010:4010' + env_file: + - .env.ecosystem + environment: + - PORT=4010 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4010/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + chronomind-backend: + build: + context: ../learning_ai_clock + dockerfile: backend/Dockerfile + ports: + - '4011:4011' + env_file: + - .env.ecosystem + environment: + - PORT=4011 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4011/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + jarvisjr-backend: + build: + context: ../learning_ai_jarvis_jr + dockerfile: backend/Dockerfile + ports: + - '4012:4012' + env_file: + - .env.ecosystem + environment: + - PORT=4012 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4012/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + nomgap-backend: + build: + context: ../learning_ai_fastgap + dockerfile: backend/Dockerfile + ports: + - '4013:4013' + env_file: + - .env.ecosystem + environment: + - PORT=4013 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4013/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + mindlyst-backend: + build: + context: ../learning_multimodal_memory_agents + dockerfile: backend/Dockerfile + ports: + - '4014:4014' + env_file: + - .env.ecosystem + environment: + - PORT=4014 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4014/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + lysnrai-backend: + build: + context: ../learning_voice_ai_agent + dockerfile: backend/Dockerfile + ports: + - '4015:4015' + env_file: + - .env.ecosystem + environment: + - PORT=4015 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4015/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + notelett-backend: + build: + context: ../learning_ai_notes + dockerfile: backend/Dockerfile + ports: + - '4016:4016' + env_file: + - .env.ecosystem + environment: + - PORT=4016 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + - EXTRACTION_SERVICE_URL=http://extraction-service:4005 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4016/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + flowmonk-backend: + build: + context: ../learning_ai_flowmonk + dockerfile: backend/Dockerfile + ports: + - '4017:4017' + env_file: + - .env.ecosystem + environment: + - PORT=4017 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4017/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + actiontrail-backend: + build: + context: ../learning_ai_trails + dockerfile: backend/Dockerfile + ports: + - '4018:4018' + env_file: + - .env.ecosystem + environment: + - PORT=4018 + - HOST=0.0.0.0 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4018/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + localmemgpt-backend: + build: + context: ../learning_ai_local_memory_gpt + dockerfile: backend/Dockerfile + ports: + - '4019:4019' + env_file: + - .env.ecosystem + environment: + - PORT=4019 + - HOST=0.0.0.0 + - OLLAMA_URL=http://host.docker.internal:11434 + - PLATFORM_SERVICE_URL=http://platform-service:4003 + volumes: + - localmemgpt-data:/app/db + depends_on: + platform-service: + condition: service_healthy + healthcheck: + test: ['CMD', 'wget', '-q', '--spider', 'http://127.0.0.1:4019/health'] + interval: 30s + timeout: 10s + retries: 3 + restart: unless-stopped + + # ═════════════════════════════════════════════════════════════════ + # PRODUCT WEB APPS (from sibling repos) + # ═════════════════════════════════════════════════════════════════ + + lysnrai-dashboard: + build: + context: ../learning_voice_ai_agent + dockerfile: user-dashboard-web/Dockerfile + ports: + - '3002:3002' + environment: + - NODE_ENV=production + - PORT=3002 + - NEXT_PUBLIC_BACKEND_URL=http://lysnrai-backend:4015 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + lysnrai-backend: + condition: service_healthy + restart: unless-stopped + + chronomind-web: + build: + context: ../learning_ai_clock + dockerfile: web/Dockerfile + ports: + - '3030:3030' + environment: + - NODE_ENV=production + - PORT=3030 + - NEXT_PUBLIC_BACKEND_URL=http://chronomind-backend:4011 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + chronomind-backend: + condition: service_healthy + restart: unless-stopped + + jarvisjr-web: + build: + context: ../learning_ai_jarvis_jr + dockerfile: web/Dockerfile + ports: + - '3035:3035' + environment: + - NODE_ENV=production + - PORT=3035 + - NEXT_PUBLIC_BACKEND_URL=http://jarvisjr-backend:4012 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + jarvisjr-backend: + condition: service_healthy + restart: unless-stopped + + flowmonk-web: + build: + context: ../learning_ai_flowmonk + dockerfile: web/Dockerfile + ports: + - '3040:3040' + environment: + - NODE_ENV=production + - PORT=3040 + - NEXT_PUBLIC_BACKEND_URL=http://flowmonk-backend:4017 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + flowmonk-backend: + condition: service_healthy + restart: unless-stopped + + notelett-web: + build: + context: ../learning_ai_notes + dockerfile: web/Dockerfile + ports: + - '3045:3045' + environment: + - NODE_ENV=production + - PORT=3045 + - NEXT_PUBLIC_BACKEND_URL=http://notelett-backend:4016 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + notelett-backend: + condition: service_healthy + restart: unless-stopped + + mindlyst-web: + build: + context: ../learning_multimodal_memory_agents + dockerfile: mindlyst-native/web/Dockerfile + ports: + - '3050:3050' + environment: + - NODE_ENV=production + - PORT=3050 + - NEXT_PUBLIC_BACKEND_URL=http://mindlyst-backend:4014 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + mindlyst-backend: + condition: service_healthy + restart: unless-stopped + + nomgap-web: + build: + context: ../learning_ai_fastgap + dockerfile: web/Dockerfile + ports: + - '3055:3055' + environment: + - NODE_ENV=production + - PORT=3055 + - NEXT_PUBLIC_BACKEND_URL=http://nomgap-backend:4013 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + nomgap-backend: + condition: service_healthy + restart: unless-stopped + + actiontrail-web: + build: + context: ../learning_ai_trails + dockerfile: web/Dockerfile + ports: + - '3060:3060' + environment: + - NODE_ENV=production + - PORT=3060 + - NEXT_PUBLIC_BACKEND_URL=http://actiontrail-backend:4018 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + actiontrail-backend: + condition: service_healthy + restart: unless-stopped + + localmemgpt-web: + build: + context: ../learning_ai_local_memory_gpt + dockerfile: web/Dockerfile + ports: + - '3070:3070' + environment: + - NODE_ENV=production + - PORT=3070 + - NEXT_PUBLIC_BACKEND_URL=http://localmemgpt-backend:4019 + - NEXT_PUBLIC_PLATFORM_URL=http://platform-service:4003 + depends_on: + localmemgpt-backend: + condition: service_healthy + restart: unless-stopped + +# ═════════════════════════════════════════════════════════════════ +# VOLUMES +# ═════════════════════════════════════════════════════════════════ + +volumes: + azurite-data: + loki-data: + grafana-data: + localmemgpt-data: