docker-compose.yml 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. services:
  2. # PostgreSQL Database
  3. postgres:
  4. image: postgres:15-alpine
  5. container_name: saas-postgres
  6. environment:
  7. POSTGRES_DB: ${POSTGRES_DB:-saas_db}
  8. POSTGRES_USER: ${POSTGRES_USER:-saas_user}
  9. POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-secure_password_change_me}
  10. POSTGRES_INITDB_ARGS: "--auth-host=scram-sha-256"
  11. volumes:
  12. - postgres_data:/var/lib/postgresql/data
  13. - ./database/init:/docker-entrypoint-initdb.d
  14. ports:
  15. - "${POSTGRES_PORT:-5432}:5432"
  16. networks:
  17. - saas-network
  18. restart: unless-stopped
  19. healthcheck:
  20. test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-saas_user} -d ${POSTGRES_DB:-saas_db}"]
  21. interval: 30s
  22. timeout: 10s
  23. retries: 3
  24. # Redis for caching and sessions
  25. redis:
  26. image: redis:7-alpine
  27. container_name: saas-redis
  28. command: redis-server --requirepass ${REDIS_PASSWORD:-redis_secure_password_change_me}
  29. ports:
  30. - "${REDIS_PORT:-6379}:6379"
  31. volumes:
  32. - redis_data:/data
  33. networks:
  34. - saas-network
  35. restart: unless-stopped
  36. healthcheck:
  37. test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
  38. interval: 30s
  39. timeout: 10s
  40. retries: 3
  41. # API Gateway (Nginx)
  42. api-gateway:
  43. image: nginx:alpine
  44. container_name: saas-gateway
  45. ports:
  46. - "${HTTP_PORT:-80}:80"
  47. - "${HTTPS_PORT:-443}:443"
  48. volumes:
  49. - ./nginx/nginx.conf:/etc/nginx/nginx.conf
  50. - ./nginx/conf.d:/etc/nginx/conf.d
  51. - ./ssl:/etc/nginx/ssl
  52. - ./apps/hello-world:/usr/share/nginx/html/hello-world
  53. networks:
  54. - saas-network
  55. depends_on:
  56. - postgres
  57. - redis
  58. - auth-service
  59. - api-service
  60. - dashboard
  61. - realtime-service
  62. restart: unless-stopped
  63. # Authentication Service
  64. auth-service:
  65. build:
  66. context: ./services/auth
  67. dockerfile: Dockerfile
  68. container_name: saas-auth
  69. environment:
  70. DATABASE_URL: postgresql://${POSTGRES_USER:-saas_user}:${POSTGRES_PASSWORD:-secure_password_change_me}@postgres:5432/${POSTGRES_DB:-saas_db}
  71. REDIS_URL: redis://:${REDIS_PASSWORD:-redis_secure_password_change_me}@redis:6379
  72. JWT_SECRET: ${JWT_SECRET:-your_jwt_secret_change_me}
  73. NODE_ENV: development
  74. ports:
  75. - "3001:3001"
  76. volumes:
  77. - ./services/auth:/app
  78. - /app/node_modules
  79. networks:
  80. - saas-network
  81. depends_on:
  82. - postgres
  83. - redis
  84. restart: unless-stopped
  85. # API Service (Core API)
  86. api-service:
  87. build:
  88. context: .
  89. dockerfile: services/api/Dockerfile
  90. container_name: saas-api
  91. environment:
  92. DATABASE_URL: postgresql://${POSTGRES_USER:-saas_user}:${POSTGRES_PASSWORD:-secure_password_change_me}@postgres:5432/${POSTGRES_DB:-saas_db}
  93. REDIS_URL: redis://:${REDIS_PASSWORD:-redis_secure_password_change_me}@redis:6379
  94. AUTH_SERVICE_URL: http://auth-service:3001
  95. NODE_ENV: development
  96. ports:
  97. - "3000:3000"
  98. volumes:
  99. - ./services/api:/app
  100. - /app/node_modules
  101. - ./apps:/apps
  102. networks:
  103. - saas-network
  104. depends_on:
  105. - postgres
  106. - redis
  107. - auth-service
  108. restart: unless-stopped
  109. # Storage Service (MinIO for S3-compatible storage)
  110. storage:
  111. image: minio/minio:latest
  112. container_name: saas-storage
  113. environment:
  114. MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
  115. MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin_change_me}
  116. ports:
  117. - "9000:9000"
  118. - "9001:9001"
  119. volumes:
  120. - minio_data:/data
  121. networks:
  122. - saas-network
  123. command: server /data --console-address ":9001"
  124. restart: unless-stopped
  125. healthcheck:
  126. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  127. interval: 30s
  128. timeout: 20s
  129. retries: 3
  130. # Real-time Service (WebSocket support)
  131. realtime-service:
  132. build:
  133. context: ./services/realtime
  134. dockerfile: Dockerfile
  135. container_name: saas-realtime
  136. environment:
  137. REDIS_URL: redis://:${REDIS_PASSWORD:-redis_secure_password_change_me}@redis:6379
  138. JWT_SECRET: ${JWT_SECRET:-your_jwt_secret_change_me}
  139. PORT: 3002
  140. NODE_ENV: development
  141. ports:
  142. - "3002:3002"
  143. volumes:
  144. - ./services/realtime:/app
  145. - /app/node_modules
  146. networks:
  147. - saas-network
  148. depends_on:
  149. - redis
  150. restart: unless-stopped
  151. # Monitoring (Prometheus)
  152. prometheus:
  153. image: prom/prometheus:latest
  154. container_name: saas-prometheus
  155. ports:
  156. - "9090:9090"
  157. volumes:
  158. - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
  159. - prometheus_data:/prometheus
  160. networks:
  161. - saas-network
  162. restart: unless-stopped
  163. # Monitoring (Grafana)
  164. grafana:
  165. image: grafana/grafana:latest
  166. container_name: saas-grafana
  167. environment:
  168. GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin_password_change_me}
  169. ports:
  170. - "3003:3000"
  171. volumes:
  172. - grafana_data:/var/lib/grafana
  173. - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards
  174. - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources
  175. networks:
  176. - saas-network
  177. depends_on:
  178. - prometheus
  179. restart: unless-stopped
  180. # MCP Server
  181. mcp-server:
  182. build:
  183. context: ./mcp-server
  184. dockerfile: Dockerfile
  185. container_name: saas-mcp-server
  186. environment:
  187. SAAS_API_URL: http://api-gateway
  188. SAAS_AUTH_URL: http://auth-service/auth
  189. SAAS_STORAGE_URL: http://storage/storage
  190. DEBUG: "false"
  191. volumes:
  192. - ./mcp-server:/app
  193. - /app/node_modules
  194. networks:
  195. - saas-network
  196. depends_on:
  197. - api-gateway
  198. - auth-service
  199. - storage
  200. restart: unless-stopped
  201. profiles:
  202. - mcp
  203. # Dashboard (React Admin Panel)
  204. dashboard:
  205. build:
  206. context: ./dashboard
  207. dockerfile: Dockerfile
  208. container_name: saas-dashboard
  209. ports:
  210. - "5173:80"
  211. volumes:
  212. - ./dashboard:/app
  213. - /app/node_modules
  214. networks:
  215. - saas-network
  216. depends_on:
  217. - api-service
  218. - auth-service
  219. restart: unless-stopped
  220. environment:
  221. - VITE_API_URL=http://localhost:8888/api
  222. - VITE_AUTH_API_URL=http://localhost:8888/auth
  223. - VITE_STORAGE_URL=http://localhost:8888/storage
  224. volumes:
  225. postgres_data:
  226. redis_data:
  227. minio_data:
  228. prometheus_data:
  229. grafana_data:
  230. networks:
  231. saas-network:
  232. driver: bridge