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 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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:-http://localhost:3000,https://beta-app.insightbull.io,https://app.insightbull.io}
  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. - ./docker/nginx-entrypoint.sh:/docker-entrypoint-nginx.sh:ro
  71. # SSL certificates from certbot (shared volume)
  72. - certbot_etc:/etc/letsencrypt:ro
  73. - certbot_www:/var/www/certbot:ro
  74. - certbot_reload:/var/run/certbot-reload:rw
  75. environment:
  76. - DOMAIN_NAME=${DOMAIN_NAME:-default}
  77. depends_on:
  78. - api
  79. - certbot
  80. networks:
  81. - market-data-network
  82. restart: unless-stopped
  83. entrypoint: ["/bin/sh", "/docker-entrypoint-nginx.sh"]
  84. healthcheck:
  85. test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"]
  86. interval: 30s
  87. timeout: 10s
  88. retries: 3
  89. # Certbot for SSL Certificate Management
  90. certbot:
  91. image: certbot/certbot:latest
  92. container_name: market-data-certbot
  93. volumes:
  94. - certbot_etc:/etc/letsencrypt
  95. - certbot_www:/var/www/certbot
  96. - certbot_logs:/var/log/letsencrypt
  97. - certbot_reload:/var/run/certbot-reload
  98. networks:
  99. - market-data-network
  100. restart: unless-stopped
  101. entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --quiet && touch /var/run/certbot-reload/reload 2>/dev/null || true; sleep 12h & wait $${!}; done;'"
  102. # Note: Initial certificate must be obtained using certbot-init service
  103. # Run: DOMAIN_NAME=yourdomain.com SSL_EMAIL=your@email.com docker-compose -f docker-compose.prod.yml run --rm certbot-init
  104. # Certbot Initialization Service (one-time use)
  105. certbot-init:
  106. image: certbot/certbot:latest
  107. container_name: market-data-certbot-init
  108. volumes:
  109. - certbot_etc:/etc/letsencrypt
  110. - certbot_www:/var/www/certbot
  111. - certbot_logs:/var/log/letsencrypt
  112. - ./docker/init-ssl.sh:/docker/init-ssl.sh:ro
  113. networks:
  114. - market-data-network
  115. entrypoint: /bin/sh
  116. command: /docker/init-ssl.sh
  117. environment:
  118. - DOMAIN_NAME=${DOMAIN_NAME}
  119. - SSL_EMAIL=${SSL_EMAIL}
  120. - SSL_STAGING=${SSL_STAGING:-0}
  121. volumes:
  122. market_data_db_data_prod:
  123. driver: local
  124. market_data_logs_prod:
  125. driver: local
  126. certbot_etc:
  127. driver: local
  128. certbot_www:
  129. driver: local
  130. certbot_logs:
  131. driver: local
  132. certbot_reload:
  133. driver: local
  134. networks:
  135. market-data-network:
  136. driver: bridge