docker-compose.yml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. - /var/run/docker.sock:/var/run/docker.sock
  103. networks:
  104. - saas-network
  105. depends_on:
  106. - postgres
  107. - redis
  108. - auth-service
  109. restart: unless-stopped
  110. privileged: true
  111. # Storage Service (MinIO for S3-compatible storage)
  112. storage:
  113. image: minio/minio:latest
  114. container_name: saas-storage
  115. environment:
  116. MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
  117. MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin_change_me}
  118. ports:
  119. - "9000:9000"
  120. - "9001:9001"
  121. volumes:
  122. - minio_data:/data
  123. networks:
  124. - saas-network
  125. command: server /data --console-address ":9001"
  126. restart: unless-stopped
  127. healthcheck:
  128. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  129. interval: 30s
  130. timeout: 20s
  131. retries: 3
  132. # Real-time Service (WebSocket support)
  133. realtime-service:
  134. build:
  135. context: ./services/realtime
  136. dockerfile: Dockerfile
  137. container_name: saas-realtime
  138. environment:
  139. REDIS_URL: redis://:${REDIS_PASSWORD:-redis_secure_password_change_me}@redis:6379
  140. JWT_SECRET: ${JWT_SECRET:-your_jwt_secret_change_me}
  141. PORT: 3002
  142. NODE_ENV: development
  143. ports:
  144. - "3002:3002"
  145. volumes:
  146. - ./services/realtime:/app
  147. - /app/node_modules
  148. networks:
  149. - saas-network
  150. depends_on:
  151. - redis
  152. restart: unless-stopped
  153. # Monitoring (Prometheus)
  154. prometheus:
  155. image: prom/prometheus:latest
  156. container_name: saas-prometheus
  157. ports:
  158. - "9090:9090"
  159. volumes:
  160. - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
  161. - prometheus_data:/prometheus
  162. networks:
  163. - saas-network
  164. restart: unless-stopped
  165. # Monitoring (Grafana)
  166. grafana:
  167. image: grafana/grafana:latest
  168. container_name: saas-grafana
  169. environment:
  170. GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin_password_change_me}
  171. ports:
  172. - "3003:3000"
  173. volumes:
  174. - grafana_data:/var/lib/grafana
  175. - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards
  176. - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources
  177. networks:
  178. - saas-network
  179. depends_on:
  180. - prometheus
  181. restart: unless-stopped
  182. # MCP Server
  183. mcp-server:
  184. build:
  185. context: ./mcp-server
  186. dockerfile: Dockerfile
  187. container_name: saas-mcp-server
  188. environment:
  189. SAAS_API_URL: http://api-gateway
  190. SAAS_AUTH_URL: http://auth-service/auth
  191. SAAS_STORAGE_URL: http://storage/storage
  192. DEBUG: "false"
  193. volumes:
  194. - ./mcp-server:/app
  195. - /app/node_modules
  196. networks:
  197. - saas-network
  198. depends_on:
  199. - api-gateway
  200. - auth-service
  201. - storage
  202. restart: unless-stopped
  203. profiles:
  204. - mcp
  205. # Dashboard (React Admin Panel)
  206. dashboard:
  207. build:
  208. context: ./dashboard
  209. dockerfile: Dockerfile
  210. container_name: saas-dashboard
  211. ports:
  212. - "5173:80"
  213. volumes:
  214. - ./dashboard:/app
  215. - /app/node_modules
  216. networks:
  217. - saas-network
  218. depends_on:
  219. - api-service
  220. - auth-service
  221. restart: unless-stopped
  222. environment:
  223. - VITE_API_URL=http://localhost:8888/api
  224. - VITE_AUTH_API_URL=http://localhost:8888/auth
  225. - VITE_STORAGE_URL=http://localhost:8888/storage
  226. volumes:
  227. postgres_data:
  228. redis_data:
  229. minio_data:
  230. prometheus_data:
  231. grafana_data:
  232. networks:
  233. saas-network:
  234. driver: bridge