version: '3.5'

networks:
  frontend:
    driver: ${NETWORKS_DRIVER}
  backend:
    driver: ${NETWORKS_DRIVER}
volumes:
  mysql:
    driver: ${VOLUMES_DRIVER}
  redis:
    driver: ${VOLUMES_DRIVER}
  smtp:
    driver: ${VOLUMES_DRIVER}
  phpmyadmin:
    driver: ${VOLUMES_DRIVER}
  docker-in-docker:
    driver: ${VOLUMES_DRIVER}

services:
  ### Workspace Utilities ##################################
  workspace:
    restart: always
    build:
      context: ./workspace
      args:
        - LARADOCK_PHP_VERSION=${PHP_VERSION}
        - PUID=${PUID}
        - PGID=${PGID}
        - CHROME_DRIVER_VERSION=${WORKSPACE_CHROME_DRIVER_VERSION}
        - TZ=${TIMEZONE}
        - INSTALL_DOCKER_CLIENT=${WORKSPACE_INSTALL_DOCKER_CLIENT}
        - http_proxy
        - https_proxy
        - no_proxy
    volumes:
      - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
      - ./php-worker/supervisord.d:/etc/supervisord.d
    extra_hosts:
      - "dockerhost:${DOCKER_HOST_IP}"
    ports:
      - "${WORKSPACE_SSH_PORT}:22"
    tty: true
    environment:
      - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
      - DOCKER_HOST=tcp://docker-in-docker:2376
      - DOCKER_TLS_VERIFY=1
      - DOCKER_TLS_CERTDIR=/certs
      - DOCKER_CERT_PATH=/certs/client
    networks:
      - frontend
      - backend
    links:
      - docker-in-docker

  ### PHP-FPM ##############################################
  php-fpm:
    restart: always
    build:
      context: ./php-fpm
      args:
        - CHANGE_SOURCE=${CHANGE_SOURCE}
        - BASE_IMAGE_TAG_PREFIX=${PHP_FPM_BASE_IMAGE_TAG_PREFIX}
        - LARADOCK_PHP_VERSION=${PHP_VERSION}
        - INSTALL_BZ2=${PHP_FPM_INSTALL_BZ2}
        - INSTALL_ENCHANT=${PHP_FPM_INSTALL_ENCHANT}
        - INSTALL_GMP=${PHP_FPM_INSTALL_GMP}
        - INSTALL_SSH2=${PHP_FPM_INSTALL_SSH2}
        - INSTALL_XSL=${PHP_FPM_INSTALL_XSL}
        - INSTALL_IMAP=${PHP_FPM_INSTALL_IMAP}
        - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH}
        - INSTALL_PHPREDIS=${PHP_FPM_INSTALL_PHPREDIS}
        - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED}
        - INSTALL_OPCACHE=${PHP_FPM_INSTALL_OPCACHE}
        - INSTALL_EXIF=${PHP_FPM_INSTALL_EXIF}
        - INSTALL_MYSQLI=${PHP_FPM_INSTALL_MYSQLI}
        - INSTALL_INTL=${PHP_FPM_INSTALL_INTL}
        - INSTALL_GHOSTSCRIPT=${PHP_FPM_INSTALL_GHOSTSCRIPT}
        - INSTALL_IMAGE_OPTIMIZERS=${PHP_FPM_INSTALL_IMAGE_OPTIMIZERS}
        - INSTALL_IMAGEMAGICK=${PHP_FPM_INSTALL_IMAGEMAGICK}
        - INSTALL_CALENDAR=${PHP_FPM_INSTALL_CALENDAR}
        - INSTALL_FAKETIME=${PHP_FPM_INSTALL_FAKETIME}
        - INSTALL_APCU=${PHP_FPM_INSTALL_APCU}
        - INSTALL_CACHETOOL=${PHP_FPM_INSTALL_CACHETOOL}
        - INSTALL_YAML=${PHP_FPM_INSTALL_YAML}
        - INSTALL_GETTEXT=${PHP_FPM_INSTALL_GETTEXT}
        - INSTALL_ADDITIONAL_LOCALES=${PHP_FPM_INSTALL_ADDITIONAL_LOCALES}
        - INSTALL_MYSQL_CLIENT=${PHP_FPM_INSTALL_MYSQL_CLIENT}
        - INSTALL_PING=${PHP_FPM_INSTALL_PING}
        - INSTALL_SSHPASS=${PHP_FPM_INSTALL_SSHPASS}
        - INSTALL_MAILPARSE=${PHP_FPM_INSTALL_MAILPARSE}
        - INSTALL_PCNTL=${PHP_FPM_INSTALL_PCNTL}
        - ADDITIONAL_LOCALES=${PHP_FPM_ADDITIONAL_LOCALES}
        - INSTALL_WKHTMLTOPDF=${PHP_FPM_INSTALL_WKHTMLTOPDF}
        - DOWNGRADE_OPENSSL_TLS_AND_SECLEVEL=${PHP_DOWNGRADE_OPENSSL_TLS_AND_SECLEVEL}
        - PUID=${PUID}
        - PGID=${PGID}
        - TZ=${TIMEZONE}
        - IMAGEMAGICK_VERSION=${PHP_FPM_IMAGEMAGICK_VERSION}
        - LOCALE=${PHP_FPM_DEFAULT_LOCALE}
        - INSTALL_DOCKER_CLIENT=${PHP_FPM_INSTALL_DOCKER_CLIENT}
        - http_proxy
        - https_proxy
        - no_proxy
    volumes:
      - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini
      - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
    ports:
      - "${PHP_FPM_XDEBUG_PORT:-9003}:9003"
    expose:
      - "9000"
    extra_hosts:
      - "dockerhost:${DOCKER_HOST_IP}"
    environment:
      - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
      - DOCKER_HOST=tcp://docker-in-docker:2376
      - DOCKER_TLS_VERIFY=1
      - DOCKER_TLS_CERTDIR=/certs
      - DOCKER_CERT_PATH=/certs/client
      - FAKETIME=${PHP_FPM_FAKETIME}
    depends_on:
      - workspace
    networks:
      - backend
    links:
      - docker-in-docker

  ### PHP Worker ############################################
  php-worker:
    restart: always
    build:
      context: ./php-worker
      args:
        - CHANGE_SOURCE=${CHANGE_SOURCE}
        - LARADOCK_PHP_VERSION=${PHP_VERSION}
        - INSTALL_BZ2=${PHP_WORKER_INSTALL_BZ2}
        - INSTALL_GD=${PHP_WORKER_INSTALL_GD}
        - INSTALL_IMAGEMAGICK=${PHP_WORKER_INSTALL_IMAGEMAGICK}
        - INSTALL_GMP=${PHP_WORKER_INSTALL_GMP}
        - INSTALL_BCMATH=${PHP_WORKER_INSTALL_BCMATH}
        - INSTALL_MEMCACHED=${PHP_WORKER_INSTALL_MEMCACHED}
        - INSTALL_ZIP_ARCHIVE=${PHP_WORKER_INSTALL_ZIP_ARCHIVE}
        - INSTALL_MYSQL_CLIENT=${PHP_WORKER_INSTALL_MYSQL_CLIENT}
        - INSTALL_AMQP=${PHP_WORKER_INSTALL_AMQP}
        - INSTALL_GHOSTSCRIPT=${PHP_WORKER_INSTALL_GHOSTSCRIPT}
        - INSTALL_REDIS=${PHP_WORKER_INSTALL_REDIS}
        - PUID=${PUID}
        - PGID=${PGID}
        - TZ=${TIMEZONE}
        - IMAGEMAGICK_VERSION=${PHP_WORKER_IMAGEMAGICK_VERSION}
    volumes:
      - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
      - ./php-worker/supervisord.d:/etc/supervisord.d
    depends_on:
      - workspace
    extra_hosts:
      - "dockerhost:${DOCKER_HOST_IP}"
    networks:
      - backend

  ### NGINX Server #########################################
  nginx:
    restart: always
    build:
      context: ./nginx
      args:
        - CHANGE_SOURCE=${CHANGE_SOURCE}
        - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
        - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT}
        - PUID=${PUID}
        - PGID=${PGID}
        - TZ=${TIMEZONE}
        - http_proxy
        - https_proxy
        - no_proxy
    volumes:
      - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
      - ${DATA_PATH_HOST}/logs/nginx:/var/log/nginx
      - ${NGINX_SITES_PATH}:/etc/nginx/sites-available
      - ${NGINX_SSL_PATH}:/etc/nginx/ssl
    ports:
      - "127.0.0.1:${NGINX_HOST_HTTP_PORT:-1080}:80"
    depends_on:
      - php-fpm
    networks:
      - frontend
      - backend
    labels:
      - traefik.port=80
      - traefik.backend=nginx
      - traefik.frontend.rule=Host:opensem.docker.localhost
      - traefik.http.routers.nginx.rule=Host(`opensem.docker.localhost`)

  ### MySQL ################################################
  mysql:
    restart: always
    build:
      context: ./mysql
      args:
        - MYSQL_VERSION=${MYSQL_VERSION}
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - TZ=${TIMEZONE}
    volumes:
      - ${DATA_PATH_HOST}/mysql:/var/lib/mysql
      - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
    ports:
      - "${MYSQL_PORT:-3306}:3306"
    networks:
      - backend

  ### MySQL ################################################
  mysql-slave1:
    build:
      context: ./mysql-slave1
      args:
        - MYSQL_VERSION=${MYSQL_VERSION}
    environment:
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - TZ=${TIMEZONE}
    volumes:
      - ${DATA_PATH_HOST}/mysql-slave1:/var/lib/mysql
      - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
    ports:
      - "${MYSQL_SLAVE_PORT:-3306}:3306"
    networks:
      - backend

  ### Redis ################################################
  redis:
    restart: always
    build: ./redis
    volumes:
      - ${DATA_PATH_HOST}/redis:/data
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports:
      - "${REDIS_PORT:-6379}:6379"
    networks:
      - backend

  ### SMTP ################################################
  smtp:
    restart: always
    build: ./smtp
    ports:
      - "${SMTP_PORT:-25}:25"
    networks:
      - frontend
      - backend
    tty: true

  ### phpMyAdmin ###########################################
  phpmyadmin:
    build: ./phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - MYSQL_USER=${PMA_USER}
      - MYSQL_PASSWORD=${PMA_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${PMA_ROOT_PASSWORD}
      - MAX_EXECUTION_TIME=${PMA_MAX_EXECUTION_TIME}
      - MEMORY_LIMIT=${PMA_MEMORY_LIMIT}
      - UPLOAD_LIMIT=${PMA_UPLOAD_LIMIT}
    ports:
      - "${PMA_PORT:-1081}:80"
    depends_on:
      - "${PMA_DB_ENGINE}"
    networks:
      - frontend
      - backend

  ### Certbot #########################################
  certbot:
    build:
      context: ./certbot
    volumes:
      - ./data/certbot/certs/:/var/certs
      - ./certbot/letsencrypt/:/var/www/letsencrypt
    environment:
      - CN="jardinenvie.com"
      - EMAIL="ludo@huma.net"
    networks:
      - frontend

  ### Docker-in-Docker ################################################
  docker-in-docker:
    image: docker:19.03-dind
    environment:
      DOCKER_TLS_SAN: DNS:docker-in-docker
    privileged: true
    volumes:
      - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}
      - docker-in-docker:/certs/client
    expose:
      - 2375
    networks:
      - backend

  ### Soketi ###########################################
  soketi:
    restart: unless-stopped
    image: 'quay.io/soketi/soketi:1.0-16-debian'
    ports:
      - '${SOKETI_PORT:-6001}:6001'
      - '${SOKETI_METRICS_SERVER_PORT:-9601}:9601'
    environment:
      - SOKETI_DEBUG=1
      - SOKETI_DEFAULT_APP_ID=${PUSHER_APP_ID}
      - SOKETI_DEFAULT_APP_KEY=${PUSHER_APP_KEY}
      - SOKETI_DEFAULT_APP_SECRET=${PUSHER_APP_SECRET}
      - SOKETI_DEFAULT_APP_ENABLE_CLIENT_MESSAGES=true
      - DEFAULT_APP_USER_AUTHENTICATION=true
    extra_hosts:
      - "dockerhost:${DOCKER_HOST_IP}"
    networks:
      - backend
      - frontend
    links:
      - docker-in-docker

  ### Laravel Horizon ############################################
  laravel-horizon:
    build:
      context: ./laravel-horizon
      args:
        - CHANGE_SOURCE=${CHANGE_SOURCE}
        - LARADOCK_PHP_VERSION=${PHP_VERSION}
        - INSTALL_BZ2=${LARAVEL_HORIZON_INSTALL_BZ2}
        - INSTALL_GD=${LARAVEL_HORIZON_INSTALL_GD}
        - INSTALL_GMP=${LARAVEL_HORIZON_INSTALL_GMP}
        - INSTALL_GNUPG=${LARAVEL_HORIZON_INSTALL_GNUPG}
        - INSTALL_LDAP=${LARAVEL_HORIZON_INSTALL_LDAP}
        - INSTALL_IMAGEMAGICK=${LARAVEL_HORIZON_INSTALL_IMAGEMAGICK}
        - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL}
        - INSTALL_ZIP_ARCHIVE=${LARAVEL_HORIZON_INSTALL_ZIP_ARCHIVE}
        - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH}
        - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED}
        - INSTALL_SOCKETS=${LARAVEL_HORIZON_INSTALL_SOCKETS}
        - INSTALL_YAML=${LARAVEL_HORIZON_INSTALL_YAML}
        - INSTALL_CASSANDRA=${LARAVEL_HORIZON_INSTALL_CASSANDRA}
        - INSTALL_PHPREDIS=${LARAVEL_HORIZON_INSTALL_PHPREDIS}
        - INSTALL_MONGO=${LARAVEL_HORIZON_INSTALL_MONGO}
        - INSTALL_FFMPEG=${LARAVEL_HORIZON_INSTALL_FFMPEG}
        - INSTALL_AUDIOWAVEFORM=${LARAVEL_HORIZON_INSTALL_AUDIOWAVEFORM}
        - PUID=${PUID}
        - PGID=${PGID}
        - IMAGEMAGICK_VERSION=${LARAVEL_HORIZON_IMAGEMAGICK_VERSION}
    volumes:
      - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}
      - ./laravel-horizon/supervisord.d:/etc/supervisord.d
    depends_on:
      - workspace
    extra_hosts:
      - "dockerhost:${DOCKER_HOST_IP}"
    networks:
      - backend

  ### Meilisearch
  meilisearch:
    image: getmeili/meilisearch:latest
    environment:
      - http_proxy
      - https_proxy
      - MEILI_MASTER_KEY=${MEILI_MASTER_KEY:-masterKey}
      # - MEILI_NO_ANALYTICS=${MEILI_NO_ANALYTICS:-true}
      # - MEILI_ENV=${MEILI_ENV:-development}
      # - MEILI_LOG_LEVEL
      # - MEILI_DB_PATH=${MEILI_DB_PATH:-/data.ms}
    ports:
      - ${MEILI_PORT:-7700}:7700
    networks:
      - backend
    volumes:
      - ${DATA_PATH_HOST}/meili_data:/meili_data
    restart: unless-stopped
