--- version: "3" ############################################################### # Please see docker/README.md for usage information ############################################################### services: # HTTP/HTTPS proxy # # Sits in front of the *real* webserver and manages SSL and (optionally) # load-balancing between multiple web servers # # You can disable this service by setting [DOCKER_PROXY_PROFILE="disabled"] # in your [.env] file - the setting is near the bottom of the file. # # This also disables the [proxy-acme] service, if this is not desired, change the # [DOCKER_PROXY_ACME_PROFILE] setting to an empty string [""] # # See: https://github.com/nginx-proxy/nginx-proxy/tree/main/docs proxy: image: nginxproxy/nginx-proxy:1.4 container_name: "${DOCKER_CONTAINER_NAME_PREFIX}-proxy" restart: unless-stopped profiles: - ${DOCKER_PROXY_PROFILE:-} volumes: - "${DOCKER_HOST_SOCKET_PATH}:/tmp/docker.sock:ro" - "${DOCKER_CONFIG_ROOT}/proxy/conf.d:/etc/nginx/conf.d" - "${DOCKER_CONFIG_ROOT}/proxy/vhost.d:/etc/nginx/vhost.d" - "${DOCKER_CONFIG_ROOT}/proxy/certs:/etc/nginx/certs" - "${DOCKER_DATA_ROOT}/proxy/html:/usr/share/nginx/html" ports: - "${DOCKER_PROXY_PORT_EXTERNAL_HTTP}:80" - "${DOCKER_PROXY_PORT_EXTERNAL_HTTPS}:443" healthcheck: test: "curl --fail https://${APP_DOMAIN}/api/service/health-check" interval: "${DOCKER_PROXY_HEALTHCHECK_INTERVAL:-10s}" retries: 2 timeout: 5s # Proxy companion for managing letsencrypt SSL certificates # # You can disable this service by setting [DOCKER_PROXY_ACME_PROFILE="disabled"] # in your [.env] file - the setting is near the bottom of the file. # # See: https://github.com/nginx-proxy/acme-companion/tree/main/docs proxy-acme: image: nginxproxy/acme-companion container_name: "${DOCKER_CONTAINER_NAME_PREFIX}-proxy-acme" restart: unless-stopped profiles: - ${DOCKER_PROXY_ACME_PROFILE:-} environment: DEBUG: 0 DEFAULT_EMAIL: "${LETSENCRYPT_EMAIL}" NGINX_PROXY_CONTAINER: "${DOCKER_CONTAINER_NAME_PREFIX}-proxy" depends_on: - proxy volumes: - "${DOCKER_CONFIG_ROOT}/proxy-acme:/etc/acme.sh" - "${DOCKER_CONFIG_ROOT}/proxy/certs:/etc/nginx/certs" - "${DOCKER_CONFIG_ROOT}/proxy/conf.d:/etc/nginx/conf.d" - "${DOCKER_CONFIG_ROOT}/proxy/vhost.d:/etc/nginx/vhost.d" - "${DOCKER_DATA_ROOT}/proxy/html:/usr/share/nginx/html" - "${DOCKER_HOST_SOCKET_PATH}:/var/run/docker.sock:ro" web: image: "${DOCKER_IMAGE}:${DOCKER_TAG}" container_name: "${DOCKER_CONTAINER_NAME_PREFIX}-web" restart: unless-stopped build: target: ${DOCKER_RUNTIME}-runtime args: PHP_VERSION: "${PHP_VERSION:-8.1}" PHP_BASE_TYPE: "${PHP_BASE_TYPE:-apache}" PHP_DEBIAN_RELEASE: "${PHP_DEBIAN_RELEASE:-bullseye}" APT_PACKAGES_EXTRA: "${APT_PACKAGES_EXTRA:-}" PHP_PECL_EXTENSIONS_EXTRA: "${PHP_PECL_EXTENSIONS_EXTRA:-}" PHP_EXTENSIONS_EXTRA: "${PHP_EXTENSIONS_EXTRA:-}" volumes: - "./.env:/var/www/.env" - "${DOCKER_APP_CACHE_PATH}:/var/www/bootstrap/cache" - "${DOCKER_APP_STORAGE_PATH}:/var/www/storage" environment: LETSENCRYPT_HOST: "${LETSENCRYPT_HOST}" LETSENCRYPT_EMAIL: "${LETSENCRYPT_EMAIL}" LETSENCRYPT_TEST: "${LETSENCRYPT_TEST:-}" VIRTUAL_HOST: "${APP_DOMAIN}" VIRTUAL_PORT: "80" labels: com.github.nginx-proxy.nginx-proxy.keepalive: 30 com.github.nginx-proxy.nginx-proxy.http2.enable: true com.github.nginx-proxy.nginx-proxy.http3.enable: true ports: - "${DOCKER_WEB_PORT_EXTERNAL_HTTP:-8080}:80" depends_on: - db - redis healthcheck: test: 'curl --header "Host: ${APP_DOMAIN}" --fail http://localhost/api/service/health-check' interval: "${DOCKER_WEB_HEALTHCHECK_INTERVAL:-10s}" retries: 2 timeout: 5s worker: image: "${DOCKER_IMAGE}:${DOCKER_TAG}" container_name: "${DOCKER_CONTAINER_NAME_PREFIX}-worker" command: gosu www-data php artisan horizon restart: unless-stopped build: target: ${DOCKER_RUNTIME}-runtime args: PHP_VERSION: "${PHP_VERSION:-8.1}" PHP_BASE_TYPE: "${PHP_BASE_TYPE:-apache}" PHP_DEBIAN_RELEASE: "${PHP_DEBIAN_RELEASE:-bullseye}" APT_PACKAGES_EXTRA: "${APT_PACKAGES_EXTRA:-}" PHP_PECL_EXTENSIONS_EXTRA: "${PHP_PECL_EXTENSIONS_EXTRA:-}" PHP_EXTENSIONS_EXTRA: "${PHP_EXTENSIONS_EXTRA:-}" volumes: - "./.env:/var/www/.env" - "${DOCKER_APP_CACHE_PATH}:/var/www/bootstrap/cache" - "${DOCKER_APP_STORAGE_PATH}:/var/www/storage" depends_on: - db - redis healthcheck: test: gosu www-data php artisan horizon:status | grep running interval: "${DOCKER_WORKER_HEALTHCHECK_INTERVAL:-10s}" timeout: 5s retries: 2 db: image: mariadb:${DB_VERSION:-11.2} container_name: "${DOCKER_CONTAINER_NAME_PREFIX}-db" command: --default-authentication-plugin=mysql_native_password restart: unless-stopped env_file: - ".env" volumes: - "${DOCKER_DB_DATA_PATH}:/var/lib/mysql" ports: - "${DOCKER_DB_PORT_EXTERNAL}:3306" healthcheck: test: [ "CMD", "healthcheck.sh", "--su-mysql", "--connect", "--innodb_initialized", ] interval: "${DOCKER_DB_HEALTHCHECK_INTERVAL:-10s}" retries: 2 timeout: 5s redis: image: redis:${REDIS_VERSION:-7.2} container_name: "${DOCKER_CONTAINER_NAME_PREFIX}-redis" restart: unless-stopped command: "${DOCKER_REDIS_CONFIG_FILE:-} --requirepass '${REDIS_PASSWORD:-}'" environment: - REDISCLI_AUTH=${REDIS_PASSWORD:-} env_file: - ".env" volumes: - "${DOCKER_CONFIG_ROOT}/redis:/etc/redis" - "${DOCKER_REDIS_DATA_PATH}:/data" ports: - "${DOCKER_REDIS_PORT_EXTERNAL}:6379" healthcheck: test: ["CMD", "redis-cli", "-p", "6379", "ping"] interval: "${DOCKER_REDIS_HEALTHCHECK_INTERVAL:-10s}" retries: 2 timeout: 5s