services: # Dragonfly - Redis replacement for caching and events dragonfly: image: docker.dragonflydb.io/dragonflydb/dragonfly:latest container_name: trading-bot-dragonfly ports: - "6379:6379" command: - dragonfly - --logtostderr - --cache_mode=true - --maxmemory=2gb - --proactor_threads=8 - --bind=0.0.0.0 volumes: - dragonfly_data:/data restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 3 networks: - trading-bot-network # PostgreSQL - Operational data (orders, positions, strategies) postgres: image: postgres:16-alpine container_name: trading-bot-postgres environment: POSTGRES_DB: trading_bot POSTGRES_USER: trading_user POSTGRES_PASSWORD: trading_pass_dev POSTGRES_INITDB_ARGS: "--encoding=UTF-8" ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./database/postgres/init:/docker-entrypoint-initdb.d restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U trading_user -d trading_bot"] interval: 30s timeout: 10s retries: 3 networks: - trading-bot-network # QuestDB - Time-series data (OHLCV, indicators, performance) questdb: image: questdb/questdb:latest container_name: trading-bot-questdb ports: - "9000:9000" # Web console - "8812:8812" # PostgreSQL wire protocol - "9009:9009" # InfluxDB line protocol volumes: - questdb_data:/var/lib/questdb environment: - QDB_TELEMETRY_ENABLED=false restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/status"] interval: 30s timeout: 10s retries: 3 networks: - trading-bot-network # Redis Insight - GUI for Dragonfly debugging redis-insight: image: redislabs/redisinsight:latest container_name: trading-bot-redis-insight ports: - "8001:8001" environment: - REDIS_HOSTS=local:dragonfly:6379 depends_on: - dragonfly restart: unless-stopped networks: - trading-bot-network # PgAdmin - PostgreSQL GUI pgadmin: image: dpage/pgadmin4:latest container_name: trading-bot-pgadmin environment: PGADMIN_DEFAULT_EMAIL: admin@example.com PGADMIN_DEFAULT_PASSWORD: admin123 PGADMIN_CONFIG_SERVER_MODE: 'False' PGADMIN_DISABLE_POSTFIX: 'true' ports: - "8080:80" volumes: - pgadmin_data:/var/lib/pgadmin depends_on: - postgres restart: unless-stopped networks: - trading-bot-network # Prometheus - Metrics collection (optional) prometheus: image: prom/prometheus:latest container_name: trading-bot-prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--web.enable-lifecycle' restart: unless-stopped networks: - trading-bot-network # Grafana - Metrics visualization (optional) grafana: image: grafana/grafana:latest container_name: trading-bot-grafana ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin123 - GF_SECURITY_ADMIN_USER=admin - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/provisioning:/etc/grafana/provisioning depends_on: - prometheus restart: unless-stopped networks: - trading-bot-network volumes: postgres_data: questdb_data: dragonfly_data: pgadmin_data: prometheus_data: grafana_data: networks: trading-bot-network: driver: bridge