Files
microdao-daarion/docker-compose.node1.yml
Apple 09dee24342 feat: MD pipeline — market-data-service hardening + SenpAI NATS consumer
Producer (market-data-service):
- Backpressure: smart drop policy (heartbeats→quotes→trades preserved)
- Heartbeat monitor: synthetic HeartbeatEvent on provider silence
- Graceful shutdown: WS→bus→storage→DB engine cleanup sequence
- Bybit V5 public WS provider (backup for Binance, no API key needed)
- FailoverManager: health-based provider switching with recovery
- NATS output adapter: md.events.{type}.{symbol} for SenpAI
- /bus-stats endpoint for backpressure monitoring
- Dockerfile + docker-compose.node1.yml integration
- 36 tests (parsing + bus + failover), requirements.lock

Consumer (senpai-md-consumer):
- NATSConsumer: subscribe md.events.>, queue group senpai-md, backpressure
- State store: LatestState + RollingWindow (deque, 60s)
- Feature engine: 11 features (mid, spread, VWAP, return, vol, latency)
- Rule-based signals: long/short on return+volume+spread conditions
- Publisher: rate-limited features + signals + alerts to NATS
- HTTP API: /health, /metrics, /state/latest, /features/latest, /stats
- 10 Prometheus metrics
- Dockerfile + docker-compose.senpai.yml
- 41 tests (parsing + state + features + rate-limit), requirements.lock

CI: ruff + pytest + smoke import for both services
Tests: 77 total passed, lint clean
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-09 11:46:15 -08:00

717 lines
22 KiB
YAML

