learning_ai_common_plat/docker-compose.ecosystem.yml

687 lines
20 KiB
YAML

# 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:
# GITEA_NPM_TOKEN=<token> docker compose -f docker-compose.ecosystem.yml --env-file .env.ecosystem up --build
#
# The GITEA_NPM_TOKEN env var is required for product Docker builds that install
# @bytelyst/* packages from the local Gitea npm registry via BuildKit secrets.
#
# 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
# Product Dockerfiles require BuildKit secrets for Gitea npm registry access.
# GITEA_NPM_HOST defaults to host.docker.internal (Mac local dev).
x-product-build: &product-build
args:
GITEA_NPM_HOST: ${GITEA_NPM_HOST:-host.docker.internal}
secrets:
- gitea_npm_token
secrets:
gitea_npm_token:
environment: GITEA_NPM_TOKEN
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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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:
<<: *product-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: