docker-compose.prod.yml 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. x-common: &common
  2. restart: unless-stopped
  3. networks:
  4. - photoplaces
  5. # Secrets for Docker Swarm mode (optional, ignored in compose)
  6. x-secrets: &secrets
  7. db_password:
  8. external: true
  9. redis_password:
  10. external: true
  11. jwt_secret:
  12. external: true
  13. jwt_refresh_secret:
  14. external: true
  15. s3_secret_key:
  16. external: true
  17. services:
  18. caddy:
  19. <<: *common
  20. image: caddy:2.8-alpine
  21. ports:
  22. - "80:80"
  23. volumes:
  24. - ./Caddyfile:/etc/caddy/Caddyfile
  25. - caddy_data:/data
  26. - caddy_config:/config
  27. environment:
  28. DOMAIN: ${DOMAIN}
  29. depends_on:
  30. backend:
  31. condition: service_healthy
  32. frontend:
  33. condition: service_healthy
  34. healthcheck:
  35. test: ["CMD", "wget", "-qO-", "http://127.0.0.1:2019/metrics"]
  36. interval: 30s
  37. timeout: 10s
  38. retries: 3
  39. start_period: 10s
  40. postgres:
  41. <<: *common
  42. image: postgis/postgis:16-3.4-alpine
  43. environment:
  44. POSTGRES_DB: photoplaces
  45. POSTGRES_USER: photoplaces
  46. POSTGRES_PASSWORD: ${DB_PASSWORD}
  47. volumes:
  48. - pgdata:/var/lib/postgresql/data
  49. healthcheck:
  50. test: ["CMD-SHELL", "pg_isready -U photoplaces"]
  51. interval: 10s
  52. retries: 5
  53. redis:
  54. <<: *common
  55. image: redis:7-alpine
  56. command: redis-server --requirepass ${REDIS_PASSWORD}
  57. volumes:
  58. - redisdata:/data
  59. healthcheck:
  60. test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
  61. interval: 10s
  62. retries: 5
  63. minio:
  64. <<: *common
  65. image: minio/minio:latest
  66. command: server /data --console-address ":9001"
  67. volumes:
  68. - miniodata:/data
  69. environment:
  70. MINIO_ROOT_USER: ${S3_ACCESS_KEY}
  71. MINIO_ROOT_PASSWORD: ${S3_SECRET_KEY}
  72. healthcheck:
  73. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  74. interval: 10s
  75. retries: 5
  76. backend:
  77. <<: *common
  78. build:
  79. context: ../backend
  80. dockerfile: Dockerfile
  81. env_file:
  82. - ./env.prod
  83. environment:
  84. APP_ENV: production
  85. SERVER_PORT: "8080"
  86. DATABASE_URL: postgres://photoplaces:${DB_PASSWORD}@postgres:5432/photoplaces?sslmode=disable
  87. REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379/0
  88. S3_ENDPOINT: minio:9000
  89. S3_PUBLIC_ENDPOINT: ${S3_PUBLIC_ENDPOINT}
  90. S3_ACCESS_KEY: ${S3_ACCESS_KEY}
  91. S3_SECRET_KEY: ${S3_SECRET_KEY}
  92. S3_BUCKET: photoplaces
  93. JWT_SECRET: ${JWT_SECRET}
  94. JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET}
  95. CLOUDPAYMENTS_PUBLIC_ID: ${CLOUDPAYMENTS_PUBLIC_ID}
  96. CLOUDPAYMENTS_API_SECRET: ${CLOUDPAYMENTS_API_SECRET}
  97. ALLOWED_ORIGINS: ${ALLOWED_ORIGINS}
  98. depends_on:
  99. postgres:
  100. condition: service_healthy
  101. redis:
  102. condition: service_healthy
  103. minio:
  104. condition: service_healthy
  105. healthcheck:
  106. test: ["CMD", "curl", "-sf", "http://localhost:8080/api/v1/health"]
  107. interval: 30s
  108. timeout: 10s
  109. retries: 3
  110. start_period: 10s
  111. frontend:
  112. <<: *common
  113. build:
  114. context: ../frontend
  115. dockerfile: Dockerfile
  116. args:
  117. NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL}
  118. NEXT_PUBLIC_MAP_PROVIDER: leaflet
  119. NEXT_PUBLIC_YANDEX_MAPS_API_KEY: ${YANDEX_MAPS_API_KEY}
  120. NEXT_PUBLIC_YANDEX_GEOCODER_API_KEY: ${YANDEX_GEOCODER_API_KEY}
  121. NEXT_PUBLIC_GIT_HASH: ${NEXT_PUBLIC_GIT_HASH}
  122. depends_on:
  123. backend:
  124. condition: service_healthy
  125. healthcheck:
  126. test: ["CMD", "curl", "-sf", "http://localhost:3000"]
  127. interval: 30s
  128. timeout: 10s
  129. retries: 3
  130. start_period: 15s
  131. volumes:
  132. pgdata:
  133. redisdata:
  134. miniodata:
  135. caddy_data:
  136. caddy_config:
  137. networks:
  138. photoplaces: