##
## -------------------------
## |  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 --
##
## 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:latest
    restart: always
    ports:
      # [local-machine:]local-port:docker-port
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_BIND}:53"
      - "${LOCAL_LISTEN_ADDR}${HOST_PORT_BIND}/udp:53/udp"
    environment:
      ##
      ## Debug?
      ##
      - DEBUG_COMPOSE_ENTRYPOINT

      ##
      ## Bind settings
      ##
      - WILDCARD_DOMAIN=${TLD_SUFFIX:-loc}
      - WILDCARD_ADDRESS=172.16.238.11

    dns:
      - 127.0.0.1

    networks:
      app_net:
        ipv4_address: 172.16.238.100


  # ----------------------------------------
  # PHP-FPM
  # ----------------------------------------
  php:
    # TODO: remove latest, once it is ready for the next release
    #image: cytopia/${PHP_SERVER:-php-fpm-5.4}:latest
    image: cytopia/${PHP_SERVER:-php-fpm-7.0}:release-0.9
    restart: always

    # Manually build via `docker-compose build`
    #build:
        #context: https://github.com/cytopia/docker-${PHP_SERVER}.git#1
    #    context: https://github.com/cytopia/docker-${PHP_SERVER}.git

    environment:

      ##
      ## Debug?
      ##
      - DEBUG_COMPOSE_ENTRYPOINT

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

      ##
      ## Adjust timezone
      ##
      - TIMEZONE

      ##
      ## TLD SUffix
      ##
      - TLD_SUFFIX=${TLD_SUFFIX:-loc}
      - DNS_CHECK_TIMEOUT=${DNS_CHECK_TIMEOUT:-1}

      ##
      ## PHP Xdebug
      ##
      - PHP_XDEBUG_ENABLE
      - PHP_XDEBUG_REMOTE_PORT
      - PHP_XDEBUG_REMOTE_HOST

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

      ##
      ## Enable 127.0.0.1 Port-forwarding
      ##
      - FORWARD_PORTS_TO_LOCALHOST=3306:mysql:3306,5432:pgsql:5432,6379:redis:6379,11211:memcached:11211

      ##
      ## Additional variables to announce to intranet/php-container
      ##
      # Ports
      - LOCAL_LISTEN_ADDR
      - HOST_PORT_BIND
      - HOST_PORT_HTTPD
      - HOST_PORT_MYSQL
      - HOST_PORT_PGSQL
      - HOST_PORT_REDIS
      - HOST_PORT_MEMCACHED
      # Data dir paths
      - HOST_PATH_HTTPD_DATADIR
      - HOST_PATH_MYSQL_DATADIR
      - HOST_PATH_PGSQL_DATADIR
      # Database credentials
      - PGSQL_ROOT_USER
      - PGSQL_ROOT_PASSWORD
      - MYSQL_ROOT_PASSWORD
      # Selected Server versions
      - PHP_SERVER
      - HTTPD_SERVER
      - PGSQL_SERVER
      - MYSQL_SERVER
      - REDIS_SERVER
      - MEMCACHED_SERVER

    networks:
      app_net:
        ipv4_address: 172.16.238.10

    dns:
      - 172.16.238.100
      - 8.8.8.8
      - 8.8.4.4

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

      # Mount custom intranet
      # (configured in /etc/${HTTPD_SERVER}/01-vhost-default.conf)
      - ${DEVILBOX_PATH}/.devilbox/www:/var/www/default:ro

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

      # Mount MySQL Socket directory
      - vol_mysql_sock:/tmp/mysql

      # Mount Mail directory
      #- ${DEVILBOX_PATH}/run/mail:/var/mail

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

      # Mount custom mass virtual hosting
      # (configured in /etc/${HTTPD_SERVER}/02-vhost-mass.conf)
      - ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd

    depends_on:
      - bind

  # ----------------------------------------
  # HTTPD
  # ----------------------------------------
  httpd:
    # TODO: remove latest, once it is ready for the next release
    image: cytopia/${HTTPD_SERVER:-nginx-mainline}:latest
    restart: always

    # Manually build via `docker-compose build`
    #build:
        #context: https://github.com/cytopia/docker-${HTTPD_SERVER}.git#1
    #    context: https://github.com/cytopia/docker-${HTTPD_SERVER}.git

    environment:

      ##
      ## Debug?
      ##
      - DEBUG_COMPOSE_ENTRYPOINT

      ##
      ## Adjust timezone
      ##
      - TIMEZONE

      ##
      ## PHP-FPM Remote Server
      ##
      - PHP_FPM_ENABLE=1
      - PHP_FPM_SERVER_ADDR=php
      - PHP_FPM_SERVER_PORT=9000

      ## Tell the webserver to look into this directory
      ## for additional configuration files.
      ##
      ## @see volumes:: - ./etc/${HTTPD_SERVER}:/etc/${HTTPD_SERVER}
      - CUSTOM_HTTPD_CONF_DIR=/etc/${HTTPD_SERVER}

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

    networks:
      app_net:
        ipv4_address: 172.16.238.11

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

      # Custom scripts/binaries required for httpd server vhost
      # configuration to work.
      # (configured in /etc/${HTTPD_SERVER}/02-vhost-mass.conf)
      - ${DEVILBOX_PATH}/.devilbox/bin/${HTTPD_SERVER}:/opt/bin:ro

      # Mount user-defined httpd configuration files
      # @see environment::CUSTOM_HTTPD_CONF_DIR for how this
      # is added in httpd server
      - ${DEVILBOX_PATH}/.devilbox/etc/${HTTPD_SERVER}:/etc/${HTTPD_SERVER}:ro

      # Mount custom intranet
      # (configured in /etc/${HTTPD_SERVER}/01-vhost-default.conf)
      - ${DEVILBOX_PATH}/.devilbox/www:/var/www/default:ro

      # Mount user-defined httpd log
      # @see ./etc/${HTTPD_SERVER}/*.conf for log defines
      - ${DEVILBOX_PATH}/log/${HTTPD_SERVER}:/var/log/${HTTPD_SERVER}

      # Mount custom mass virtual hosting
      # (configured in /etc/${HTTPD_SERVER}/02-vhost-mass.conf)
      - ${HOST_PATH_HTTPD_DATADIR}:/shared/httpd:ro

    depends_on:
      - bind
      - php


  # ----------------------------------------
  # DATABASE
  # ----------------------------------------
  mysql:
    # TODO: remove latest, once it is ready for the next release
    image: cytopia/${MYSQL_SERVER:-mariadb-10.1}:latest

    # Manually build via `docker-compose build`
    #build:
        #context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git#1
    #    context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git

    environment:

      ##
      ## Debug?
      ##
      - DEBUG_COMPOSE_ENTRYPOINT

      ##
      ## Adjust timezone
      ##
      - TIMEZONE

      ##
      ## Adjust Root password
      ##
      - MYSQL_ROOT_PASSWORD

      ##
      ## Socket directory Path
      ##
      - MYSQL_SOCKET_DIR=/tmp/mysql

      ##
      ## Runtime settings
      ##
      - MYSQL_GENERAL_LOG=${MYSQL_GENERAL_LOG}

    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 logs
      - ${DEVILBOX_PATH}/log/${MYSQL_SERVER}:/var/log/mysql

      # Mount MySQL Socket directory
      - vol_mysql_sock:/tmp/mysql

      # Mount devilbox default overwrites
      - ${DEVILBOX_PATH}/.devilbox/etc/${MYSQL_SERVER}:/etc/mysql/docker-default.d:ro

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

      # Mount MySQL Data directory
      - ${HOST_PATH_MYSQL_DATADIR}/${MYSQL_SERVER}:/var/lib/mysql

    depends_on:
      - bind
      - php
      - httpd


  # ----------------------------------------
  # POSTGRESQL
  # ----------------------------------------
  pgsql:
    image: postgres:${PGSQL_SERVER:-9.6}

    # Manually build via `docker-compose build`
    #build:
        #context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git#1
    #    context: https://github.com/cytopia/docker-${MYSQL_SERVER}.git

    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

      # Mount PostgreSQL Socket directory
      - vol_pgsql_sock:/var/run/postgresql

      # Mount PostgreSQL Data directory
      - ${HOST_PATH_PGSQL_DATADIR}/${PGSQL_SERVER}:/var/lib/postgresql/data/pgdata

    depends_on:
      - bind
      - php
      - httpd


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

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

    networks:
      app_net:
        ipv4_address: 172.16.238.14

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

      # Mount logs
      - ${DEVILBOX_PATH}/log/redis-${REDIS_SERVER}:/var/log/redis

    depends_on:
      - bind
      - php
      - httpd


  # ----------------------------------------
  # Memcached
  # ----------------------------------------
  memcached:
    image: memcached:${MEMCACHED_SERVER:-latest}

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

    networks:
      app_net:
        ipv4_address: 172.16.238.15

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

      # Mount logs
      - ${DEVILBOX_PATH}/log/memcached-${MEMCACHED_SERVER}:/var/log/memcached

    depends_on:
      - bind
      - php
      - httpd


################################################################################
# VOLUMES
################################################################################
volumes:
  # Create volume for mysql socket.
  # This removes the need to mount the socket to the host
  # but be able to mount it to different containers (from another container)
  vol_mysql_sock:

  # Create volume for postgresql socket.
  # This removes the need to mount the socket to the host
  # but be able to mount it to different containers (from another container)
  vol_pgsql_sock:


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