--- ############################################################### # Please see docker/README.md for usage information ############################################################### services: web: image: "${DOCKER_APP_IMAGE}:${DOCKER_APP_TAG}" container_name: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-web" restart: unless-stopped environment: TZ: "${TZ:?error}" # Used by Pixelfed Docker init script DOCKER_SERVICE_NAME: "web" DOCKER_APP_ENTRYPOINT_DEBUG: ${DOCKER_APP_ENTRYPOINT_DEBUG:-0} ENTRYPOINT_SKIP_SCRIPTS: ${ENTRYPOINT_SKIP_SCRIPTS:-} # Used by [proxy] service LETSENCRYPT_HOST: "${DOCKER_PROXY_LETSENCRYPT_HOST:?error}" LETSENCRYPT_EMAIL: "${DOCKER_PROXY_LETSENCRYPT_EMAIL:?error}" LETSENCRYPT_TEST: "${DOCKER_PROXY_LETSENCRYPT_TEST:-}" VIRTUAL_HOST: "${APP_DOMAIN}" VIRTUAL_PORT: "80" volumes: - "./.env:/var/www/.env" - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/conf.d:/shared/proxy/conf.d" - "${DOCKER_APP_HOST_CACHE_PATH}:/var/www/bootstrap/cache" - "${DOCKER_APP_HOST_OVERRIDES_PATH}:/docker/overrides:ro" - "${DOCKER_APP_HOST_STORAGE_PATH}:/var/www/storage" 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}:80" depends_on: - db - redis healthcheck: test: 'curl --header "Host: ${APP_DOMAIN}" --fail http://localhost/api/service/health-check' interval: "${DOCKER_WEB_HEALTHCHECK_INTERVAL}" retries: 2 timeout: 5s worker: image: "${DOCKER_WORKER_IMAGE}:${DOCKER_WORKER_TAG}" container_name: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-worker" command: gosu www-data php artisan horizon restart: unless-stopped stop_signal: SIGTERM environment: TZ: "${TZ:?error}" # Used by Pixelfed Docker init script DOCKER_SERVICE_NAME: "worker" DOCKER_APP_ENTRYPOINT_DEBUG: ${DOCKER_APP_ENTRYPOINT_DEBUG:-0} ENTRYPOINT_SKIP_SCRIPTS: any volumes: - "./.env:/var/www/.env" - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/conf.d:/shared/proxy/conf.d" - "${DOCKER_APP_HOST_CACHE_PATH}:/var/www/bootstrap/cache" - "${DOCKER_APP_HOST_OVERRIDES_PATH}:/docker/overrides:ro" - "${DOCKER_APP_HOST_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:?error}" timeout: 5s retries: 2 cron: image: "${DOCKER_CRON_IMAGE}:${DOCKER_CRON_TAG}" container_name: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-cron" command: gosu www-data php artisan schedule:work -vvv restart: unless-stopped stop_signal: SIGTERM environment: TZ: "${TZ:?error}" # Used by Pixelfed Docker init script DOCKER_SERVICE_NAME: "cron" DOCKER_APP_ENTRYPOINT_DEBUG: ${DOCKER_APP_ENTRYPOINT_DEBUG:-0} ENTRYPOINT_SKIP_SCRIPTS: any volumes: - "./.env:/var/www/.env" - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/conf.d:/shared/proxy/conf.d" - "${DOCKER_APP_HOST_CACHE_PATH}:/var/www/bootstrap/cache" - "${DOCKER_APP_HOST_OVERRIDES_PATH}:/docker/overrides:ro" - "${DOCKER_APP_HOST_STORAGE_PATH}:/var/www/storage" depends_on: - db - redis healthcheck: test: ps aux | egrep 'php artisan [s]chedule:work -vvv' interval: 10s timeout: 5s retries: 2 db: image: ${DOCKER_DB_IMAGE:?error} container_name: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-db" command: ${DOCKER_DB_COMMAND:-} restart: unless-stopped environment: TZ: "${TZ:?error}" # MySQL (Oracle) - "Environment Variables" at https://hub.docker.com/_/mysql MYSQL_ROOT_PASSWORD: "${DOCKER_DB_ROOT_PASSWORD:?error}" MYSQL_USER: "${DB_USERNAME:?error}" MYSQL_PASSWORD: "${DB_PASSWORD:?error}" MYSQL_DATABASE: "${DB_DATABASE:?error}" # MySQL (MariaDB) - "Start a mariadb server instance with user, password and database" at https://hub.docker.com/_/mariadb MARIADB_ROOT_PASSWORD: "${DOCKER_DB_ROOT_PASSWORD:?error}" MARIADB_USER: "${DB_USERNAME:?error}" MARIADB_PASSWORD: "${DB_PASSWORD:?error}" MARIADB_DATABASE: "${DB_DATABASE:?error}" # PostgreSQL - "Environment Variables" at https://hub.docker.com/_/postgres POSTGRES_USER: "${DB_USERNAME:?error}" POSTGRES_PASSWORD: "${DB_PASSWORD:?error}" POSTGRES_DB: "${DB_DATABASE:?error}" volumes: - "${DOCKER_DB_HOST_DATA_PATH:?error}:${DOCKER_DB_CONTAINER_DATA_PATH:?error}" ports: - "${DOCKER_DB_HOST_PORT:?error}:${DOCKER_DB_CONTAINER_PORT:?error}" healthcheck: test: [ "CMD", "healthcheck.sh", "--su-mysql", "--connect", "--innodb_initialized", ] interval: "${DOCKER_DB_HEALTHCHECK_INTERVAL:?error}" retries: 2 timeout: 5s redis: image: redis:${DOCKER_REDIS_VERSION} container_name: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-redis" restart: unless-stopped command: "${DOCKER_REDIS_CONFIG_FILE:-} --requirepass '${REDIS_PASSWORD:-}'" environment: TZ: "${TZ:?error}" REDISCLI_AUTH: ${REDIS_PASSWORD:-} volumes: - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/redis:/etc/redis" - "${DOCKER_REDIS_HOST_DATA_PATH}:/data" ports: - "${DOCKER_REDIS_HOST_PORT}:6379" healthcheck: test: ["CMD", "redis-cli", "-p", "6379", "ping"] interval: "${DOCKER_REDIS_HEALTHCHECK_INTERVAL:?error}" retries: 2 timeout: 5s # HTTP/HTTPS proxy # # Sits in front of the *real* webserver and manages SSL and (optionally) # load-balancing between multiple web servers # # See: https://github.com/nginx-proxy/nginx-proxy/tree/main/docs # proxy: # image: "nginxproxy/nginx-proxy:${DOCKER_PROXY_VERSION}" # container_name: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-proxy" # restart: unless-stopped # environment: # DOCKER_SERVICE_NAME: "proxy" # volumes: # - "${DOCKER_PROXY_HOST_DOCKER_SOCKET_PATH}:/tmp/docker.sock:ro" # - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/conf.d:/etc/nginx/conf.d" # - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/vhost.d:/etc/nginx/vhost.d" # - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/certs:/etc/nginx/certs" # - "${DOCKER_ALL_HOST_DATA_ROOT_PATH}/proxy/html:/usr/share/nginx/html" # ports: # - "${DOCKER_PROXY_HOST_PORT_HTTP}:80" # - "${DOCKER_PROXY_HOST_PORT_HTTPS}:443" # healthcheck: # test: "curl --fail https://${APP_DOMAIN}/api/service/health-check" # interval: "${DOCKER_PROXY_HEALTHCHECK_INTERVAL}" # retries: 2 # timeout: 5s # Proxy companion for managing letsencrypt SSL certificates # # See: https://github.com/nginx-proxy/acme-companion/tree/main/docs # proxy-acme: # image: nginxproxy/acme-companion:2.5 # container_name: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-proxy-acme" # restart: unless-stopped # environment: # DEBUG: 0 # DEFAULT_EMAIL: "${DOCKER_PROXY_LETSENCRYPT_EMAIL:?error}" # NGINX_PROXY_CONTAINER: "${DOCKER_ALL_CONTAINER_NAME_PREFIX}-proxy" # depends_on: # - proxy # volumes: # - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy-acme:/etc/acme.sh" # - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/certs:/etc/nginx/certs" # - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/conf.d:/etc/nginx/conf.d" # - "${DOCKER_ALL_HOST_CONFIG_ROOT_PATH}/proxy/vhost.d:/etc/nginx/vhost.d" # - "${DOCKER_ALL_HOST_DATA_ROOT_PATH}/proxy/html:/usr/share/nginx/html" # - "${DOCKER_PROXY_HOST_DOCKER_SOCKET_PATH}:/var/run/docker.sock:ro"