version: '3.8' services: # PostgreSQL Database Service db: image: postgres:15-alpine container_name: market-data-db environment: POSTGRES_USER: ${DB_USER:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} POSTGRES_DB: ${DB_NAME:-financial_data} PGDATA: /var/lib/postgresql/data/pgdata volumes: - market_data_db_data:/var/lib/postgresql/data - ./docker/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh ports: - "${DB_PORT:-5432}:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-financial_data}"] interval: 10s timeout: 5s retries: 5 networks: - market-data-network restart: unless-stopped # Node.js API Service api: build: context: . dockerfile: Dockerfile target: dependencies container_name: market-data-api environment: - NODE_ENV=${NODE_ENV:-development} - PORT=${PORT:-3001} - DB_HOST=db - DB_PORT=5432 - DB_NAME=${DB_NAME:-financial_data} - DB_USER=${DB_USER:-postgres} - DB_PASSWORD=${DB_PASSWORD:-postgres} - CORS_ORIGIN=${CORS_ORIGIN:-*} - JWT_SECRET=${JWT_SECRET:-change-me-in-production} - LOG_LEVEL=${LOG_LEVEL:-debug} volumes: # Mount source code for live reload in development - ./src:/app/src - ./config:/app/config - ./migrations:/app/migrations - ./models:/app/models - ./logs:/app/logs ports: - "${PORT:-3001}:3001" depends_on: db: condition: service_healthy networks: - market-data-network restart: unless-stopped # Override entrypoint for development to use nodemon with live reload entrypoint: /bin/sh command: -c "/usr/local/bin/wait-for-db.sh && node docker/sync-models.js && (npx sequelize-cli db:migrate || echo 'No migrations to run or migration skipped') && npm install -g nodemon && nodemon src/server.js" # Nginx Reverse Proxy # For local development with MT5 EA, use: http://market-data.local # Run: sudo bash scripts/setup-local-dev.sh (one-time setup) nginx: image: nginx:alpine container_name: market-data-nginx ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - api networks: - market-data-network restart: unless-stopped healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 volumes: market_data_db_data: driver: local networks: market-data-network: driver: bridge