---
###############################################################
# 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"