version: '2'

services:

### Applications Code Container #############################

    applications:
      image: tianon/true

### Workspace Utilities Container ###########################

    workspace:
      build:
        context: ./workspace
        args:
          - INSTALL_XDEBUG=${WORKSPACE_INSTALL_XDEBUG}
          - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE}
          - INSTALL_SOAP=${WORKSPACE_INSTALL_SOAP}
          - INSTALL_LDAP=${WORKSPACE_INSTALL_LDAP}
          - INSTALL_IMAP=${WORKSPACE_INSTALL_IMAP}
          - INSTALL_MONGO=${WORKSPACE_INSTALL_MONGO}
          - INSTALL_AMQP=${WORKSPACE_INSTALL_AMQP}
          - INSTALL_PHPREDIS=${WORKSPACE_INSTALL_PHPREDIS}
          - INSTALL_MSSQL=${WORKSPACE_INSTALL_MSSQL}
          - INSTALL_NODE=${WORKSPACE_INSTALL_NODE}
          - INSTALL_YARN=${WORKSPACE_INSTALL_YARN}
          - INSTALL_DRUSH=${WORKSPACE_INSTALL_DRUSH}
          - INSTALL_DRUPAL_CONSOLE=${WORKSPACE_INSTALL_DRUPAL_CONSOLE}
          - INSTALL_AEROSPIKE=${WORKSPACE_INSTALL_AEROSPIKE}
          - INSTALL_V8JS=${WORKSPACE_INSTALL_V8JS}
          - COMPOSER_GLOBAL_INSTALL=${WORKSPACE_COMPOSER_GLOBAL_INSTALL}
          - INSTALL_WORKSPACE_SSH=${WORKSPACE_INSTALL_WORKSPACE_SSH}
          - INSTALL_LARAVEL_ENVOY=${WORKSPACE_INSTALL_LARAVEL_ENVOY}
          - INSTALL_LARAVEL_INSTALLER=${WORKSPACE_INSTALL_LARAVEL_INSTALLER}
          - INSTALL_DEPLOYER=${WORKSPACE_INSTALL_DEPLOYER}
          - INSTALL_LINUXBREW=${WORKSPACE_INSTALL_LINUXBREW}
          - INSTALL_MC=${WORKSPACE_INSTALL_MC}
          - INSTALL_SYMFONY=${WORKSPACE_INSTALL_SYMFONY}
          - INSTALL_PYTHON=${WORKSPACE_INSTALL_PYTHON}
          - INSTALL_IMAGE_OPTIMIZERS=${WORKSPACE_INSTALL_IMAGE_OPTIMIZERS}
          - INSTALL_IMAGEMAGICK=${WORKSPACE_INSTALL_IMAGEMAGICK}
          - INSTALL_TERRAFORM=${WORKSPACE_INSTALL_TERRAFORM}
          - INSTALL_DUSK_DEPS=${WORKSPACE_INSTALL_DUSK_DEPS}
          - INSTALL_PG_CLIENT=${WORKSPACE_INSTALL_PG_CLIENT}
          - PUID=${WORKSPACE_PUID}
          - PGID=${WORKSPACE_PGID}
          - CHROME_DRIVER_VERSION=${WORKSPACE_CHROME_DRIVER_VERSION}
          - NODE_VERSION=${WORKSPACE_NODE_VERSION}
          - YARN_VERSION=${WORKSPACE_YARN_VERSION}
          - TZ=${WORKSPACE_TIMEZONE}
          - BLACKFIRE_CLIENT_ID=${BLACKFIRE_CLIENT_ID}
          - BLACKFIRE_CLIENT_TOKEN=${BLACKFIRE_CLIENT_TOKEN}
        dockerfile: "Dockerfile-${PHP_VERSION}"
      volumes_from:
        - applications
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      ports:
        - "${WORKSPACE_SSH_PORT}:22"
      tty: true
      networks:
        - frontend
        - backend

