docker-compose.yml 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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. - "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. - "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. # PostgreSQL Admin Interface (pgAdmin)
  42. pgadmin:
  43. image: dpage/pgadmin4:latest
  44. container_name: saas-pgadmin
  45. environment:
  46. PGADMIN_DEFAULT_EMAIL: ${PGADMIN_EMAIL:-admin@example.com}
  47. PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PASSWORD:-admin_password_change_me}
  48. ports:
  49. - "5050:80"
  50. volumes:
  51. - pgadmin_data:/var/lib/pgadmin
  52. networks:
  53. - saas-network
  54. depends_on:
  55. - postgres
  56. restart: unless-stopped
  57. # API Gateway (Nginx)
  58. api-gateway:
  59. image: nginx:alpine
  60. container_name: saas-gateway
  61. ports:
  62. - "8888:80"
  63. - "8443:443"
  64. volumes:
  65. - ./nginx/nginx.conf:/etc/nginx/nginx.conf
  66. - ./nginx/conf.d:/etc/nginx/conf.d
  67. - ./ssl:/etc/nginx/ssl
  68. networks:
  69. - saas-network
  70. depends_on:
  71. - postgres
  72. - redis
  73. - auth-service
  74. restart: unless-stopped
  75. # Authentication Service
  76. auth-service:
  77. build:
  78. context: ./services/auth
  79. dockerfile: Dockerfile
  80. container_name: saas-auth
  81. environment:
  82. DATABASE_URL: postgresql://${POSTGRES_USER:-saas_user}:${POSTGRES_PASSWORD:-secure_password_change_me}@postgres:5432/${POSTGRES_DB:-saas_db}
  83. REDIS_URL: redis://:${REDIS_PASSWORD:-redis_secure_password_change_me}@redis:6379
  84. JWT_SECRET: ${JWT_SECRET:-your_jwt_secret_change_me}
  85. NODE_ENV: development
  86. ports:
  87. - "3001:3001"
  88. volumes:
  89. - ./services/auth:/app
  90. - /app/node_modules
  91. networks:
  92. - saas-network
  93. depends_on:
  94. - postgres
  95. - redis
  96. restart: unless-stopped
  97. # API Service (Core API)
  98. api-service:
  99. build:
  100. context: ./services/api
  101. dockerfile: Dockerfile
  102. container_name: saas-api
  103. environment:
  104. DATABASE_URL: postgresql://${POSTGRES_USER:-saas_user}:${POSTGRES_PASSWORD:-secure_password_change_me}@postgres:5432/${POSTGRES_DB:-saas_db}
  105. REDIS_URL: redis://:${REDIS_PASSWORD:-redis_secure_password_change_me}@redis:6379
  106. AUTH_SERVICE_URL: http://auth-service:3001
  107. NODE_ENV: development
  108. ports:
  109. - "3000:3000"
  110. volumes:
  111. - ./services/api:/app
  112. - /app/node_modules
  113. - ./apps:/apps
  114. networks:
  115. - saas-network
  116. depends_on:
  117. - postgres
  118. - redis
  119. - auth-service
  120. restart: unless-stopped
  121. # Storage Service (MinIO for S3-compatible storage)
  122. storage:
  123. image: minio/minio:latest
  124. container_name: saas-storage
  125. environment:
  126. MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
  127. MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin_change_me}
  128. ports:
  129. - "9000:9000"
  130. - "9001:9001"
  131. volumes:
  132. - minio_data:/data
  133. networks:
  134. - saas-network
  135. command: server /data --console-address ":9001"
  136. restart: unless-stopped
  137. healthcheck:
  138. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  139. interval: 30s
  140. timeout: 20s
  141. retries: 3
  142. # Real-time Service (WebSocket support)
  143. realtime-service:
  144. build:
  145. context: ./services/realtime
  146. dockerfile: Dockerfile
  147. container_name: saas-realtime
  148. environment:
  149. REDIS_URL: redis://:${REDIS_PASSWORD:-redis_secure_password_change_me}@redis:6379
  150. NODE_ENV: development
  151. ports:
  152. - "3002:3002"
  153. volumes:
  154. - ./services/realtime:/app
  155. - /app/node_modules
  156. networks:
  157. - saas-network
  158. depends_on:
  159. - redis
  160. restart: unless-stopped
  161. # Monitoring (Prometheus)
  162. prometheus:
  163. image: prom/prometheus:latest
  164. container_name: saas-prometheus
  165. ports:
  166. - "9090:9090"
  167. volumes:
  168. - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
  169. - prometheus_data:/prometheus
  170. networks:
  171. - saas-network
  172. restart: unless-stopped
  173. # Monitoring (Grafana)
  174. grafana:
  175. image: grafana/grafana:latest
  176. container_name: saas-grafana
  177. environment:
  178. GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin_password_change_me}
  179. ports:
  180. - "3003:3000"
  181. volumes:
  182. - grafana_data:/var/lib/grafana
  183. - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards
  184. - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources
  185. networks:
  186. - saas-network
  187. depends_on:
  188. - prometheus
  189. restart: unless-stopped
  190. # MCP Server
  191. mcp-server:
  192. build:
  193. context: ./mcp-server
  194. dockerfile: Dockerfile
  195. container_name: saas-mcp-server
  196. environment:
  197. SAAS_API_URL: http://api-gateway
  198. SAAS_AUTH_URL: http://auth-service/auth
  199. SAAS_STORAGE_URL: http://storage/storage
  200. DEBUG: "false"
  201. volumes:
  202. - ./mcp-server:/app
  203. - /app/node_modules
  204. networks:
  205. - saas-network
  206. depends_on:
  207. - api-gateway
  208. - auth-service
  209. - storage
  210. restart: unless-stopped
  211. profiles:
  212. - mcp
  213. # Dashboard (React Admin Panel)
  214. dashboard:
  215. build:
  216. context: ./dashboard
  217. dockerfile: Dockerfile
  218. container_name: saas-dashboard
  219. ports:
  220. - "5173:80"
  221. volumes:
  222. - ./dashboard:/app
  223. - /app/node_modules
  224. networks:
  225. - saas-network
  226. depends_on:
  227. - api-service
  228. - auth-service
  229. restart: unless-stopped
  230. environment:
  231. - VITE_API_URL=http://localhost:8888
  232. - VITE_AUTH_API_URL=http://localhost:8888/auth
  233. - VITE_STORAGE_URL=http://localhost:8888/storage
  234. volumes:
  235. postgres_data:
  236. redis_data:
  237. pgadmin_data:
  238. minio_data:
  239. prometheus_data:
  240. grafana_data:
  241. networks:
  242. saas-network:
  243. driver: bridge