docker-compose.prod.yml 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. name: flowsint-prod
  2. services:
  3. postgres:
  4. image: postgres:15-alpine
  5. container_name: flowsint-postgres-prod
  6. restart: always
  7. environment:
  8. POSTGRES_USER: ${POSTGRES_USER:-flowsint}
  9. POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-flowsint}
  10. POSTGRES_DB: ${POSTGRES_DB:-flowsint}
  11. ports:
  12. - "5433:5432"
  13. volumes:
  14. - pg_data_prod:/var/lib/postgresql/data
  15. networks:
  16. - flowsint_network
  17. healthcheck:
  18. test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-flowsint}"]
  19. interval: 10s
  20. timeout: 5s
  21. retries: 5
  22. redis:
  23. image: redis:7-alpine
  24. container_name: flowsint-redis-prod
  25. restart: always
  26. ports:
  27. - "6379:6379"
  28. networks:
  29. - flowsint_network
  30. healthcheck:
  31. test: ["CMD", "redis-cli", "ping"]
  32. interval: 10s
  33. timeout: 5s
  34. retries: 5
  35. neo4j:
  36. image: neo4j:5
  37. container_name: flowsint-neo4j-prod
  38. restart: always
  39. ports:
  40. - "7474:7474"
  41. - "7687:7687"
  42. environment:
  43. - NEO4J_AUTH=${NEO4J_USERNAME}/${NEO4J_PASSWORD}
  44. - NEO4J_PLUGINS=["apoc"]
  45. - NEO4J_apoc_export_file_enabled=true
  46. - NEO4J_apoc_import_file_enabled=true
  47. - NEO4J_apoc_import_file_use__neo4j__config=true
  48. volumes:
  49. - neo4j_data_prod:/data
  50. - neo4j_logs_prod:/logs
  51. - neo4j_import_prod:/var/lib/neo4j/import
  52. - neo4j_plugins_prod:/plugins
  53. networks:
  54. - flowsint_network
  55. healthcheck:
  56. test: cypher-shell -u ${NEO4J_USERNAME} -p ${NEO4J_PASSWORD} "RETURN 1"
  57. interval: 5s
  58. timeout: 5s
  59. retries: 10
  60. api:
  61. build:
  62. context: .
  63. dockerfile: flowsint-api/Dockerfile
  64. target: production
  65. container_name: flowsint-api-prod
  66. restart: always
  67. ports:
  68. - "5001:5001"
  69. volumes:
  70. - /var/run/docker.sock:/var/run/docker.sock:ro
  71. environment:
  72. - DATABASE_URL=postgresql://${POSTGRES_USER:-flowsint}:${POSTGRES_PASSWORD:-flowsint}@postgres:5432/${POSTGRES_DB:-flowsint}
  73. - NEO4J_URI_BOLT=bolt://neo4j:7687
  74. - NEO4J_USERNAME=${NEO4J_USERNAME}
  75. - NEO4J_PASSWORD=${NEO4J_PASSWORD}
  76. - AUTH_SECRET=${AUTH_SECRET}
  77. - MASTER_VAULT_KEY_V1=${MASTER_VAULT_KEY_V1}
  78. - REDIS_URL=redis://redis:6379/0
  79. depends_on:
  80. postgres:
  81. condition: service_healthy
  82. redis:
  83. condition: service_healthy
  84. neo4j:
  85. condition: service_healthy
  86. healthcheck:
  87. test: ["CMD-SHELL", "curl -f http://localhost:5001/health || exit 1"]
  88. interval: 10s
  89. timeout: 5s
  90. retries: 5
  91. networks:
  92. - flowsint_network
  93. celery:
  94. build:
  95. context: .
  96. dockerfile: flowsint-api/Dockerfile
  97. target: production
  98. container_name: flowsint-celery-prod
  99. restart: always
  100. command:
  101. [
  102. "celery",
  103. "-A",
  104. "flowsint_core.core.celery",
  105. "worker",
  106. "--loglevel=info",
  107. "--pool=threads",
  108. "--concurrency=10",
  109. ]
  110. volumes:
  111. - /var/run/docker.sock:/var/run/docker.sock:ro
  112. environment:
  113. - DATABASE_URL=postgresql://${POSTGRES_USER:-flowsint}:${POSTGRES_PASSWORD:-flowsint}@postgres:5432/${POSTGRES_DB:-flowsint}
  114. - NEO4J_URI_BOLT=bolt://neo4j:7687
  115. - NEO4J_USERNAME=${NEO4J_USERNAME}
  116. - NEO4J_PASSWORD=${NEO4J_PASSWORD}
  117. - MASTER_VAULT_KEY_V1=${MASTER_VAULT_KEY_V1}
  118. - REDIS_URL=redis://redis:6379/0
  119. - SKIP_MIGRATIONS=true
  120. - AUTH_SECRET=${AUTH_SECRET}
  121. healthcheck:
  122. # Celery has no HTTP server — Dockerfile's curl-based healthcheck always fails.
  123. # Use celery's own ping primitive instead.
  124. test: ["CMD-SHELL", "celery -A flowsint_core.core.celery inspect ping -d celery@$$HOSTNAME || exit 1"]
  125. interval: 30s
  126. timeout: 10s
  127. retries: 3
  128. start_period: 30s
  129. depends_on:
  130. postgres:
  131. condition: service_healthy
  132. redis:
  133. condition: service_healthy
  134. neo4j:
  135. condition: service_healthy
  136. api:
  137. condition: service_healthy
  138. networks:
  139. - flowsint_network
  140. app:
  141. build:
  142. context: ./flowsint-app
  143. dockerfile: Dockerfile
  144. args:
  145. - VITE_API_URL=${VITE_API_URL}
  146. container_name: flowsint-app-prod
  147. restart: always
  148. ports:
  149. - "5173:8080"
  150. networks:
  151. - flowsint_network
  152. depends_on:
  153. api:
  154. condition: service_healthy
  155. networks:
  156. flowsint_network:
  157. name: flowsint_network_prod
  158. driver: bridge
  159. volumes:
  160. pg_data_prod:
  161. neo4j_data_prod:
  162. neo4j_logs_prod:
  163. neo4j_import_prod:
  164. neo4j_plugins_prod: