Market Data Service is a high-performance financial data API that provides comprehensive Symbol prices of different markets through both RESTful endpoints and real-time WebSocket connections.

docker-compose.prod.yml 2.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. version: '3.8'
  2. services:
  3. # PostgreSQL Database Service (Production)
  4. db:
  5. image: postgres:15-alpine
  6. container_name: market-data-db-prod
  7. environment:
  8. POSTGRES_USER: ${DB_USER:-postgres}
  9. POSTGRES_PASSWORD: ${DB_PASSWORD}
  10. POSTGRES_DB: ${DB_NAME:-financial_data}
  11. PGDATA: /var/lib/postgresql/data/pgdata
  12. volumes:
  13. - market_data_db_data_prod:/var/lib/postgresql/data
  14. - ./docker/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh
  15. # No exposed ports in production (internal only)
  16. healthcheck:
  17. test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-financial_data}"]
  18. interval: 10s
  19. timeout: 5s
  20. retries: 5
  21. networks:
  22. - market-data-network
  23. restart: unless-stopped
  24. # Production security: run as non-root
  25. user: "999:999"
  26. # Node.js API Service (Production)
  27. api:
  28. build:
  29. context: .
  30. dockerfile: Dockerfile
  31. target: production
  32. container_name: market-data-api-prod
  33. environment:
  34. - NODE_ENV=production
  35. - PORT=3000
  36. - DB_HOST=db
  37. - DB_PORT=5432
  38. - DB_NAME=${DB_NAME:-financial_data}
  39. - DB_USER=${DB_USER:-postgres}
  40. - DB_PASSWORD=${DB_PASSWORD}
  41. - CORS_ORIGIN=${CORS_ORIGIN:-*}
  42. - JWT_SECRET=${JWT_SECRET}
  43. - LOG_LEVEL=${LOG_LEVEL:-info}
  44. # No volume mounts in production (code is baked into image)
  45. # Optional: mount logs volume for persistence
  46. volumes:
  47. - market_data_logs_prod:/app/logs
  48. # No exposed ports (accessed only through nginx)
  49. depends_on:
  50. db:
  51. condition: service_healthy
  52. networks:
  53. - market-data-network
  54. restart: unless-stopped
  55. healthcheck:
  56. test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"]
  57. interval: 30s
  58. timeout: 10s
  59. start_period: 40s
  60. retries: 3
  61. # Nginx Reverse Proxy (Production)
  62. nginx:
  63. image: nginx:alpine
  64. container_name: market-data-nginx-prod
  65. ports:
  66. - "80:80"
  67. - "443:443"
  68. volumes:
  69. - ./nginx/nginx.prod.conf:/etc/nginx/nginx.conf:ro
  70. # SSL certificates (mount your certbot certificates here)
  71. - ${SSL_CERT_PATH:-./ssl/certs}:/etc/nginx/ssl/certs:ro
  72. - ${SSL_KEY_PATH:-./ssl/private}:/etc/nginx/ssl/private:ro
  73. depends_on:
  74. api:
  75. condition: service_healthy
  76. networks:
  77. - market-data-network
  78. restart: unless-stopped
  79. healthcheck:
  80. test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"]
  81. interval: 30s
  82. timeout: 10s
  83. retries: 3
  84. volumes:
  85. market_data_db_data_prod:
  86. driver: local
  87. market_data_logs_prod:
  88. driver: local
  89. networks:
  90. market-data-network:
  91. driver: bridge