version: '3.8'
services:
router:
build:
context: ./services/router
dockerfile: Dockerfile
container_name: dagi-router-node1
ports:
- 9102:8000
environment:
- NATS_URL=nats://nats:4222
- ROUTER_CONFIG_PATH=/app/router_config.yaml
- LOG_LEVEL=info
- NODE_ID=node-1-hetzner-gex44
- MEMORY_SERVICE_URL=http://memory-service:8000
- QDRANT_HOST=qdrant
- QDRANT_PORT=6333
- QDRANT_ENABLED=true
- NEO4J_BOLT_URL=bolt://neo4j:7687
- NEO4J_HTTP_URL=http://neo4j:7474
- NEO4J_USER=neo4j
- NEO4J_PASSWORD=DaarionNeo4j2026!
- DEEPSEEK_API_KEY=sk-0db94e8193ec4a6e9acd593ee8d898e7
- MISTRAL_API_KEY=40Gwjo8nVBx4i4vIkgszvXw9bOwDOu4G
- COHERE_API_KEY=nOdOXnuepLku2ipJWpe6acWgAsJCsDhMO0RnaEJB
- GROK_API_KEY=xai-69zEnDse8qRuQyZATs9jVKgfwdyvkHzgEVrTbV0OTAurZqsjHmvGepXG6H9GhVRYEC7E4NFl6iZeG0ww
- VISION_ENCODER_URL=http://vision-encoder:8001
- SWAPPER_SERVICE_URL=http://swapper-service:8890
- IMAGE_GEN_URL=http://swapper-service:8890/image/generate
- STT_SERVICE_URL=http://swapper-service:8890
- STT_SERVICE_UPLOAD_URL=http://swapper-service:8890/stt
- OCR_SERVICE_URL=http://swapper-service:8890
- WEB_SEARCH_SERVICE_URL=http://swapper-service:8890
- CREWAI_URL=http://dagi-staging-crewai-service:9010
- CREWAI_ENABLED=true
- CREWAI_ROUTING_ENABLED=true
- CREWAI_AGENTS_PATH=/app/config/crewai_agents.json
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./services/router/router_config.yaml:/app/router_config.yaml:ro
- ./services/router/router-config.yml:/app/router-config.yml:ro
- ./logs:/app/logs
- ./config/crewai_agents.json:/app/config/crewai_agents.json:ro
- ./services/crewai-service/app/config/crewai_teams.yml:/app/config/crewai_teams.yml:ro
networks:
dagi-network:
aliases:
- router
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
swapper-service:
build:
context: ./services/swapper-service
dockerfile: Dockerfile
container_name: swapper-service-node1
ports:
- 8890:8890
- 8891:8891
environment:
- OLLAMA_BASE_URL=http://172.18.0.1:11434
- SWAPPER_CONFIG_PATH=/app/config/swapper_config.yaml
- SWAPPER_MODE=single-active
- MAX_CONCURRENT_MODELS=2
- MODEL_SWAP_TIMEOUT=300
- GPU_ENABLED=true
- NODE_ID=node-1-hetzner-gex44
- HF_HOME=/root/.cache/huggingface
- CUDA_VISIBLE_DEVICES=0
- CRAWL4AI_URL=http://crawl4ai:11235
- GROK_API_KEY=xai-69zEnDse8qRuQyZATs9jVKgfwdyvkHzgEVrTbV0OTAurZqsjHmvGepXG6H9GhVRYEC7E4NFl6iZeG0ww
- MISTRAL_API_KEY=40Gwjo8nVBx4i4vIkgszvXw9bOwDOu4G
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./services/swapper-service/config/swapper_config_node1.yaml:/app/config/swapper_config.yaml:ro
- ./logs:/app/logs
- swapper-hf-cache-node1:/root/.cache/huggingface
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities:
- gpu
networks:
- dagi-network
restart: unless-stopped
extra_hosts:
- host.docker.internal:172.18.0.1
healthcheck:
test:
- CMD-SHELL
- wget -qO- http://localhost:8890/health || exit 1
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
crawl4ai:
image: unclecode/crawl4ai:latest
container_name: dagi-crawl4ai-node1
ports:
- 11235:11235
environment:
- CRAWL4AI_API_TOKEN=${CRAWL4AI_API_TOKEN:-}
- MAX_CONCURRENT_TASKS=5
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD
- curl
- -f
- http://localhost:11235/health
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
gateway:
build:
context: ./gateway-bot
dockerfile: Dockerfile
container_name: dagi-gateway-node1
ports:
- 9300:9300
environment:
- PYTHONPATH=/opt/microdao-daarion:/opt/microdao-daarion/packages/agromatrix-tools
- AGX_OPERATOR_IDS=1642840513
- AGX_OPERATOR_CHAT_ID=-1003529715973
- ROUTER_URL=${ROUTER_URL:-http://router:8000}
- SERVICE_ID=gateway
- SERVICE_ROLE=gateway
- BRAND_INTAKE_URL=http://brand-intake:9211
- BRAND_REGISTRY_URL=http://brand-registry:9210
- ENABLE_BRAND_COMMANDS=true
- PRESENTATION_RENDERER_URL=http://presentation-renderer:9212
- ARTIFACT_REGISTRY_URL=http://artifact-registry:9220
- HELION_TELEGRAM_BOT_TOKEN=8112062582:AAGS-HwRLEI269lDutLtAJTFArsIq31YNhE
- HELION_NAME=Helion
- HELION_PROMPT_PATH=/app/gateway-bot/helion_prompt.txt
- NUTRA_TELEGRAM_BOT_TOKEN=8517315428:AAGTLcKxBAZDsMgx28agKTvl1SqJGi0utH4
- NUTRA_NAME=NUTRA
- AGROMATRIX_TELEGRAM_BOT_TOKEN=8580290441:AAFuDBmFJtpl-3I_WfkH7Hkb59X0fhYNMOE
- AGROMATRIX_NAME=AgroMatrix
- AGROMATRIX_PROMPT_PATH=/app/gateway-bot/agromatrix_prompt.txt
- ALATEYA_TELEGRAM_BOT_TOKEN=8436880945:AAEi-HS6GEctddoqBUd37MHfweZQP-OjRlo
- ALATEYA_NAME=Alateya
- ALATEYA_PROMPT_PATH=/app/gateway-bot/alateya_prompt.txt
- CLAN_TELEGRAM_BOT_TOKEN=8516872152:AAHH26wU8hJZJbSCJXb4vbmPmakTP77ok5E
- CLAN_NAME=Spirit
- CLAN_PROMPT_PATH=/app/gateway-bot/clan_prompt.txt
- EONARCH_TELEGRAM_BOT_TOKEN=7962391584:AAFYkelLRG3VR_Lxuu6pEGG76t4vZdANtz4
- DAARWIZZ_TELEGRAM_BOT_TOKEN=8323412397:AAGZbAR22LuOiGD8xVC3OXMjahQ8rs2lJwo
- DAARWIZZ_NAME=DAARWIZZ
- DRUID_TELEGRAM_BOT_TOKEN=8145618489:AAFR714mBsNmiuF-rjCw-295iORBReJQZ70
- DRUID_NAME=DRUID
- GREENFOOD_TELEGRAM_BOT_TOKEN=7495165343:AAGR1XEOzg7DkPFPCzL_eYLCJfxJuonCxug
- GREENFOOD_NAME=GREENFOOD
- SENPAI_TELEGRAM_BOT_TOKEN=8510265026:AAGFrFBIIEihsLptZSxuKdmW2RoRPQDY9FE
- SOUL_TELEGRAM_BOT_TOKEN=8041596416:AAHhpfCtY8paCm_9AD-4stJJg-Vw-CBf6Qk
- YAROMIR_TELEGRAM_BOT_TOKEN=8128180674:AAGNZdG3LwECI4z_803smsuRHsK3nPdjMLY
- SOFIIA_TELEGRAM_BOT_TOKEN=8589292566:AAEmPvS6nY9e-Y-TZm04CAHWlaFnWVxajE4
- SOFIIA_NAME=Sophia
- SOUL_NAME=Athena
- SENPAI_NAME=SENPAI
- SENPAI_PROMPT_PATH=/app/gateway-bot/senpai_prompt.txt
- EONARCH_NAME=EONARCH
- EONARCH_PROMPT_PATH=/app/gateway-bot/eonarch_prompt.txt
- MEMORY_SERVICE_URL=http://memory-service:8000
- SWAPPER_SERVICE_URL=http://swapper-service:8890
- IMAGE_GEN_URL=http://swapper-service:8890/image/generate
- STT_SERVICE_URL=http://swapper-service:8890
- STT_SERVICE_UPLOAD_URL=http://swapper-service:8890/stt
- OCR_SERVICE_URL=http://swapper-service:8890
- WEB_SEARCH_SERVICE_URL=http://swapper-service:8890
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./gateway-bot:/app/gateway-bot:ro
- ./logs:/app/logs
depends_on:
- router
- memory-service
networks:
dagi-network:
aliases:
- gateway
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:9300/health')"
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
nats:
image: nats:2.10-alpine
container_name: dagi-nats-node1
ports:
- 4222:4222
command:
- -js
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- nats-data-node1:/data
networks:
dagi-network:
aliases:
- nats
restart: unless-stopped
minio:
image: minio/minio:latest
container_name: dagi-minio-node1
ports:
- 9000:9000
- 9001:9001
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
command:
- server
- /data
- --console-address
- :9001
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- minio-data-node1:/data
networks:
- dagi-network
restart: unless-stopped
artifact-registry:
build:
context: ./services/artifact-registry
dockerfile: Dockerfile
container_name: artifact-registry-node1
ports:
- 9220:9220
environment:
- POSTGRES_HOST=dagi-postgres
- POSTGRES_PORT=5432
- POSTGRES_USER=daarion
- POSTGRES_PASSWORD=DaarionDB2026!
- POSTGRES_DB=daarion_main
- MINIO_ENDPOINT=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- MINIO_BUCKET=artifacts
- MINIO_SECURE=false
- NATS_URL=nats://nats:4222
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./logs:/app/logs
depends_on:
- nats
- minio
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:9220/health')"
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
rag-service:
build:
context: ./services/rag-service
dockerfile: Dockerfile
container_name: rag-service-node1
ports:
- 9500:9500
environment:
- PG_DSN=postgresql+psycopg2://daarion:DaarionDB2026!@dagi-postgres:5432/rag
- RAG_TABLE_NAME=rag_documents
depends_on:
- dagi-postgres
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD
- wget
- -qO-
- http://localhost:9500/health
interval: 10s
timeout: 3s
retries: 10
render-pptx-worker:
build:
context: ./services/render-pptx-worker
dockerfile: Dockerfile
container_name: render-pptx-worker-node1
environment:
- NATS_URL=nats://nats:4222
- ARTIFACT_REGISTRY_URL=http://artifact-registry:9220
- MINIO_ENDPOINT=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- MINIO_BUCKET=artifacts
- MINIO_SECURE=false
depends_on:
- nats
- artifact-registry
- minio
networks:
- dagi-network
restart: unless-stopped
render-pdf-worker:
build:
context: ./services/render-pdf-worker
dockerfile: Dockerfile
container_name: render-pdf-worker-node1
environment:
- NATS_URL=nats://nats:4222
- ARTIFACT_REGISTRY_URL=http://artifact-registry:9220
- MINIO_ENDPOINT=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- MINIO_BUCKET=artifacts
- MINIO_SECURE=false
depends_on:
- nats
- artifact-registry
- minio
networks:
- dagi-network
restart: unless-stopped
index-doc-worker:
build:
context: ./services/index-doc-worker
dockerfile: Dockerfile
container_name: index-doc-worker-node1
environment:
- NATS_URL=nats://nats:4222
- ARTIFACT_REGISTRY_URL=http://artifact-registry:9220
- RAG_SERVICE_URL=http://rag-service:9500
- MINIO_ENDPOINT=minio:9000
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- MINIO_BUCKET=artifacts
- MINIO_SECURE=false
- INDEX_DOC_MAX_BYTES=52428800
depends_on:
- nats
- artifact-registry
- rag-service
- minio
networks:
- dagi-network
restart: unless-stopped
brand-registry:
build:
context: ./services/brand-registry
dockerfile: Dockerfile
container_name: brand-registry-node1
ports:
- 9210:9210
environment:
- BRAND_REGISTRY_DATA=/data/brand-registry
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./logs:/app/logs
- brand-registry-data-node1:/data/brand-registry
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:9210/health')"
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
brand-intake:
build:
context: ./services/brand-intake
dockerfile: Dockerfile
container_name: brand-intake-node1
ports:
- 9211:9211
environment:
- BRAND_MAP_PATH=/app/config/BrandMap.yaml
- BRAND_INTAKE_DATA=/data/brand-intake
- BRAND_REGISTRY_URL=http://brand-registry:9210
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./config/brand/BrandMap.yaml:/app/config/BrandMap.yaml:ro
- ./logs:/app/logs
- brand-intake-data-node1:/data/brand-intake
depends_on:
- brand-registry
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:9211/health')"
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
presentation-renderer:
build:
context: ./services/presentation-renderer
dockerfile: Dockerfile
container_name: presentation-renderer-node1
ports:
- 9212:9212
environment:
- BRAND_REGISTRY_URL=http://brand-registry:9210
- PRESENTATION_DATA=/data/presentations
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./logs:/app/logs
- presentation-data-node1:/data/presentations
depends_on:
- brand-registry
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:9212/health')"
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
memory-service:
build:
context: ./services/memory-service
dockerfile: Dockerfile
container_name: dagi-memory-service-node1
ports:
- 8000:8000
environment:
- MEMORY_POSTGRES_HOST=dagi-postgres
- MEMORY_POSTGRES_PORT=5432
- MEMORY_POSTGRES_USER=daarion
- MEMORY_POSTGRES_PASSWORD=DaarionDB2026!
- MEMORY_POSTGRES_DB=daarion_memory
- MEMORY_QDRANT_HOST=qdrant
- MEMORY_QDRANT_PORT=6333
- MEMORY_COHERE_API_KEY=nOdOXnuepLku2ipJWpe6acWgAsJCsDhMO0RnaEJB
- MEMORY_DEBUG=false
- MEMORY_DEEPSEEK_API_KEY=sk-0db94e8193ec4a6e9acd593ee8d898e7
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./logs:/app/logs
depends_on:
- qdrant
networks:
dagi-network:
aliases:
- memory-service
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
dagi-postgres:
image: pgvector/pgvector:pg16
container_name: dagi-postgres
ports:
- 5432:5432
environment:
- POSTGRES_USER=daarion
- POSTGRES_PASSWORD=DaarionDB2026!
- POSTGRES_DB=daarion_main
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- postgres_data_node1:/var/lib/postgresql/data
networks:
- dagi-network
restart: unless-stopped
qdrant:
image: qdrant/qdrant:v1.7.4
container_name: dagi-qdrant-node1
ulimits:
nofile:
soft: 65536
hard: 65536
ports:
- 6333:6333
- 6334:6334
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- qdrant-data-node1:/qdrant/storage
networks:
dagi-network:
aliases:
- qdrant
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- wget -qO- http://localhost:6333/healthz || exit 1
interval: 30s
timeout: 10s
retries: 3
neo4j:
image: neo4j:5.15-community
container_name: dagi-neo4j-node1
ports:
- 7474:7474
- 7687:7687
environment:
- NEO4J_AUTH=neo4j/DaarionNeo4j2026!
- NEO4J_PLUGINS=["apoc"]
- NEO4J_dbms_memory_heap_initial__size=512m
- NEO4J_dbms_memory_heap_max__size=2G
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- neo4j-data-node1:/data
- neo4j-logs-node1:/logs
networks:
dagi-network:
aliases:
- neo4j
restart: unless-stopped
healthcheck:
test:
- CMD
- wget
- --no-verbose
- --tries=1
- --spider
- http://localhost:7474
interval: 30s
timeout: 10s
retries: 3
redis:
image: redis:7-alpine
container_name: dagi-redis-node1
ports:
- 6379:6379
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- redis-data-node1:/data
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD
- redis-cli
- PING
interval: 30s
timeout: 5s
retries: 3
vision-encoder:
build:
context: ./services/vision-encoder
dockerfile: Dockerfile
container_name: dagi-vision-encoder-node1
ports:
- 8001:8001
environment:
- DEVICE=cpu
- MODEL_NAME=${VISION_MODEL_NAME:-ViT-L-14}
- MODEL_PRETRAINED=${VISION_MODEL_PRETRAINED:-openai}
- NORMALIZE_EMBEDDINGS=true
- QDRANT_HOST=qdrant
- QDRANT_PORT=6333
- QDRANT_ENABLED=true
volumes:
- /opt/microdao-daarion/crews:/opt/microdao-daarion/crews:ro
- /opt/microdao-daarion/packages:/opt/microdao-daarion/packages:ro
- /opt/microdao-daarion/data:/opt/microdao-daarion/data:ro
- ./logs:/app/logs
- vision-model-cache-node1:/root/.cache/clip
depends_on:
- qdrant
networks:
- dagi-network
restart: unless-stopped
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:8001/health')"
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
market-data-service:
container_name: dagi-market-data-node1
restart: unless-stopped
build:
context: ./services/market-data-service
dockerfile: Dockerfile
environment:
- BINANCE_WS_URL=wss://stream.binance.com:9443/ws
- BYBIT_WS_URL=wss://stream.bybit.com/v5/public/spot
- ALPACA_DRY_RUN=true
- SQLITE_URL=sqlite+aiosqlite:////data/market_data.db
- JSONL_PATH=/data/events.jsonl
- HTTP_HOST=0.0.0.0
- HTTP_PORT=8891
- NATS_URL=nats://nats:4222
- NATS_ENABLED=true
- NATS_SUBJECT_PREFIX=md.events
- LOG_LEVEL=INFO
- LOG_SAMPLE_RATE=500
ports:
- "8891:8891"
volumes:
- market-data-node1:/data
networks:
- dagi-network
depends_on:
- nats
command: ["run", "--provider", "binance,bybit", "--symbols", "BTCUSDT,ETHUSDT"]
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:8891/health')"
interval: 15s
timeout: 5s
retries: 3
start_period: 10s
senpai-md-consumer:
container_name: dagi-senpai-md-consumer-node1
restart: unless-stopped
build:
context: ./services/senpai-md-consumer
dockerfile: Dockerfile
environment:
- NATS_URL=nats://nats:4222
- NATS_SUBJECT=md.events.>
- NATS_QUEUE_GROUP=senpai-md
- FEATURES_ENABLED=true
- FEATURES_PUB_RATE_HZ=10
- FEATURES_PUB_SUBJECT=senpai.features
- SIGNALS_PUB_SUBJECT=senpai.signals
- ALERTS_PUB_SUBJECT=senpai.alerts
- LOG_LEVEL=INFO
- HTTP_PORT=8892
ports:
- "8892:8892"
networks:
- dagi-network
depends_on:
nats:
condition: service_started
market-data-service:
condition: service_healthy
healthcheck:
test:
- CMD-SHELL
- python -c "import urllib.request; urllib.request.urlopen('http://localhost:8892/health')"
interval: 15s
timeout: 5s
retries: 3
start_period: 15s
volumes:
qdrant-data-node1: null
neo4j-data-node1: null
neo4j-logs-node1: null
redis-data-node1: null
vision-model-cache-node1: null
docling-model-cache-node1: null
swapper-hf-cache-node1: null
brand-registry-data-node1: null
brand-intake-data-node1: null
presentation-data-node1: null
nats-data-node1: null
minio-data-node1: null
postgres_data_node1: null
market-data-node1: null
networks:
dagi-network:
external: true