name: bemeal # ========================= # IMAGE # ========================= x-app-image: &app-image gitea.leonmorival.com/daily_meal/bemeal-api:${IMAGE_TAG:-latest} # ========================= # ENV # ========================= x-app-environment: &app-environment APP_LOCALE: "fr" APP_ENV: "production" APP_KEY: "${APP_KEY:?APP_KEY is required}" APP_URL: "${APP_URL:?APP_URL is required}" SERVER_NAME: ":80" APP_RUNTIME: "Laravel\\FrankenPHP\\Runtime" APP_DEBUG: "${APP_DEBUG:-false}" FILESYSTEM_DISK: "public" DB_CONNECTION: "pgsql" DB_HOST: "bemeal-pgsql" DB_PORT: "5432" DB_DATABASE: "${DB_DATABASE:?DB_DATABASE is required}" DB_USERNAME: "${DB_USERNAME:?DB_USERNAME is required}" DB_PASSWORD: "${DB_PASSWORD:?DB_PASSWORD is required}" REDIS_HOST: "bemeal-redis" REDIS_CLIENT: "predis" QUEUE_CONNECTION: "redis" SCOUT_DRIVER: "meilisearch" MEILISEARCH_HOST: "http://bemeal-meilisearch:7700" MEILISEARCH_KEY: "${MEILISEARCH_KEY:?MEILISEARCH_KEY is required}" # ========================= # VOLUMES # ========================= x-app-volumes: &app-volumes - storage-data:/var/www/html/storage/app - storage-public-data:/var/www/html/storage/app/public # ========================= # DEPENDS # ========================= x-app-depends-on: &app-depends-on pgsql: condition: service_healthy redis: condition: service_started meilisearch: condition: service_started # ========================= # HEALTHCHECK # ========================= x-app-healthcheck: &app-healthcheck test: ["CMD-SHELL", "wget -qO- http://127.0.0.1/api/health >/dev/null 2>&1"] start_period: 30s interval: 5s timeout: 5s retries: 12 # ========================= # APP BASE # ========================= x-app-service: &app-service image: *app-image restart: unless-stopped depends_on: *app-depends-on environment: *app-environment volumes: *app-volumes networks: - internal - public stop_grace_period: 30s # ========================= # SERVICES # ========================= services: # ========================= # BLUE # ========================= bemeal-api-blue: <<: *app-service container_name: bemeal-api-blue healthcheck: *app-healthcheck # ========================= # GREEN # ========================= bemeal-api-green: <<: *app-service container_name: bemeal-api-green healthcheck: *app-healthcheck # ========================= # DATABASE # ========================= pgsql: image: postgres:15-alpine container_name: bemeal-pgsql restart: unless-stopped environment: POSTGRES_DB: "${DB_DATABASE:?DB_DATABASE is required}" POSTGRES_USER: "${DB_USERNAME:?DB_USERNAME is required}" POSTGRES_PASSWORD: "${DB_PASSWORD:?DB_PASSWORD is required}" volumes: - pgsql-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -p 5432"] start_period: 30s interval: 5s timeout: 5s retries: 10 networks: - internal # ========================= # REDIS # ========================= redis: image: redis:alpine container_name: bemeal-redis restart: unless-stopped volumes: - redis-data:/data networks: - internal # ========================= # HORIZON # ========================= horizon: image: *app-image container_name: bemeal-horizon restart: unless-stopped depends_on: pgsql: condition: service_healthy redis: condition: service_started environment: *app-environment volumes: *app-volumes command: php artisan horizon networks: - internal # ========================= # SCHEDULER # ========================= scheduler: image: *app-image container_name: bemeal-scheduler restart: unless-stopped depends_on: pgsql: condition: service_healthy redis: condition: service_started environment: *app-environment volumes: *app-volumes command: php artisan schedule:work networks: - internal # ========================= # ADMINER # ========================= adminer: image: adminer:latest container_name: bemeal-adminer restart: unless-stopped environment: ADMINER_DEFAULT_SERVER: bemeal-pgsql networks: - internal # ========================= # MEILISEARCH # ========================= meilisearch: image: getmeili/meilisearch:latest container_name: bemeal-meilisearch restart: unless-stopped environment: MEILI_NO_ANALYTICS: "true" MEILI_MASTER_KEY: "${MEILISEARCH_KEY:?MEILISEARCH_KEY is required}" volumes: - meilisearch-data:/meili_data networks: - internal # ========================= # VOLUMES # ========================= volumes: pgsql-data: external: true name: bemeal_pgsql_data redis-data: name: bemeal_redis_data storage-data: name: bemeal_storage_data storage-public-data: name: bemeal_storage_public_data meilisearch-data: name: bemeal_meilisearch_data # ========================= # NETWORKS # ========================= networks: internal: name: bemeal_internal driver: bridge public: external: true name: bemeal_public