### PHP-FPM Container #######################################

    php-fpm:
      build:
        context: ./php-fpm
        args:
          - INSTALL_XDEBUG=${PHP_FPM_INSTALL_XDEBUG}
          - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE}
          - INSTALL_SOAP=${PHP_FPM_INSTALL_SOAP}
          - INSTALL_MONGO=${PHP_FPM_INSTALL_MONGO}
          - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP}
          - INSTALL_MSSQL=${PHP_FPM_INSTALL_MSSQL}
          - INSTALL_ZIP_ARCHIVE=${PHP_FPM_INSTALL_ZIP_ARCHIVE}
          - 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_AEROSPIKE=${PHP_FPM_INSTALL_AEROSPIKE}
          - INSTALL_MYSQLI=${PHP_FPM_INSTALL_MYSQLI}
          - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL}
          - INSTALL_PG_CLIENT=${PHP_FPM_INSTALL_PG_CLIENT}
          - INSTALL_TOKENIZER=${PHP_FPM_INSTALL_TOKENIZER}
          - INSTALL_INTL=${PHP_FPM_INSTALL_INTL}
          - INSTALL_GHOSTSCRIPT=${PHP_FPM_INSTALL_GHOSTSCRIPT}
          - INSTALL_LDAP=${PHP_FPM_INSTALL_LDAP}
          - INSTALL_SWOOLE=${PHP_FPM_INSTALL_SWOOLE}
          - INSTALL_IMAGE_OPTIMIZERS=${PHP_FPM_INSTALL_IMAGE_OPTIMIZERS}
          - INSTALL_IMAGEMAGICK=${PHP_FPM_INSTALL_IMAGEMAGICK}
        dockerfile: "Dockerfile-${PHP_VERSION}"
      volumes_from:
        - applications
      volumes:
        - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini
      expose:
        - "9000"
      depends_on:
        - workspace
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      environment:
        - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
      networks:
        - backend

### PHP Worker Container #####################################

    php-worker:
      build:
        context: ./php-worker
        dockerfile: "Dockerfile-${PHP_VERSION}"
        args:
          - INSTALL_PGSQL=${PHP_WORKER_INSTALL_PGSQL}
      volumes_from:
        - applications
      depends_on:
        - workspace
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      networks:
        - backend

### NGINX Server Container ##################################

    nginx:
      build:
        context: ./nginx
        args:
          - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
          - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT}
      volumes_from:
        - applications
      volumes:
        - ${NGINX_HOST_LOG_PATH}:/var/log/nginx
        - ${NGINX_SITES_PATH}:/etc/nginx/sites-available
      ports:
        - "${NGINX_HOST_HTTP_PORT}:80"
        - "${NGINX_HOST_HTTPS_PORT}:443"
      depends_on:
        - php-fpm
      networks:
        - frontend
        - backend

### Blackfire Container #################################

    blackfire:
      image: blackfire/blackfire
      environment:
        - BLACKFIRE_SERVER_ID=${BLACKFIRE_SERVER_ID}
        - BLACKFIRE_SERVER_TOKEN=${BLACKFIRE_SERVER_TOKEN}
      depends_on:
        - php-fpm
      networks:
        - backend

### Apache Server Container #################################

    apache2:
      build:
        context: ./apache2
        args:
          - PHP_UPSTREAM_CONTAINER=${APACHE_PHP_UPSTREAM_CONTAINER}
          - PHP_UPSTREAM_PORT=${APACHE_PHP_UPSTREAM_PORT}
          - PHP_UPSTREAM_TIMEOUT=${APACHE_PHP_UPSTREAM_TIMEOUT}
      volumes_from:
        - applications
      volumes:
        - ${APACHE_HOST_LOG_PATH}:/var/log/apache2
        - ${APACHE_SITES_PATH}:/etc/apache2/sites-available
      ports:
        - "${APACHE_HOST_HTTP_PORT}:80"
        - "${APACHE_HOST_HTTPS_PORT}:443"
      depends_on:
        - php-fpm
      networks:
        - frontend
        - backend

### HHVM Container ##########################################

    hhvm:
      build: ./hhvm
      volumes_from:
        - applications
      expose:
        - "9000"
      depends_on:
        - workspace
      networks:
        - frontend
        - backend

### Minio Container #########################################

    minio:
      build: ./minio
      volumes:
        - ${DATA_SAVE_PATH}/minio/data:/export
        - ${DATA_SAVE_PATH}/minio/config:/root/.minio
      ports:
        - "${MINIO_PORT}:9000"
      environment:
        - MINIO_ACCESS_KEY=access
        - MINIO_SECRET_KEY=secretkey
      networks:
        - frontend
        - backend

### MySQL Container #########################################

    mysql:
      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=${WORKSPACE_TIMEZONE}
      volumes:
        - ${DATA_SAVE_PATH}/mysql:/var/lib/mysql
        - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MYSQL_PORT}:3306"
      networks:
        - backend

### Percona Container #########################################

    percona:
      build:
        context: ./percona
      environment:
        - MYSQL_DATABASE=${PERCONA_DATABASE}
        - MYSQL_USER=${PERCONA_USER}
        - MYSQL_PASSWORD=${PERCONA_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${PERCONA_ROOT_PASSWORD}
      volumes:
        - ${DATA_SAVE_PATH}/percona:/var/lib/mysql
        - ${PERCONA_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${PERCONA_PORT}:3306"
      networks:
        - backend

### MSSQL Container #########################################

    mssql:
      build:
        context: ./mssql
      environment:
        - MSSQL_DATABASE=${MSSQL_DATABASE}
        - SA_PASSWORD=${MSSQL_PASSWORD}
        - ACCEPT_EULA=Y
      volumes:
        - ${DATA_SAVE_PATH}/mssql:/var/opt/mssql
      ports:
        - "${MSSQL_PORT}:1433"
      networks:
        - backend

### MariaDB Container #######################################

    mariadb:
      build: ./mariadb
      volumes:
        - ${DATA_SAVE_PATH}/mariadb:/var/lib/mysql
        - ${MARIADB_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
      ports:
        - "${MARIADB_PORT}:3306"
      environment:
        - MYSQL_DATABASE=${MARIADB_DATABASE}
        - MYSQL_USER=${MARIADB_USER}
        - MYSQL_PASSWORD=${MARIADB_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD}
      networks:
        - backend

### PostgreSQL Container ####################################

    postgres:
      build: ./postgres
      volumes:
        - ${DATA_SAVE_PATH}/postgres:/var/lib/postgresql
      ports:
        - "${POSTGRES_PORT}:5432"
      environment:
        - POSTGRES_DB=${POSTGRES_DB}
        - POSTGRES_USER=${POSTGRES_USER}
        - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      networks:
        - backend

### PostgreSQL PostGis Container ############################

    postgres-postgis:
      build: ./postgres-postgis
      volumes:
        - ${DATA_SAVE_PATH}/postgres:/var/lib/postgresql/data
      ports:
        - "${POSTGRES_PORT}:5432"
      environment:
        - POSTGRES_DB=${POSTGRES_DB}
        - POSTGRES_USER=${POSTGRES_USER}
        - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      networks:
        - backend

### Neo4j Container #########################################

    neo4j:
      build: ./neo4j
      ports:
        - "7474:7474"
        - "1337:1337"
      environment:
        - NEO4J_AUTH=default:secret
      volumes:
        - ${DATA_SAVE_PATH}/neo4j:/var/lib/neo4j/data
      networks:
        - backend

### MongoDB Container #######################################

    mongo:
      build: ./mongo
      ports:
        - "${MONGODB_PORT}:27017"
      volumes:
        - ${DATA_SAVE_PATH}/mongo:/data/db
      networks:
        - backend

### RethinkDB Container #######################################

    rethinkdb:
      build: ./rethinkdb
      ports:
        - "${RETHINKDB_PORT}:8080"
      volumes:
        - ${DATA_SAVE_PATH}/rethinkdb:/data/rethinkdb_data
      networks:
        - backend

### Redis Container #########################################

    redis:
      build: ./redis
      volumes:
        - ${DATA_SAVE_PATH}/redis:/data
      ports:
        - "${REDIS_PORT}:6379"
      networks:
        - backend

### Aerospike c Container ###################################

    aerospike:
      build: ./aerospike
      volumes_from:
        - workspace
      volumes:
        - ${DATA_SAVE_PATH}/aerospike:/opt/aerospike/data
      ports:
        - "${AEROSPIKE_SERVICE_PORT}:3000"
        - "${AEROSPIKE_FABRIC_PORT}:3001"
        - "${AEROSPIKE_HEARTBEAT_PORT}:3002"
        - "${AEROSPIKE_INFO_PORT}:3003"
      networks:
        - backend

### Memcached Container #####################################

    memcached:
      build: ./memcached
      volumes:
        - ${DATA_SAVE_PATH}/memcached:/var/lib/memcached
      ports:
        - "${MEMCACHED_HOST_PORT}:11211"
      depends_on:
        - php-fpm
      networks:
        - backend

### Beanstalkd Container ####################################

    beanstalkd:
      build: ./beanstalkd
      ports:
        - "${BEANSTALKD_HOST_PORT}:11300"
      privileged: true
      depends_on:
        - php-fpm
      networks:
        - backend

### RabbitMQ Container ######################################

    rabbitmq:
      build: ./rabbitmq
      ports:
        - "${RABBITMQ_NODE_HOST_PORT}:5672"
        - "${RABBITMQ_MANAGEMENT_HTTP_HOST_PORT}:15672"
        - "${RABBITMQ_MANAGEMENT_HTTPS_HOST_PORT}:15671"
      privileged: true
      environment:
        - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER}
        - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
      depends_on:
        - php-fpm
      networks:
        - backend

### Beanstalkd Console Container ############################

    beanstalkd-console:
      build: ./beanstalkd-console
      ports:
        - "2080:2080"
      depends_on:
        - beanstalkd
      networks:
        - backend

### Caddy Server Container ##################################

    caddy:
      build: ./caddy
      volumes_from:
        - applications
      volumes:
        - ${CADDY_CUSTOM_CADDYFILE}:/etc/Caddyfile
        - ${CADDY_HOST_LOG_PATH}:/var/log/caddy
        - ${DATA_SAVE_PATH}:/root/.caddy
      ports:
        - "${CADDY_HOST_HTTP_PORT}:80"
        - "${CADDY_HOST_HTTPS_PORT}:443"
      depends_on:
        - php-fpm
      networks:
        - frontend
        - backend

### phpMyAdmin Container ####################################

    phpmyadmin:
      build: ./phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - MYSQL_USER=${PMA_USER}
        - MYSQL_PASSWORD=${PMA_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${PMA_ROOT_PASSWORD}
      ports:
        - "${PMA_PORT}:80"
      depends_on:
        - "${PMA_DB_ENGINE}"
      networks:
        - frontend
        - backend

### Adminer Container ####################################

    adminer:
      build:
        context: ./adminer
        args:
          - INSTALL_MSSQL=${ADM_INSTALL_MSSQL}
      ports:
        - "${ADM_PORT}:8080"
      depends_on:
        - php-fpm
      networks:
        - frontend
        - backend

### pgAdmin Container #######################################

    pgadmin:
      build: ./pgadmin
      ports:
        - "5050:5050"
      volumes:
        - ${DATA_SAVE_PATH}/pgadmin-backup:/var/lib/pgadmin/storage/pgadmin4
      depends_on:
        - postgres
      networks:
        - frontend
        - backend


### ElasticSearch Container #################################

    elasticsearch:
      build: ./elasticsearch
      volumes:
        - elasticsearch-data:/usr/share/elasticsearch/data
        - elasticsearch-plugins:/usr/share/elasticsearch/plugins
      environment:
        - cluster.name=laradock-cluster
        - bootstrap.memory_lock=true
        - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      ulimits:
        memlock:
          soft: -1
          hard: -1
      mem_limit: 1024m
      ports:
        - "${ELASTICSEARCH_HOST_HTTP_PORT}:9200"
        - "${ELASTICSEARCH_HOST_TRANSPORT_PORT}:9300"
      depends_on:
        - php-fpm
      networks:
        - frontend
        - backend


### Kibana Container #######################################

    kibana:
      build: ./kibana
      ports:
        - "${KIBANA_HTTP_PORT}:5601"
      depends_on:
        - elasticsearch
      networks:
        - frontend
        - backend

### Certbot Container ##################################

    certbot:
      build:
        context: ./certbot
      volumes:
        - ./data/certbot/certs/:/var/certs
        - ./certbot/letsencrypt/:/var/www/letsencrypt
      environment:
        - CN="fake.domain.com"
        - EMAIL="fake.email@gmail.com"
      networks:
        - frontend

### Mailhog Container #########################################

    mailhog:
      build: ./mailhog
      ports:
        - "1025:1025"
        - "8025:8025"
      networks:
        - frontend
        - backend

### MailDev Container #######################################

    maildev:
      build: ./maildev
      ports:
        - "${MAILDEV_HTTP_PORT}:80"
        - "${MAILDEV_SMTP_PORT}:25"
      networks:
        - frontend
        - backend

### Selenium Container ########################################

    selenium:
      build: ./selenium
      ports:
        - "${SELENIUM_PORT}:4444"
      volumes:
        - /dev/shm:/dev/shm
      networks:
        - frontend

### Varnish Proxy 1 ##########################################

    proxy:
      build: ./varnish
      expose:
        - ${VARNISH_PORT}
      environment:
        - VARNISH_CONFIG=${VARNISH_CONFIG}
        - CACHE_SIZE=${VARNISH_PROXY1_CACHE_SIZE}
        - VARNISHD_PARAMS=${VARNISHD_PARAMS}
        - VARNISH_PORT=${VARNISH_PORT}
        - BACKEND_HOST=${VARNISH_PROXY1_BACKEND_HOST}
        - BACKEND_PORT=${VARNISH_BACKEND_PORT}
        - VARNISH_SERVER=${VARNISH_PROXY1_SERVER}
      links:
        - workspace
      networks:
        - frontend

### Varnish Proxy 2 ##########################################

    proxy2:
      build: ./varnish
      expose:
        - ${VARNISH_PORT}
      environment:
        - VARNISH_CONFIG=${VARNISH_CONFIG}
        - CACHE_SIZE=${VARNISH_PROXY2_CACHE_SIZE}
        - VARNISHD_PARAMS=${VARNISHD_PARAMS}
        - VARNISH_PORT=${VARNISH_PORT}
        - BACKEND_HOST=${VARNISH_PROXY2_BACKEND_HOST}
        - BACKEND_PORT=${VARNISH_BACKEND_PORT}
        - VARNISH_SERVER=${VARNISH_PROXY2_SERVER}
      links:
        - workspace
      networks:
        - frontend

### HAProxy Load Balancer ####################################

    haproxy:
      build: ./haproxy
      ports:
        - "${HAPROXY_HOST_HTTP_PORT}:8085"
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
      links:
        - proxy
        - proxy2

### Jenkins ###################################################

    jenkins:
      build: ./jenkins
      environment:
        JAVA_OPTS: "-Djava.awt.headless=true"
      ports:
        - "${JENKINS_HOST_SLAVE_AGENT_PORT}:50000"
        - "${JENKINS_HOST_HTTP_PORT}:8080"
      privileged: true
      volumes:
        - ${JENKINS_HOME}:/var/jenkins_home
        - /var/run/docker.sock:/var/run/docker.sock
      networks:
        - frontend
        - backend

### Grafana Container #########################################

    grafana:
      build:
        context: ./grafana
      volumes:
        - ${DATA_SAVE_PATH}/grafana:/var/lib/grafana
      ports:
        - "${GRAFANA_PORT}:3000"
      networks:
        - backend

### Laravel Echo Server #######################################
    laravel-echo-server:
      build:
        context: ./laravel-echo-server
      volumes:
        - ./laravel-echo-server/laravel-echo-server.json:/app/laravel-echo-server.json:ro
      ports:
        - "${LARAVEL_ECHO_SERVER_PORT}:6001"
      links:
        - redis
      networks:
        - frontend
        - backend

### AWS EB-CLI ####
    aws:
      build:
        context: ./aws
      volumes_from:
        - applications
      depends_on:
        - workspace
      tty: true

### Networks Setup ############################################

networks:
  frontend:
    driver: "bridge"
  backend:
    driver: "bridge"

### Volumes Setup #############################################

volumes:
  mysql:
    driver: "local"
  percona:
    driver: "local"
  mssql:
    driver: "local"
  postgres:
    driver: "local"
  memcached:
    driver: "local"
  redis:
    driver: "local"
  neo4j:
    driver: "local"
  mariadb:
    driver: "local"
  mongo:
    driver: "local"
  minio:
    driver: "local"
  rethinkdb:
    driver: "local"
  phpmyadmin:
    driver: "local"
  adminer:
    driver: "local"
  aerospike:
    driver: "local"
  caddy:
    driver: "local"
  elasticsearch-data:
    driver: "local"
  elasticsearch-plugins:
    driver: "local"
