docker-compose.yml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. services:
  2. postgres:
  3. image: postgres:18.3
  4. container_name: postgres
  5. ports:
  6. - "5434:5432"
  7. environment:
  8. POSTGRES_USER: postgres
  9. POSTGRES_PASSWORD: postgres
  10. volumes:
  11. - postgres_data:/var/lib/postgresql
  12. - ./docker/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql
  13. healthcheck:
  14. test: ["CMD-SHELL", "pg_isready -U postgres"]
  15. interval: 5s
  16. timeout: 5s
  17. retries: 5
  18. rabbitmq:
  19. image: rabbitmq:3-management
  20. container_name: rabbitmq
  21. ports:
  22. - "5672:5672"
  23. - "15672:15672"
  24. environment:
  25. RABBITMQ_DEFAULT_USER: admin
  26. RABBITMQ_DEFAULT_PASS: admin
  27. # healthcheck:
  28. # test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
  29. # interval: 5s
  30. # timeout: 5s
  31. # retries: 5
  32. eureka:
  33. build: ./eurekaServer
  34. container_name: eureka
  35. ports:
  36. - "8761:8761"
  37. healthcheck:
  38. test: ["CMD-SHELL", "curl -f http://localhost:8761 || exit 1"]
  39. interval: 10s
  40. timeout: 5s
  41. retries: 10
  42. keycloak:
  43. image: quay.io/keycloak/keycloak:26.5.6
  44. command: start-dev --import-realm
  45. ports:
  46. - "8060:8060"
  47. volumes:
  48. - ./docker/keycloak/imports:/opt/keycloak/data/import
  49. - ./docker/keycloak/providers:/opt/keycloak/providers
  50. - ./docker/keycloak/themes/boat-theme:/opt/keycloak/themes/boat-theme
  51. environment:
  52. KC_BOOTSTRAP_ADMIN_USERNAME: admin
  53. KC_BOOTSTRAP_ADMIN_PASSWORD: admin
  54. KC_HTTP_ENABLED: "true"
  55. KC_HOSTNAME_STRICT: "false"
  56. KC_HOSTNAME_STRICT_HTTPS: "false"
  57. KC_HTTP_RELATIVE_PATH: "/"
  58. KC_HOSTNAME: localhost
  59. KC_HTTP_PORT: 8060
  60. KC_EVENTS_ENABLED: "true"
  61. KC_EVENTS_LISTENERS: "userservice-sync-listener"
  62. KC_ADMIN_EVENTS_ENABLED: "true"
  63. KC_ADMIN_EVENTS_DETAILS_ENABLED: "true"
  64. WEBHOOK_KEYCLOAK_SECRET: c8d904f5-5322-4d56-affb-fe63b9c436fb
  65. # healthcheck:
  66. # test: ["CMD-SHELL", "timeout 2 bash -c '</dev/tcp/127.0.0.1/8060'"]
  67. # interval: 10s
  68. # timeout: 5s
  69. # retries: 15
  70. gateway:
  71. build: ./springGateway
  72. container_name: gateway
  73. ports:
  74. - "8080:8080"
  75. env_file:
  76. - ./springGateway/.env.docker
  77. environment:
  78. OTEL_SDK_DISABLED: "false"
  79. OTEL_TRACES_EXPORTER: otlp
  80. OTEL_EXPORTER_OTLP_PROTOCOL: grpc
  81. OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
  82. OTEL_SERVICE_NAME: gateway
  83. OTEL_RESOURCE_ATTRIBUTES: service.instance.id=gateway,service.namespace=boat-delivery
  84. OTEL_METRICS_EXPORTER: none
  85. OTEL_PROPAGATORS: tracecontext,baggage
  86. OTEL_TRACE_SAMPLER: always_on
  87. depends_on:
  88. eureka:
  89. condition: service_healthy
  90. keycloak:
  91. condition: service_started
  92. jaeger:
  93. condition: service_started
  94. user-service:
  95. build: ./userService
  96. container_name: user-service-1
  97. expose:
  98. - "8081"
  99. env_file:
  100. - ./userService/.env.docker
  101. environment:
  102. SPRING_PROFILES_ACTIVE: test-dev
  103. APP_SYNC_ENABLED: "true"
  104. APP_SYNC_ENVIRONMENT: test-dev
  105. APP_SYNC_MIGRATE_ON_STARTUP: "true"
  106. APP_SYNC_KEYCLOAK_ADMIN_URL: http://keycloak:8060
  107. APP_SYNC_KEYCLOAK_ADMIN_USERNAME: admin
  108. APP_SYNC_KEYCLOAK_ADMIN_PASSWORD: admin
  109. APP_SYNC_KEYCLOAK_REALM: boat-delivery-realm
  110. APP_SYNC_DEFAULT_PASSWORD: "password123"
  111. OTEL_SDK_DISABLED: "false"
  112. OTEL_TRACES_EXPORTER: otlp
  113. OTEL_EXPORTER_OTLP_PROTOCOL: grpc
  114. OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
  115. OTEL_SERVICE_NAME: user-service-1
  116. OTEL_RESOURCE_ATTRIBUTES: service.instance.id=user-service-1,service.namespace=boat-delivery
  117. OTEL_METRICS_EXPORTER: none
  118. OTEL_PROPAGATORS: tracecontext,baggage
  119. OTEL_TRACE_SAMPLER: always_on
  120. OTEL_INSTRUMENTATION_SERVLET_ENABLED: "true"
  121. OTEL_INSTRUMENTATION_HTTP_SERVER_ENABLED: "true"
  122. OTEL_JAVA_LOGGING_AUTO_INSTRUMENTATION_ENABLED: "true"
  123. depends_on:
  124. postgres:
  125. condition: service_healthy
  126. eureka:
  127. condition: service_healthy
  128. jaeger:
  129. condition: service_started
  130. user-service-2:
  131. build: ./userService
  132. container_name: user-service-2
  133. expose:
  134. - "8081"
  135. env_file:
  136. - ./userService/.env.docker
  137. environment:
  138. SPRING_PROFILES_ACTIVE: test-dev
  139. APP_SYNC_ENABLED: "false"
  140. APP_SYNC_ENVIRONMENT: test-dev
  141. APP_SYNC_MIGRATE_ON_STARTUP: "false"
  142. APP_SYNC_KEYCLOAK_ADMIN_URL: http://keycloak:8060
  143. APP_SYNC_KEYCLOAK_ADMIN_USERNAME: admin
  144. APP_SYNC_KEYCLOAK_ADMIN_PASSWORD: admin
  145. APP_SYNC_KEYCLOAK_REALM: boat-delivery-realm
  146. APP_SYNC_DEFAULT_PASSWORD: "password123"
  147. OTEL_SDK_DISABLED: "false"
  148. OTEL_TRACES_EXPORTER: otlp
  149. OTEL_EXPORTER_OTLP_PROTOCOL: grpc
  150. OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
  151. OTEL_SERVICE_NAME: user-service-2
  152. OTEL_RESOURCE_ATTRIBUTES: service.instance.id=user-service-2,service.namespace=boat-delivery
  153. OTEL_METRICS_EXPORTER: none
  154. OTEL_PROPAGATORS: tracecontext,baggage
  155. OTEL_TRACE_SAMPLER: always_on
  156. OTEL_INSTRUMENTATION_SERVLET_ENABLED: "true"
  157. OTEL_INSTRUMENTATION_HTTP_SERVER_ENABLED: "true"
  158. OTEL_JAVA_LOGGING_AUTO_INSTRUMENTATION_ENABLED: "true"
  159. depends_on:
  160. postgres:
  161. condition: service_healthy
  162. eureka:
  163. condition: service_healthy
  164. jaeger:
  165. condition: service_started
  166. user-service-3:
  167. build: ./userService
  168. container_name: user-service-3
  169. expose:
  170. - "8081"
  171. env_file:
  172. - ./userService/.env.docker
  173. environment:
  174. SPRING_PROFILES_ACTIVE: test-dev
  175. APP_SYNC_ENABLED: "false"
  176. APP_SYNC_ENVIRONMENT: test-dev
  177. APP_SYNC_MIGRATE_ON_STARTUP: "false"
  178. APP_SYNC_KEYCLOAK_ADMIN_URL: http://keycloak:8060
  179. APP_SYNC_KEYCLOAK_ADMIN_USERNAME: admin
  180. APP_SYNC_KEYCLOAK_ADMIN_PASSWORD: admin
  181. APP_SYNC_KEYCLOAK_REALM: boat-delivery-realm
  182. APP_SYNC_DEFAULT_PASSWORD: "password123"
  183. OTEL_SDK_DISABLED: "false"
  184. OTEL_TRACES_EXPORTER: otlp
  185. OTEL_EXPORTER_OTLP_PROTOCOL: grpc
  186. OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
  187. OTEL_SERVICE_NAME: user-service-3
  188. OTEL_RESOURCE_ATTRIBUTES: service.instance.id=user-service-2,service.namespace=boat-delivery
  189. OTEL_METRICS_EXPORTER: none
  190. OTEL_PROPAGATORS: tracecontext,baggage
  191. OTEL_TRACE_SAMPLER: always_on
  192. OTEL_INSTRUMENTATION_SERVLET_ENABLED: "true"
  193. OTEL_INSTRUMENTATION_HTTP_SERVER_ENABLED: "true"
  194. OTEL_JAVA_LOGGING_AUTO_INSTRUMENTATION_ENABLED: "true"
  195. depends_on:
  196. postgres:
  197. condition: service_healthy
  198. eureka:
  199. condition: service_healthy
  200. jaeger:
  201. condition: service_started
  202. order-service:
  203. build: ./order-service
  204. container_name: order-service
  205. expose:
  206. - "8082"
  207. env_file:
  208. - ./order-service/.env.docker
  209. environment:
  210. OTEL_SDK_DISABLED: "false"
  211. OTEL_TRACES_EXPORTER: otlp
  212. OTEL_EXPORTER_OTLP_PROTOCOL: grpc
  213. OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
  214. OTEL_SERVICE_NAME: order-service
  215. OTEL_RESOURCE_ATTRIBUTES: service.instance.id=order-service,service.namespace=boat-delivery
  216. OTEL_METRICS_EXPORTER: none
  217. OTEL_PROPAGATORS: tracecontext,baggage
  218. OTEL_TRACE_SAMPLER: always_on
  219. depends_on:
  220. postgres:
  221. condition: service_healthy
  222. eureka:
  223. condition: service_healthy
  224. keycloak:
  225. condition: service_started
  226. jaeger:
  227. condition: service_started
  228. notification-service:
  229. build: ./notifi-service
  230. container_name: notification-service
  231. expose:
  232. - "8083"
  233. env_file:
  234. - ./notifi-service/.env.docker
  235. environment:
  236. OTEL_SDK_DISABLED: "false"
  237. OTEL_TRACES_EXPORTER: otlp
  238. OTEL_EXPORTER_OTLP_PROTOCOL: grpc
  239. OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
  240. OTEL_SERVICE_NAME: notification-service
  241. OTEL_RESOURCE_ATTRIBUTES: service.instance.id=notification-service,service.namespace=boat-delivery
  242. OTEL_METRICS_EXPORTER: none
  243. OTEL_PROPAGATORS: tracecontext,baggage
  244. OTEL_TRACE_SAMPLER: always_on
  245. OTEL_INSTRUMENTATION_SERVLET_ENABLED: "true"
  246. OTEL_INSTRUMENTATION_HTTP_SERVER_ENABLED: "true"
  247. OTEL_JAVA_LOGGING_AUTO_INSTRUMENTATION_ENABLED: "true"
  248. depends_on:
  249. postgres:
  250. condition: service_healthy
  251. # rabbitmq:
  252. # condition: service_healthy
  253. eureka:
  254. condition: service_healthy
  255. keycloak:
  256. condition: service_started
  257. jaeger:
  258. condition: service_started
  259. front:
  260. # OPTION 1: DEV MODE
  261. image: node:25.8.1
  262. working_dir: /app
  263. volumes:
  264. - ./front:/app
  265. command: sh -c "npm install && npm run dev -- --host"
  266. ports:
  267. - "5173:5173"
  268. depends_on:
  269. gateway:
  270. condition: service_started
  271. # OPTION 2: PROD MODE
  272. # build: ./front
  273. # container_name: front-app
  274. # ports:
  275. # - "5173:80"
  276. # depends_on:
  277. # gateway:
  278. # condition: service_started
  279. payment-service:
  280. build: ./payment-service
  281. container_name: payment-service
  282. expose:
  283. - "8084"
  284. env_file:
  285. - ./payment-service/.env.docker
  286. environment:
  287. OTEL_SDK_DISABLED: "false"
  288. OTEL_TRACES_EXPORTER: otlp
  289. OTEL_EXPORTER_OTLP_PROTOCOL: grpc
  290. OTEL_EXPORTER_OTLP_ENDPOINT: http://jaeger:4317
  291. OTEL_SERVICE_NAME: payment-service
  292. OTEL_RESOURCE_ATTRIBUTES: service.instance.id=payment-service,service.namespace=boat-delivery
  293. OTEL_METRICS_EXPORTER: none
  294. OTEL_PROPAGATORS: tracecontext,baggage
  295. OTEL_TRACE_SAMPLER: always_on
  296. OTEL_INSTRUMENTATION_SERVLET_ENABLED: "true"
  297. OTEL_INSTRUMENTATION_HTTP_SERVER_ENABLED: "true"
  298. OTEL_JAVA_LOGGING_AUTO_INSTRUMENTATION_ENABLED: "true"
  299. depends_on:
  300. postgres:
  301. condition: service_healthy
  302. # rabbitmq:
  303. # condition: service_healthy
  304. eureka:
  305. condition: service_healthy
  306. keycloak:
  307. condition: service_started
  308. jaeger:
  309. condition: service_started
  310. stripe-cli:
  311. image: stripe/stripe-cli:latest
  312. container_name: stripe-cli-forwarder
  313. env_file:
  314. - ./payment-service/.env.docker
  315. command: listen --forward-to http://payment-service:8084/api/payments/webhook
  316. depends_on:
  317. - payment-service
  318. restart: unless-stopped
  319. jaeger:
  320. image: jaegertracing/all-in-one:1.60
  321. container_name: jaeger
  322. ports:
  323. - "16686:16686"
  324. - "4317:4317"
  325. - "4318:4318"
  326. - "14250:14250"
  327. volumes:
  328. - ./docker/jaeger/ui-config.json:/etc/jaeger/ui-config.json:ro
  329. environment:
  330. COLLECTOR_OTLP_ENABLED: "true"
  331. QUERY_UI_CONFIG_PATH: /etc/jaeger/ui-config.json
  332. healthcheck:
  333. test: ["CMD", "curl", "-f", "http://localhost:16686/"]
  334. interval: 10s
  335. timeout: 5s
  336. retries: 10
  337. keycloak-init:
  338. image: curlimages/curl:latest
  339. container_name: keycloak-init
  340. entrypoint: /bin/sh
  341. command:
  342. - /init-users.sh
  343. volumes:
  344. - ./docker/keycloak/imports/init-users-verbose.sh:/init-users.sh:ro
  345. depends_on:
  346. keycloak:
  347. condition: service_started
  348. user-service:
  349. condition: service_started
  350. volumes:
  351. postgres_data: