##
## -------------------------
## |  D E V I L S T A C K  |
## -------------------------
##
## Local LAMP/LEMP stack
##
##
## ${VARIABLE:-default} will evaluate to default if VARIABLE is unset or empty in the environment.
## ${VARIABLE-default}  will evaluate to default only if VARIABLE is unset in the environment.
##
##
## -- DO NOT EDIT THIS FILE --
##
## Copy 'docker-compose.override.yml-example' to 'docker-compose.override.yml'
## and edit this file with your custom changes (override or even new services).
##
## Edit '.env' for configuration.
##
## If '.env' does not exist, copy 'env-example' to '.env'
##   $ cp env-example .env
##


version: '2.1'


################################################################################
# SERVICES
################################################################################
services:

  # ------------------------------------------------------------
  # Bind (DNS Server)
  # ------------------------------------------------------------
  bind:
    image: cytopia/bind:0.15
    hostname: bind
    restart: always
    ports:
      # [local-machine:]local-port:docker-port
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_BIND:-1053}:53/tcp"
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_BIND:-1053}:53/udp"

    environment:
      ##
      ## Debug?
      ##
      - DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}

      ##
      ## Bind wildcard/host settings
      ##
      - WILDCARD_DNS=${TLD_SUFFIX:-loc}=127.0.0.1
      - EXTRA_HOSTS=${EXTRA_HOSTS}

      ##
      ## Forwarding
      ##
      - DNS_FORWARDER=${BIND_DNS_RESOLVER:-8.8.8.8,8.8.4.4}

      ##
      ## Security
      ##
      - DNSSEC_VALIDATE=${BIND_DNSSEC_VALIDATE:-no}

      ##
      ## Time settings
      ##
      - TTL_TIME=${BIND_TTL_TIME}
      - REFRESH_TIME=${BIND_REFRESH_TIME}
      - RETRY_TIME=${BIND_RETRY_TIME}
      - EXPIRY_TIME=${BIND_EXPIRY_TIME}
      - MAX_CACHE_TIME=${BIND_MAX_CACHE_TIME}

      ##
      ## Query log
      ##
      - DOCKER_LOGS=${BIND_LOG_DNS_QUERIES}

    dns:
      - 127.0.0.1

    # MacOS and Windows have this by default, this hack also allows it for Linux
    extra_hosts:
      docker.for.lin.host.internal: 172.16.238.1
      docker.for.lin.localhost: 172.16.238.1

    networks:
      app_net:
        ipv4_address: 172.16.238.100


  # ------------------------------------------------------------
  # PHP
  # ------------------------------------------------------------
  php:
    image: devilbox/php-fpm:${PHP_SERVER}-work-0.88
    hostname: php

    ##
    ## All .env variables
    ##
    ## Source all variables defined in .env
    ## This also makes any custom variable available in each PHP/HHVM container
    ##
    env_file:
      - ./.env

    environment:
      ##
      ## Debug/Logging
      ##
      - DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
      - DEBUG_COMPOSE_ENTRYPOINT
      - DOCKER_LOGS

      ##
      ## UserID and GroupID
      ##
      - NEW_UID
      - NEW_GID

      ##
      ## Adjust timezone
      ##
      - TIMEZONE

      ##
      ## Enable/Disable PHP Modules
      ##
      - ENABLE_MODULES=${PHP_MODULES_ENABLE}
      - DISABLE_MODULES=${PHP_MODULES_DISABLE}

      ##
      ## Mail-catching
      ##
      - ENABLE_MAIL=1

      ##
      ## Enable 127.0.0.1 Port-forwarding
      ##
      - FORWARD_PORTS_TO_LOCALHOST=80:httpd:80,443:httpd:443,3306:mysql:3306,5432:pgsql:5432,6379:redis:6379,11211:memcd:11211,27017:mongo:27017

      ##
      ## MySQL Backups
      ##
      - MYSQL_BACKUP_USER=root
      - MYSQL_BACKUP_PASS=${MYSQL_ROOT_PASSWORD}
      - MYSQL_BACKUP_HOST=mysql

    dns:
      - 172.16.238.100

    # MacOS and Windows have this by default, this hack also allows it for Linux
    extra_hosts:
      docker.for.lin.host.internal: 172.16.238.1
      docker.for.lin.localhost: 172.16.238.1

    networks:
      app_net:
        ipv4_address: 172.16.238.10

    volumes:
      # ---- Format: ----
      # HOST-DIRECTORY : DOCKER-DIRECTORY

      # Mount custom intranet
      - ${DEVILBOX_PATH}/.devilbox/www:/var/www/default:ro${MOUNT_OPTIONS}

      # Mount custom mass virtual hosting
      - ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}

      # Mount logs
      - ${DEVILBOX_PATH}/log/php-fpm-${PHP_SERVER}:/var/log/php:rw${MOUNT_OPTIONS}

      # Mount Mail directory
      - devilbox-mail:/var/mail:rw${MOUNT_OPTIONS}

      # Mount DB Backup directory
      - ${DEVILBOX_PATH}/backups:/shared/backups:rw${MOUNT_OPTIONS}

      # Mount devilbox user-defined *.ini files in order
      # to overwrite the default PHP.ini configuration
      - ${DEVILBOX_PATH}/cfg/php-ini-${PHP_SERVER}:/etc/php-custom.d:ro${MOUNT_OPTIONS}

      # Mount devilbox user-defined PHP-FPM *.conf files in order
      # to overwrite the default PHP-FPM configuration
      - ${DEVILBOX_PATH}/cfg/php-fpm-${PHP_SERVER}:/etc/php-fpm-custom.d:ro${MOUNT_OPTIONS}

      # Mount devilbox user-defined *.so files in order
      # to load custom PHP modules
      - ${DEVILBOX_PATH}/mod/php-fpm-${PHP_SERVER}:/usr/lib64/php/custom-modules:ro${MOUNT_OPTIONS}

      # Mount devilbox user-defined PHP-FPM startup *.sh scripts
      - ${DEVILBOX_PATH}/cfg/php-startup-${PHP_SERVER}:/startup.1.d:rw${MOUNT_OPTIONS}
      - ${DEVILBOX_PATH}/autostart:/startup.2.d:rw${MOUNT_OPTIONS}

      # Mount devilbox user-defined bash config
      - ${DEVILBOX_PATH}/bash:/etc/bashrc-devilbox.d:rw${MOUNT_OPTIONS}

      # Certificate Authority public key
      - ${DEVILBOX_PATH}/ca:/ca:rw${MOUNT_OPTIONS}

    depends_on:
      - bind


  # ------------------------------------------------------------
  # Web Server
  # ------------------------------------------------------------
  httpd:
    image: devilbox/${HTTPD_SERVER}:0.30
    hostname: httpd

    environment:

      ##
      ## Debug/Logging
      ##
      - DEBUG_ENTRYPOINT=${DEBUG_COMPOSE_ENTRYPOINT}
      - DEBUG_RUNTIME=${DEBUG_COMPOSE_ENTRYPOINT}
      - DOCKER_LOGS

      ##
      ## Adjust timezone
      ##
      - TIMEZONE

      ##
      ## UserID and GroupID
      ##
      - NEW_UID
      - NEW_GID

      ##
      ## Nginx specific worker/connection settings
      ##
      - WORKER_PROCESSES=${HTTPD_NGINX_WORKER_PROCESSES:-auto}
      - WORKER_CONNECTIONS=${HTTPD_NGINX_WORKER_CONNECTIONS:-1024}

      ##
      ## Disable default vhost?
      ##
      - MAIN_VHOST_ENABLE=${DEVILBOX_UI_ENABLE}
      - MAIN_VHOST_STATUS_ENABLE=1
      - MAIN_VHOST_STATUS_ALIAS=/devilbox-httpd-status
      - MAIN_VHOST_SSL_TYPE=both
      - MAIN_VHOST_SSL_GEN=1
      - MAIN_VHOST_SSL_CN=${DEVILBOX_UI_SSL_CN:-localhost}

      ##
      ## Enable Mass Vhosts
      ##
      - MASS_VHOST_ENABLE=1
      - MASS_VHOST_TLD=.${TLD_SUFFIX}
      - MASS_VHOST_DOCROOT=${HTTPD_DOCROOT_DIR}
      - MASS_VHOST_TPL=${HTTPD_TEMPLATE_DIR}
      - MASS_VHOST_SSL_TYPE=both
      - MASS_VHOST_SSL_GEN=1

      ##
      ## PHP-FPM Remote Server
      ##
      - COMPAT=${PHP_SERVER}
      - PHP_FPM_ENABLE=1
      - PHP_FPM_SERVER_ADDR=php
      - PHP_FPM_SERVER_PORT=9000
      - PHP_FPM_TIMEOUT=${HTTPD_TIMEOUT_TO_PHP_FPM:-180}

    ports:
      # ---- Format: ----
      # [HOST-ADDR : ] HOST-PORT : DOCKER-PORT
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_HTTPD}:80"
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_HTTPD_SSL}:443"

    networks:
      app_net:
        ipv4_address: 172.16.238.11

    volumes:
      # ---- Format: ----
      # HOST-DIRECTORY : DOCKER-DIRECTORY

      # Mount custom intranet
      - ${DEVILBOX_PATH}/.devilbox/www:/var/www/default:ro${MOUNT_OPTIONS}

      # Mount custom mass virtual hosting
      - ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:rw${MOUNT_OPTIONS}

      # Mount custom web server config directory
      - ${DEVILBOX_PATH}/cfg/${HTTPD_SERVER}:/etc/httpd-custom.d:rw${MOUNT_OPTIONS}

      # Mount custom vhost-templates
      - ${DEVILBOX_PATH}/cfg/vhost-gen:/etc/vhost-gen.d:rw${MOUNT_OPTIONS}

      # Mount logs
      - ${DEVILBOX_PATH}/log/${HTTPD_SERVER}:/var/log/${HTTPD_SERVER}:rw${MOUNT_OPTIONS}

      # Certificate Authority public key
      - ${DEVILBOX_PATH}/ca:/ca:rw${MOUNT_OPTIONS}

    depends_on:
      - bind
      - php


  # ------------------------------------------------------------
  # MySQL Database
  # ------------------------------------------------------------
  mysql:
    image: devilbox/mysql:${MYSQL_SERVER}-0.3
    hostname: mysql

    environment:
      - MYSQL_ROOT_PASSWORD
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes

    ports:
      # [local-machine:]local-port:docker-port
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_MYSQL}:3306"

    networks:
      app_net:
        ipv4_address: 172.16.238.12

    volumes:
      # ---- Format: ----
      # HOST-DIRECTORY : DOCKER-DIRECTORY

      # Mount devilbox user-defined cnf files in order
      # to overwrite the MySQL server configuration
      - ${DEVILBOX_PATH}/cfg/${MYSQL_SERVER}:/etc/mysql/docker-default.d:ro${MOUNT_OPTIONS}

      # Mount MySQL Data directory
      - devilbox-${MYSQL_SERVER}:/var/lib/mysql:rw${MOUNT_OPTIONS}

    depends_on:
      - bind
      - php
      - httpd


  # ------------------------------------------------------------
  # PostgreSQL
  # ------------------------------------------------------------
  pgsql:
    image: postgres:${PGSQL_SERVER}
    hostname: pgsql

    environment:

      - POSTGRES_USER=${PGSQL_ROOT_USER}
      - POSTGRES_PASSWORD=${PGSQL_ROOT_PASSWORD}
      - PGDATA=/var/lib/postgresql/data/pgdata

    ports:
      # [local-machine:]local-port:docker-port
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_PGSQL}:5432"

    networks:
      app_net:
        ipv4_address: 172.16.238.13

    volumes:
      # ---- Format: ----
      # HOST-DIRECTORY : DOCKER-DIRECTORY

      # Mount logs
      - ${DEVILBOX_PATH}/log/pgsql-${PGSQL_SERVER}:/var/log/postgresql:rw${MOUNT_OPTIONS}

      # Mount PostgreSQL Data directory
      - devilbox-pgsql-${PGSQL_SERVER}:/var/lib/postgresql/data/pgdata:rw${MOUNT_OPTIONS}

    depends_on:
      - bind
      - php
      - httpd


  # ------------------------------------------------------------
  # Redis
  # ------------------------------------------------------------
  redis:
    image: redis:${REDIS_SERVER}
    hostname: redis

    # Apply custom arguments to redis startup
    command: redis-server ${REDIS_ARGS:- }
    environment:
      - REDIS_ARGS=${REDIS_ARGS:- }

    ports:
      # [local-machine:]local-port:docker-port
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_REDIS}:6379"

    networks:
      app_net:
        ipv4_address: 172.16.238.14

    depends_on:
      - bind
      - php
      - httpd


  # ------------------------------------------------------------
  # Memcached
  # ------------------------------------------------------------
  memcd:
    image: memcached:${MEMCD_SERVER}
    hostname: memcd

    ports:
      # [local-machine:]local-port:docker-port
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_MEMCD}:11211"

    networks:
      app_net:
        ipv4_address: 172.16.238.15

    volumes:
      # ---- Format: ----
      # HOST-DIRECTORY : DOCKER-DIRECTORY

      # Mount logs
      - ${DEVILBOX_PATH}/log/memcd-${MEMCD_SERVER}:/var/log/memcd:rw${MOUNT_OPTIONS}

    depends_on:
      - bind
      - php
      - httpd


  # ------------------------------------------------------------
  # MongoDB
  # ------------------------------------------------------------
  mongo:
    image: mongo:${MONGO_SERVER}
    hostname: mongo

    ports:
      # [local-machine:]local-port:docker-port
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_MONGO}:27017"

    networks:
      app_net:
        ipv4_address: 172.16.238.16

    volumes:
      # ---- Format: ----
      # HOST-DIRECTORY : DOCKER-DIRECTORY

      # Mount MongoDB Data directory
      - devilbox-mongo-${MONGO_SERVER}:/data/db:rw${MOUNT_OPTIONS}

    depends_on:
      - bind
      - php
      - httpd


################################################################################
# NETWORK
################################################################################
networks:
  app_net:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
        - subnet: 172.16.238.0/24
          gateway: 172.16.238.1


################################################################################
# VOLUMES
################################################################################
volumes:
  # ------------------------------------------------------------
  # Misc
  # ------------------------------------------------------------
  devilbox-mail:

  # ------------------------------------------------------------
  # MySQL
  # ------------------------------------------------------------
  devilbox-mysql-5.5:
  devilbox-mysql-5.6:
  devilbox-mysql-5.7:
  devilbox-mysql-8.0:
  devilbox-mariadb-5.5:
  devilbox-mariadb-10.0:
  devilbox-mariadb-10.1:
  devilbox-mariadb-10.2:
  devilbox-mariadb-10.3:
  devilbox-mariadb-10.4:
  devilbox-percona-5.5:
  devilbox-percona-5.6:
  devilbox-percona-5.7:
  devilbox-percona-8.0:

  # ------------------------------------------------------------
  # Postgres
  # ------------------------------------------------------------
  devilbox-pgsql-9.0:
  devilbox-pgsql-9.1:
  devilbox-pgsql-9.2:
  devilbox-pgsql-9.2-alpine:
  devilbox-pgsql-9.3:
  devilbox-pgsql-9.3-alpine:
  devilbox-pgsql-9.4:
  devilbox-pgsql-9.4-alpine:
  devilbox-pgsql-9.5:
  devilbox-pgsql-9.5-alpine:
  devilbox-pgsql-9.6:
  devilbox-pgsql-9.6-alpine:
  devilbox-pgsql-10.0:
  devilbox-pgsql-10.0-alpine:
  devilbox-pgsql-10.1:
  devilbox-pgsql-10.1-alpine:
  devilbox-pgsql-10.2:
  devilbox-pgsql-10.2-alpine:
  devilbox-pgsql-10.3:
  devilbox-pgsql-10.3-alpine:
  devilbox-pgsql-10.4:
  devilbox-pgsql-10.4-alpine:
  devilbox-pgsql-10.5:
  devilbox-pgsql-10.5-alpine:
  devilbox-pgsql-10.6:
  devilbox-pgsql-10.6-alpine:
  devilbox-pgsql-11.0:
  devilbox-pgsql-11.0-alpine:
  devilbox-pgsql-11.1:
  devilbox-pgsql-11.1-alpine:
  devilbox-pgsql-latest:
  devilbox-pgsql-alpine:

  # ------------------------------------------------------------
  # MongoDB
  # ------------------------------------------------------------
  devilbox-mongo-2.8:
  devilbox-mongo-3.0:
  devilbox-mongo-3.2:
  devilbox-mongo-3.4:
  devilbox-mongo-3.6:
  devilbox-mongo-4.0:
  devilbox-mongo-latest:
