name: letsbbs services: nginx: image: nginx:1.30.4-alpine depends_on: php: condition: service_healthy ports: - "8080:80" volumes: - ./public:/var/www/html/public:ro - uploads:/var/www/html/public/uploads:ro - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro healthcheck: test: ["CMD", "wget", "--header=X-Forwarded-Proto: https", "-qO-", "http://127.0.0.1/health/live"] interval: 10s timeout: 3s retries: 5 restart: unless-stopped php: build: context: . dockerfile: docker/php/Dockerfile target: production env_file: .env environment: CI_ENVIRONMENT: production database.default.hostname: mysql MYSQL_ROOT_PASSWORD: "" depends_on: mysql: condition: service_healthy volumes: - uploads:/var/www/html/public/uploads - writable:/var/www/html/writable healthcheck: test: ["CMD-SHELL", "HTTPS=on REQUEST_URI=/health/live SCRIPT_NAME=/index.php SCRIPT_FILENAME=/var/www/html/public/index.php REQUEST_METHOD=GET cgi-fcgi -bind -connect 127.0.0.1:9000 | grep -Fq '{\"status\":\"ok\"}'"] interval: 10s timeout: 5s retries: 10 restart: unless-stopped mysql: image: mysql:8.4.11 environment: MYSQL_DATABASE: ${MYSQL_DATABASE:?Set MYSQL_DATABASE in .env} MYSQL_USER: ${MYSQL_USER:?Set MYSQL_USER in .env} MYSQL_PASSWORD: ${MYSQL_PASSWORD:?Set MYSQL_PASSWORD in .env} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?Set MYSQL_ROOT_PASSWORD in .env} command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_0900_ai_ci - --default-time-zone=+00:00 - --sql-mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION volumes: - mysql-data:/var/lib/mysql healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD --silent"] interval: 10s timeout: 5s retries: 20 restart: unless-stopped volumes: mysql-data: uploads: writable: