├── README.md ├── file.png ├── books.conf ├── authors.conf ├── gateway.conf ├── README.adoc └── docker-compose.yml /README.md: -------------------------------------------------------------------------------- 1 | Infrastucture 2 | -------------------------------------------------------------------------------- /file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ahmedalaahagag/microservices-php-project/HEAD/file.png -------------------------------------------------------------------------------- /books.conf: -------------------------------------------------------------------------------- 1 | server { 2 | 3 | listen 81 default_server; 4 | listen [::]:81 default_server ipv6only=on; 5 | 6 | # For https 7 | # listen 443 ssl default_server; 8 | # listen [::]:443 ssl default_server ipv6only=on; 9 | # ssl_certificate /etc/nginx/ssl/default.crt; 10 | # ssl_certificate_key /etc/nginx/ssl/default.key; 11 | 12 | server_name localhost; 13 | root /var/www/Books/public; 14 | index index.php index.html index.htm; 15 | 16 | location / { 17 | try_files $uri $uri/ /index.php$is_args$args; 18 | } 19 | 20 | location ~ \.php$ { 21 | try_files $uri /index.php =404; 22 | fastcgi_pass php-upstream; 23 | fastcgi_index index.php; 24 | fastcgi_buffers 16 16k; 25 | fastcgi_buffer_size 32k; 26 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 27 | #fixes timeouts 28 | fastcgi_read_timeout 600; 29 | include fastcgi_params; 30 | } 31 | 32 | location ~ /\.ht { 33 | deny all; 34 | } 35 | 36 | location /.well-known/acme-challenge/ { 37 | root /var/www/letsencrypt/; 38 | log_not_found off; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /authors.conf: -------------------------------------------------------------------------------- 1 | server { 2 | 3 | listen 80 default_server; 4 | listen [::]:80 default_server ipv6only=on; 5 | 6 | # For https 7 | # listen 443 ssl default_server; 8 | # listen [::]:443 ssl default_server ipv6only=on; 9 | # ssl_certificate /etc/nginx/ssl/default.crt; 10 | # ssl_certificate_key /etc/nginx/ssl/default.key; 11 | 12 | server_name localhost; 13 | root /var/www/Authors/public; 14 | index index.php index.html index.htm; 15 | 16 | location / { 17 | try_files $uri $uri/ /index.php$is_args$args; 18 | } 19 | 20 | location ~ \.php$ { 21 | try_files $uri /index.php =404; 22 | fastcgi_pass php-upstream; 23 | fastcgi_index index.php; 24 | fastcgi_buffers 16 16k; 25 | fastcgi_buffer_size 32k; 26 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 27 | #fixes timeouts 28 | fastcgi_read_timeout 600; 29 | include fastcgi_params; 30 | } 31 | 32 | location ~ /\.ht { 33 | deny all; 34 | } 35 | 36 | location /.well-known/acme-challenge/ { 37 | root /var/www/letsencrypt/; 38 | log_not_found off; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /gateway.conf: -------------------------------------------------------------------------------- 1 | server { 2 | 3 | listen 82 default_server; 4 | listen [::]:82 default_server ipv6only=on; 5 | 6 | # For https 7 | # listen 443 ssl default_server; 8 | # listen [::]:443 ssl default_server ipv6only=on; 9 | # ssl_certificate /etc/nginx/ssl/default.crt; 10 | # ssl_certificate_key /etc/nginx/ssl/default.key; 11 | 12 | server_name localhost; 13 | root /var/www/ApiGateWay/public; 14 | index index.php index.html index.htm; 15 | 16 | location / { 17 | try_files $uri $uri/ /index.php$is_args$args; 18 | } 19 | 20 | location ~ \.php$ { 21 | try_files $uri /index.php =404; 22 | fastcgi_pass php-upstream; 23 | fastcgi_index index.php; 24 | fastcgi_buffers 16 16k; 25 | fastcgi_buffer_size 32k; 26 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 27 | #fixes timeouts 28 | fastcgi_read_timeout 600; 29 | include fastcgi_params; 30 | } 31 | 32 | location ~ /\.ht { 33 | deny all; 34 | } 35 | 36 | location /.well-known/acme-challenge/ { 37 | root /var/www/letsencrypt/; 38 | log_not_found off; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /README.adoc: -------------------------------------------------------------------------------- 1 | = What is this project 2 | 3 | This project was done as a part of 3 *Microservices* project using *Lumen* and *Laradock* demoing the usage of 4 | microservices. 5 | 6 | = What is a microservices 7 | image::file.png[] 8 | 9 | Microservices are a software development technique —a variant of the service-oriented architecture (SOA) structural style— that arranges an application as a collection of loosely coupled services.[1] In a microservices architecture, services are fine-grained and the protocols are lightweight. 10 | https://en.wikipedia.org/wiki/Microservices 11 | 12 | This is being to decouple systems and avoid single points of failuers and faster development and deployment and scalability. 13 | ____ 14 | 15 | Lumen is designed for building lightning fast micro-services and APIs 16 | 17 | ____ 18 | 19 | *Laradock* is a full PHP development environment for Docker that Includes prepackaged Docker Images, all preconfigured to provide a wonderful PHP development environment. Laradock is well known in the Laravel/lumen community, as the project started with single focus on running Laravel projects on Docker. 20 | 21 | == Useful Links 22 | 23 | * https://laradock.io/[Laradock] 24 | * https://lumen.laravel.com/[Lumen] 25 | 26 | == Requirements 27 | 28 | To be able to run this project one needs the following technologies: 29 | 30 | * https://www.docker.com/[Docker] -> Laradock uses Docker 31 | * https://getcomposer.org/[Composer] -> No need if one uses Laradock/Docker 32 | 33 | if one want to start Lumen from scratch Composer is need as a package manager. 34 | 35 | == Instructions 36 | . clone the first microservice `https://github.com/ahmedalaahagag/books-microserivce` follow the readme instructions section. 37 | . clone the second microservice `https://github.com/ahmedalaahagag/authors-microserivces` follow the readme instructions section. 38 | . clone the api-gateway microservice `https://github.com/ahmedalaahagag/api-gateway-php` follow the readme instructions section. 39 | . clone the laradock repository from `https://github.com/Laradock/laradock.git` 40 | . now you should have a dir with `Authors`,`Books`,`ApiGateWay`,`laradock` dirs inside 41 | 42 | == To run this project 43 | . `cd laradock` 44 | . `cp env-example .env` 45 | . Attached is a laradock `docker-compose.yml` file in this repo copy it to `laradock` 46 | . Attached is 3 nginx config files which holds the configs related to each of the microservices `gateway.conf`,`books.conf`,`authors.conf` copy those files to `laradock/nginx/sites` 47 | . `docker-compose up -d nginx mysql phpmyadmin workspace` => To start the server 48 | . `docker-compose exec workspace bash` => to get access to virtual machine and here one can execute any artisan command 49 | 50 | Remember all the *Docker* commands have to be run it under *Laradock* folder as there the Docker files are placed. 51 | 52 | If one wants to run this project as it is after `composer install` run migration as `php artisan migrate` to update the DB with the right tables. Then seed with `php artisan db:seed` to populate the DB with some fake data. 53 | 54 | == Adding a new microservice 55 | After writing your microservice code 56 | 57 | . Add the new nginx config file like `gateway.conf` and change the port number inside the new file 58 | ex.`laradock/nginx/sites/newmicroservice.conf` 59 | 60 | [source] 61 | ---- 62 | server { 63 | 64 | listen "81" default_server; 65 | listen [::]:"81" default_server ipv6only=on; 66 | 67 | # For https 68 | # listen 443 ssl default_server; 69 | # listen [::]:443 ssl default_server ipv6only=on; 70 | # ssl_certificate /etc/nginx/ssl/default.crt; 71 | # ssl_certificate_key /etc/nginx/ssl/default.key; 72 | 73 | server_name localhost; 74 | root /var/www/Books/public; 75 | index index.php index.html index.htm; 76 | 77 | location / { 78 | try_files $uri $uri/ /index.php$is_args$args; 79 | } 80 | 81 | location ~ \.php$ { 82 | try_files $uri /index.php =404; 83 | fastcgi_pass php-upstream; 84 | fastcgi_index index.php; 85 | fastcgi_buffers 16 16k; 86 | fastcgi_buffer_size 32k; 87 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 88 | #fixes timeouts 89 | fastcgi_read_timeout 600; 90 | include fastcgi_params; 91 | } 92 | 93 | location ~ /\.ht { 94 | deny all; 95 | } 96 | 97 | location /.well-known/acme-challenge/ { 98 | root /var/www/letsencrypt/; 99 | log_not_found off; 100 | } 101 | } 102 | ---- 103 | Change the port to the one that you want the microservice to run on 104 | . in `.env` file add 2 new keys 105 | 106 | MICRO_SERVICE_BASE_URI="http://IP_ADDRESS:PORT" 107 | MICRO_SERVICE_SECRET= 108 | 109 | Which is how your api gateway gets to your microservice 110 | 111 | . in `app/Http/Controllers` dir add the oprations that you want to perform with your api gatway 112 | . in `app/Http/Services` dir add the api call using `ConsumeExternalService` trait or write your own 113 | `ConsumeExternalService` is a guzzle wrapper 114 | http://docs.guzzlephp.org/en/stable/ 115 | . in `routes/web.php` add your new routes 116 | 117 | And like this you've added a new microservice. 118 | 119 | Note : This is not the best practice though read more on service discovery 120 | https://www.nginx.com/blog/service-discovery-in-a-microservices-architecture/ 121 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | networks: 4 | frontend: 5 | driver: ${NETWORKS_DRIVER} 6 | backend: 7 | driver: ${NETWORKS_DRIVER} 8 | 9 | volumes: 10 | mysql: 11 | driver: ${VOLUMES_DRIVER} 12 | percona: 13 | driver: ${VOLUMES_DRIVER} 14 | mssql: 15 | driver: ${VOLUMES_DRIVER} 16 | postgres: 17 | driver: ${VOLUMES_DRIVER} 18 | memcached: 19 | driver: ${VOLUMES_DRIVER} 20 | redis: 21 | driver: ${VOLUMES_DRIVER} 22 | neo4j: 23 | driver: ${VOLUMES_DRIVER} 24 | mariadb: 25 | driver: ${VOLUMES_DRIVER} 26 | mongo: 27 | driver: ${VOLUMES_DRIVER} 28 | minio: 29 | driver: ${VOLUMES_DRIVER} 30 | rethinkdb: 31 | driver: ${VOLUMES_DRIVER} 32 | phpmyadmin: 33 | driver: ${VOLUMES_DRIVER} 34 | adminer: 35 | driver: ${VOLUMES_DRIVER} 36 | aerospike: 37 | driver: ${VOLUMES_DRIVER} 38 | caddy: 39 | driver: ${VOLUMES_DRIVER} 40 | elasticsearch: 41 | driver: ${VOLUMES_DRIVER} 42 | mosquitto: 43 | driver: ${VOLUMES_DRIVER} 44 | 45 | services: 46 | 47 | ### Workspace Utilities ################################## 48 | workspace: 49 | build: 50 | context: ./workspace 51 | args: 52 | - LARADOCK_PHP_VERSION=${PHP_VERSION} 53 | - LARADOCK_PHALCON_VERSION=${PHALCON_VERSION} 54 | - INSTALL_SUBVERSION=${WORKSPACE_INSTALL_SUBVERSION} 55 | - INSTALL_XDEBUG=${WORKSPACE_INSTALL_XDEBUG} 56 | - INSTALL_PHPDBG=${WORKSPACE_INSTALL_PHPDBG} 57 | - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE} 58 | - INSTALL_SSH2=${WORKSPACE_INSTALL_SSH2} 59 | - INSTALL_GMP=${WORKSPACE_INSTALL_GMP} 60 | - INSTALL_SOAP=${WORKSPACE_INSTALL_SOAP} 61 | - INSTALL_XSL=${WORKSPACE_INSTALL_XSL} 62 | - INSTALL_LDAP=${WORKSPACE_INSTALL_LDAP} 63 | - INSTALL_IMAP=${WORKSPACE_INSTALL_IMAP} 64 | - INSTALL_MONGO=${WORKSPACE_INSTALL_MONGO} 65 | - INSTALL_AMQP=${WORKSPACE_INSTALL_AMQP} 66 | - INSTALL_PHPREDIS=${WORKSPACE_INSTALL_PHPREDIS} 67 | - INSTALL_MSSQL=${WORKSPACE_INSTALL_MSSQL} 68 | - INSTALL_NODE=${WORKSPACE_INSTALL_NODE} 69 | - NPM_REGISTRY=${WORKSPACE_NPM_REGISTRY} 70 | - INSTALL_YARN=${WORKSPACE_INSTALL_YARN} 71 | - INSTALL_NPM_GULP=${WORKSPACE_INSTALL_NPM_GULP} 72 | - INSTALL_NPM_BOWER=${WORKSPACE_INSTALL_NPM_BOWER} 73 | - INSTALL_NPM_VUE_CLI=${WORKSPACE_INSTALL_NPM_VUE_CLI} 74 | - INSTALL_NPM_ANGULAR_CLI=${WORKSPACE_INSTALL_NPM_ANGULAR_CLI} 75 | - INSTALL_DRUSH=${WORKSPACE_INSTALL_DRUSH} 76 | - INSTALL_WP_CLI=${WORKSPACE_INSTALL_WP_CLI} 77 | - INSTALL_DRUPAL_CONSOLE=${WORKSPACE_INSTALL_DRUPAL_CONSOLE} 78 | - INSTALL_AEROSPIKE=${WORKSPACE_INSTALL_AEROSPIKE} 79 | - INSTALL_V8JS=${WORKSPACE_INSTALL_V8JS} 80 | - COMPOSER_GLOBAL_INSTALL=${WORKSPACE_COMPOSER_GLOBAL_INSTALL} 81 | - COMPOSER_AUTH=${WORKSPACE_COMPOSER_AUTH} 82 | - COMPOSER_REPO_PACKAGIST=${WORKSPACE_COMPOSER_REPO_PACKAGIST} 83 | - INSTALL_WORKSPACE_SSH=${WORKSPACE_INSTALL_WORKSPACE_SSH} 84 | - INSTALL_LARAVEL_ENVOY=${WORKSPACE_INSTALL_LARAVEL_ENVOY} 85 | - INSTALL_LARAVEL_INSTALLER=${WORKSPACE_INSTALL_LARAVEL_INSTALLER} 86 | - INSTALL_DEPLOYER=${WORKSPACE_INSTALL_DEPLOYER} 87 | - INSTALL_PRESTISSIMO=${WORKSPACE_INSTALL_PRESTISSIMO} 88 | - INSTALL_LINUXBREW=${WORKSPACE_INSTALL_LINUXBREW} 89 | - INSTALL_MC=${WORKSPACE_INSTALL_MC} 90 | - INSTALL_SYMFONY=${WORKSPACE_INSTALL_SYMFONY} 91 | - INSTALL_PYTHON=${WORKSPACE_INSTALL_PYTHON} 92 | - INSTALL_IMAGE_OPTIMIZERS=${WORKSPACE_INSTALL_IMAGE_OPTIMIZERS} 93 | - INSTALL_IMAGEMAGICK=${WORKSPACE_INSTALL_IMAGEMAGICK} 94 | - INSTALL_TERRAFORM=${WORKSPACE_INSTALL_TERRAFORM} 95 | - INSTALL_DUSK_DEPS=${WORKSPACE_INSTALL_DUSK_DEPS} 96 | - INSTALL_PG_CLIENT=${WORKSPACE_INSTALL_PG_CLIENT} 97 | - INSTALL_PHALCON=${WORKSPACE_INSTALL_PHALCON} 98 | - INSTALL_SWOOLE=${WORKSPACE_INSTALL_SWOOLE} 99 | - INSTALL_LIBPNG=${WORKSPACE_INSTALL_LIBPNG} 100 | - INSTALL_IONCUBE=${WORKSPACE_INSTALL_IONCUBE} 101 | - INSTALL_MYSQL_CLIENT=${WORKSPACE_INSTALL_MYSQL_CLIENT} 102 | - PUID=${WORKSPACE_PUID} 103 | - PGID=${WORKSPACE_PGID} 104 | - CHROME_DRIVER_VERSION=${WORKSPACE_CHROME_DRIVER_VERSION} 105 | - NODE_VERSION=${WORKSPACE_NODE_VERSION} 106 | - YARN_VERSION=${WORKSPACE_YARN_VERSION} 107 | - DRUSH_VERSION=${WORKSPACE_DRUSH_VERSION} 108 | - TZ=${WORKSPACE_TIMEZONE} 109 | - BLACKFIRE_CLIENT_ID=${BLACKFIRE_CLIENT_ID} 110 | - BLACKFIRE_CLIENT_TOKEN=${BLACKFIRE_CLIENT_TOKEN} 111 | - INSTALL_POWERLINE=${WORKSPACE_INSTALL_POWERLINE} 112 | volumes: 113 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 114 | extra_hosts: 115 | - "dockerhost:${DOCKER_HOST_IP}" 116 | ports: 117 | - "${WORKSPACE_SSH_PORT}:22" 118 | tty: true 119 | environment: 120 | - PHP_IDE_CONFIG=${PHP_IDE_CONFIG} 121 | - DOCKER_HOST=tcp://docker-in-docker:2375 122 | networks: 123 | - frontend 124 | - backend 125 | links: 126 | - docker-in-docker 127 | 128 | ### PHP-FPM ############################################## 129 | php-fpm: 130 | build: 131 | context: ./php-fpm 132 | args: 133 | - LARADOCK_PHP_VERSION=${PHP_VERSION} 134 | - LARADOCK_PHALCON_VERSION=${PHALCON_VERSION} 135 | - INSTALL_XDEBUG=${PHP_FPM_INSTALL_XDEBUG} 136 | - INSTALL_PHPDBG=${PHP_FPM_INSTALL_PHPDBG} 137 | - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE} 138 | - INSTALL_SSH2=${PHP_FPM_INSTALL_SSH2} 139 | - INSTALL_SOAP=${PHP_FPM_INSTALL_SOAP} 140 | - INSTALL_XSL=${PHP_FPM_INSTALL_XSL} 141 | - INSTALL_IMAP=${PHP_FPM_INSTALL_IMAP} 142 | - INSTALL_MONGO=${PHP_FPM_INSTALL_MONGO} 143 | - INSTALL_AMQP=${PHP_FPM_INSTALL_AMQP} 144 | - INSTALL_MSSQL=${PHP_FPM_INSTALL_MSSQL} 145 | - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} 146 | - INSTALL_GMP=${PHP_FPM_INSTALL_GMP} 147 | - INSTALL_PHPREDIS=${PHP_FPM_INSTALL_PHPREDIS} 148 | - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED} 149 | - INSTALL_OPCACHE=${PHP_FPM_INSTALL_OPCACHE} 150 | - INSTALL_EXIF=${PHP_FPM_INSTALL_EXIF} 151 | - INSTALL_AEROSPIKE=${PHP_FPM_INSTALL_AEROSPIKE} 152 | - INSTALL_MYSQLI=${PHP_FPM_INSTALL_MYSQLI} 153 | - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL} 154 | - INSTALL_PG_CLIENT=${PHP_FPM_INSTALL_PG_CLIENT} 155 | - INSTALL_INTL=${PHP_FPM_INSTALL_INTL} 156 | - INSTALL_GHOSTSCRIPT=${PHP_FPM_INSTALL_GHOSTSCRIPT} 157 | - INSTALL_LDAP=${PHP_FPM_INSTALL_LDAP} 158 | - INSTALL_PHALCON=${PHP_FPM_INSTALL_PHALCON} 159 | - INSTALL_SWOOLE=${PHP_FPM_INSTALL_SWOOLE} 160 | - INSTALL_IMAGE_OPTIMIZERS=${PHP_FPM_INSTALL_IMAGE_OPTIMIZERS} 161 | - INSTALL_IMAGEMAGICK=${PHP_FPM_INSTALL_IMAGEMAGICK} 162 | - INSTALL_CALENDAR=${PHP_FPM_INSTALL_CALENDAR} 163 | - INSTALL_FAKETIME=${PHP_FPM_INSTALL_FAKETIME} 164 | - INSTALL_IONCUBE=${PHP_FPM_INSTALL_IONCUBE} 165 | - INSTALL_APCU=${PHP_FPM_INSTALL_APCU} 166 | - INSTALL_YAML=${PHP_FPM_INSTALL_YAML} 167 | - INSTALL_ADDITIONAL_LOCALES=${PHP_FPM_INSTALL_ADDITIONAL_LOCALES} 168 | - INSTALL_MYSQL_CLIENT=${PHP_FPM_INSTALL_MYSQL_CLIENT} 169 | - ADDITIONAL_LOCALES=${PHP_FPM_ADDITIONAL_LOCALES} 170 | volumes: 171 | - ./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini 172 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 173 | expose: 174 | - "9000" 175 | extra_hosts: 176 | - "dockerhost:${DOCKER_HOST_IP}" 177 | environment: 178 | - PHP_IDE_CONFIG=${PHP_IDE_CONFIG} 179 | - DOCKER_HOST=tcp://docker-in-docker:2375 180 | - FAKETIME=${PHP_FPM_FAKETIME} 181 | depends_on: 182 | - workspace 183 | networks: 184 | - backend 185 | links: 186 | - docker-in-docker 187 | 188 | ### PHP Worker ############################################ 189 | php-worker: 190 | build: 191 | context: ./php-worker 192 | args: 193 | - PHP_VERSION=${PHP_VERSION} 194 | - PHALCON_VERSION=${PHALCON_VERSION} 195 | - INSTALL_PGSQL=${PHP_WORKER_INSTALL_PGSQL} 196 | - INSTALL_BCMATH=${PHP_WORKER_INSTALL_BCMATH} 197 | - INSTALL_PHALCON=${PHP_WORKER_INSTALL_PHALCON} 198 | - INSTALL_SOAP=${PHP_WORKER_INSTALL_SOAP} 199 | - INSTALL_ZIP_ARCHIVE=${PHP_WORKER_INSTALL_ZIP_ARCHIVE} 200 | - INSTALL_MYSQL_CLIENT=${PHP_WORKER_INSTALL_MYSQL_CLIENT} 201 | - INSTALL_AMQP=${PHP_WORKER_INSTALL_AMQP} 202 | - INSTALL_GHOSTSCRIPT=${PHP_WORKER_INSTALL_GHOSTSCRIPT} 203 | - INSTALL_SWOOLE=${PHP_WORKER_INSTALL_SWOOLE} 204 | - PUID=${PHP_WORKER_PUID} 205 | - PGID=${PHP_WORKER_PGID} 206 | volumes: 207 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 208 | - ./php-worker/supervisord.d:/etc/supervisord.d 209 | depends_on: 210 | - workspace 211 | extra_hosts: 212 | - "dockerhost:${DOCKER_HOST_IP}" 213 | networks: 214 | - backend 215 | ### Laravel Horizon ############################################ 216 | laravel-horizon: 217 | build: 218 | context: ./laravel-horizon 219 | args: 220 | - PHP_VERSION=${PHP_VERSION} 221 | - INSTALL_PGSQL=${PHP_FPM_INSTALL_PGSQL} 222 | - INSTALL_BCMATH=${PHP_FPM_INSTALL_BCMATH} 223 | - INSTALL_MEMCACHED=${PHP_FPM_INSTALL_MEMCACHED} 224 | volumes: 225 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} 226 | - ./laravel-horizon/supervisord.d:/etc/supervisord.d 227 | depends_on: 228 | - workspace 229 | extra_hosts: 230 | - "dockerhost:${DOCKER_HOST_IP}" 231 | networks: 232 | - backend 233 | 234 | ### NGINX Server ######################################### 235 | nginx: 236 | build: 237 | context: ./nginx 238 | args: 239 | - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER} 240 | - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT} 241 | - CHANGE_SOURCE=${CHANGE_SOURCE} 242 | volumes: 243 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 244 | - ${NGINX_HOST_LOG_PATH}:/var/log/nginx 245 | - ${NGINX_SITES_PATH}:/etc/nginx/sites-available 246 | - ${NGINX_SSL_PATH}:/etc/nginx/ssl 247 | ports: 248 | - "${NGINX_HOST_HTTP_PORT}:80" 249 | - "81:81" 250 | - "82:82" 251 | - "${NGINX_HOST_HTTPS_PORT}:443" 252 | - "444:444" 253 | - "446:446" 254 | depends_on: 255 | - php-fpm 256 | networks: 257 | - frontend 258 | - backend 259 | 260 | ### Blackfire ######################################## 261 | blackfire: 262 | image: blackfire/blackfire 263 | environment: 264 | - BLACKFIRE_SERVER_ID=${BLACKFIRE_SERVER_ID} 265 | - BLACKFIRE_SERVER_TOKEN=${BLACKFIRE_SERVER_TOKEN} 266 | depends_on: 267 | - php-fpm 268 | networks: 269 | - backend 270 | 271 | ### Apache Server ######################################## 272 | apache2: 273 | build: 274 | context: ./apache2 275 | args: 276 | - PHP_UPSTREAM_CONTAINER=${APACHE_PHP_UPSTREAM_CONTAINER} 277 | - PHP_UPSTREAM_PORT=${APACHE_PHP_UPSTREAM_PORT} 278 | - PHP_UPSTREAM_TIMEOUT=${APACHE_PHP_UPSTREAM_TIMEOUT} 279 | - DOCUMENT_ROOT=${APACHE_DOCUMENT_ROOT} 280 | volumes: 281 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 282 | - ${APACHE_HOST_LOG_PATH}:/var/log/apache2 283 | - ${APACHE_SITES_PATH}:/etc/apache2/sites-available 284 | ports: 285 | - "${APACHE_HOST_HTTP_PORT}:80" 286 | - "${APACHE_HOST_HTTPS_PORT}:443" 287 | depends_on: 288 | - php-fpm 289 | networks: 290 | - frontend 291 | - backend 292 | 293 | ### HHVM ################################################# 294 | hhvm: 295 | build: ./hhvm 296 | volumes: 297 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 298 | expose: 299 | - "9000" 300 | depends_on: 301 | - workspace 302 | networks: 303 | - frontend 304 | - backend 305 | 306 | ### Minio ################################################ 307 | minio: 308 | build: ./minio 309 | volumes: 310 | - ${DATA_PATH_HOST}/minio/data:/export 311 | - ${DATA_PATH_HOST}/minio/config:/root/.minio 312 | ports: 313 | - "${MINIO_PORT}:9000" 314 | environment: 315 | - MINIO_ACCESS_KEY=access 316 | - MINIO_SECRET_KEY=secretkey 317 | networks: 318 | - frontend 319 | - backend 320 | 321 | ### MySQL ################################################ 322 | mysql: 323 | build: 324 | context: ./mysql 325 | args: 326 | - MYSQL_VERSION=${MYSQL_VERSION} 327 | environment: 328 | - MYSQL_DATABASE=${MYSQL_DATABASE} 329 | - MYSQL_USER=${MYSQL_USER} 330 | - MYSQL_PASSWORD=${MYSQL_PASSWORD} 331 | - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} 332 | - TZ=${WORKSPACE_TIMEZONE} 333 | volumes: 334 | - ${DATA_PATH_HOST}/mysql:/var/lib/mysql 335 | - ${MYSQL_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d 336 | ports: 337 | - "${MYSQL_PORT}:3306" 338 | networks: 339 | - backend 340 | 341 | ### Percona ################################################ 342 | percona: 343 | build: 344 | context: ./percona 345 | environment: 346 | - MYSQL_DATABASE=${PERCONA_DATABASE} 347 | - MYSQL_USER=${PERCONA_USER} 348 | - MYSQL_PASSWORD=${PERCONA_PASSWORD} 349 | - MYSQL_ROOT_PASSWORD=${PERCONA_ROOT_PASSWORD} 350 | volumes: 351 | - ${DATA_PATH_HOST}/percona:/var/lib/mysql 352 | - ${PERCONA_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d 353 | ports: 354 | - "${PERCONA_PORT}:3306" 355 | networks: 356 | - backend 357 | 358 | ### MSSQL ################################################ 359 | mssql: 360 | build: 361 | context: ./mssql 362 | environment: 363 | - MSSQL_DATABASE=${MSSQL_DATABASE} 364 | - SA_PASSWORD=${MSSQL_PASSWORD} 365 | - ACCEPT_EULA=Y 366 | volumes: 367 | - ${DATA_PATH_HOST}/mssql:/var/opt/mssql 368 | ports: 369 | - "${MSSQL_PORT}:1433" 370 | networks: 371 | - backend 372 | 373 | ### MariaDB ############################################## 374 | mariadb: 375 | build: ./mariadb 376 | volumes: 377 | - ${DATA_PATH_HOST}/mariadb:/var/lib/mysql 378 | - ${MARIADB_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d 379 | ports: 380 | - "${MARIADB_PORT}:3306" 381 | environment: 382 | - MYSQL_DATABASE=${MARIADB_DATABASE} 383 | - MYSQL_USER=${MARIADB_USER} 384 | - MYSQL_PASSWORD=${MARIADB_PASSWORD} 385 | - MYSQL_ROOT_PASSWORD=${MARIADB_ROOT_PASSWORD} 386 | networks: 387 | - backend 388 | 389 | ### PostgreSQL ########################################### 390 | postgres: 391 | build: ./postgres 392 | volumes: 393 | - ${DATA_PATH_HOST}/postgres:/var/lib/postgresql/data 394 | - ${POSTGRES_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d 395 | ports: 396 | - "${POSTGRES_PORT}:5432" 397 | environment: 398 | - POSTGRES_DB=${POSTGRES_DB} 399 | - POSTGRES_USER=${POSTGRES_USER} 400 | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 401 | - GITLAB_POSTGRES_INIT=${GITLAB_POSTGRES_INIT} 402 | - GITLAB_POSTGRES_USER=${GITLAB_POSTGRES_USER} 403 | - GITLAB_POSTGRES_PASSWORD=${GITLAB_POSTGRES_PASSWORD} 404 | - GITLAB_POSTGRES_DB=${GITLAB_POSTGRES_DB} 405 | - JUPYTERHUB_POSTGRES_INIT=${JUPYTERHUB_POSTGRES_INIT} 406 | - JUPYTERHUB_POSTGRES_USER=${JUPYTERHUB_POSTGRES_USER} 407 | - JUPYTERHUB_POSTGRES_PASSWORD=${JUPYTERHUB_POSTGRES_PASSWORD} 408 | - JUPYTERHUB_POSTGRES_DB=${JUPYTERHUB_POSTGRES_DB} 409 | networks: 410 | - backend 411 | 412 | ### PostgreSQL PostGis ################################### 413 | postgres-postgis: 414 | build: ./postgres-postgis 415 | volumes: 416 | - ${DATA_PATH_HOST}/postgres:/var/lib/postgresql/data 417 | ports: 418 | - "${POSTGRES_PORT}:5432" 419 | environment: 420 | - POSTGRES_DB=${POSTGRES_DB} 421 | - POSTGRES_USER=${POSTGRES_USER} 422 | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 423 | networks: 424 | - backend 425 | 426 | ### Neo4j ################################################ 427 | neo4j: 428 | build: ./neo4j 429 | ports: 430 | - "7474:7474" 431 | - "1337:1337" 432 | environment: 433 | - NEO4J_AUTH=default:secret 434 | volumes: 435 | - ${DATA_PATH_HOST}/neo4j:/var/lib/neo4j/data 436 | networks: 437 | - backend 438 | 439 | ### MongoDB ############################################## 440 | mongo: 441 | build: ./mongo 442 | ports: 443 | - "${MONGODB_PORT}:27017" 444 | volumes: 445 | - ${DATA_PATH_HOST}/mongo:/data/db 446 | networks: 447 | - backend 448 | 449 | ### RethinkDB ############################################## 450 | rethinkdb: 451 | build: ./rethinkdb 452 | ports: 453 | - "${RETHINKDB_PORT}:8080" 454 | volumes: 455 | - ${DATA_PATH_HOST}/rethinkdb:/data/rethinkdb_data 456 | networks: 457 | - backend 458 | 459 | ### Redis ################################################ 460 | redis: 461 | build: ./redis 462 | volumes: 463 | - ${DATA_PATH_HOST}/redis:/data 464 | ports: 465 | - "${REDIS_PORT}:6379" 466 | networks: 467 | - backend 468 | 469 | ### Redis Cluster ########################################## 470 | redis-cluster: 471 | build: ./redis-cluster 472 | ports: 473 | - "${REDIS_CLUSTER_PORT_RANGE}:7000-7005" 474 | networks: 475 | - backend 476 | 477 | ### ZooKeeper ######################################### 478 | zookeeper: 479 | build: ./zookeeper 480 | volumes: 481 | - ${DATA_PATH_HOST}/zookeeper/data:/data 482 | - ${DATA_PATH_HOST}/zookeeper/datalog:/datalog 483 | ports: 484 | - "${ZOOKEEPER_PORT}:2181" 485 | networks: 486 | - backend 487 | 488 | ### Aerospike ########################################## 489 | aerospike: 490 | build: ./aerospike 491 | volumes: 492 | - workspace 493 | - ${DATA_PATH_HOST}/aerospike:/opt/aerospike/data 494 | ports: 495 | - "${AEROSPIKE_SERVICE_PORT}:3000" 496 | - "${AEROSPIKE_FABRIC_PORT}:3001" 497 | - "${AEROSPIKE_HEARTBEAT_PORT}:3002" 498 | - "${AEROSPIKE_INFO_PORT}:3003" 499 | networks: 500 | - backend 501 | 502 | ### Memcached ############################################ 503 | memcached: 504 | build: ./memcached 505 | volumes: 506 | - ${DATA_PATH_HOST}/memcached:/var/lib/memcached 507 | ports: 508 | - "${MEMCACHED_HOST_PORT}:11211" 509 | depends_on: 510 | - php-fpm 511 | networks: 512 | - backend 513 | 514 | ### Beanstalkd ########################################### 515 | beanstalkd: 516 | build: ./beanstalkd 517 | ports: 518 | - "${BEANSTALKD_HOST_PORT}:11300" 519 | privileged: true 520 | depends_on: 521 | - php-fpm 522 | networks: 523 | - backend 524 | 525 | ### RabbitMQ ############################################# 526 | rabbitmq: 527 | build: ./rabbitmq 528 | ports: 529 | - "${RABBITMQ_NODE_HOST_PORT}:5672" 530 | - "${RABBITMQ_MANAGEMENT_HTTP_HOST_PORT}:15672" 531 | - "${RABBITMQ_MANAGEMENT_HTTPS_HOST_PORT}:15671" 532 | privileged: true 533 | environment: 534 | - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER} 535 | - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS} 536 | hostname: laradock-rabbitmq 537 | volumes: 538 | - ${DATA_PATH_HOST}/rabbitmq:/var/lib/rabbitmq 539 | depends_on: 540 | - php-fpm 541 | networks: 542 | - backend 543 | 544 | ### Beanstalkd Console ################################### 545 | beanstalkd-console: 546 | build: ./beanstalkd-console 547 | ports: 548 | - "${BEANSTALKD_CONSOLE_HOST_PORT}:2080" 549 | depends_on: 550 | - beanstalkd 551 | networks: 552 | - backend 553 | 554 | ### Caddy Server ######################################### 555 | caddy: 556 | build: ./caddy 557 | volumes: 558 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 559 | - ${CADDY_CONFIG_PATH}:/etc/caddy 560 | - ${CADDY_HOST_LOG_PATH}:/var/log/caddy 561 | - ${DATA_PATH_HOST}:/root/.caddy 562 | ports: 563 | - "${CADDY_HOST_HTTP_PORT}:80" 564 | - "${CADDY_HOST_HTTPS_PORT}:443" 565 | depends_on: 566 | - php-fpm 567 | networks: 568 | - frontend 569 | - backend 570 | 571 | ### phpMyAdmin ########################################### 572 | phpmyadmin: 573 | build: ./phpmyadmin 574 | environment: 575 | - PMA_ARBITRARY=1 576 | - MYSQL_USER=${PMA_USER} 577 | - MYSQL_PASSWORD=${PMA_PASSWORD} 578 | - MYSQL_ROOT_PASSWORD=${PMA_ROOT_PASSWORD} 579 | ports: 580 | - "${PMA_PORT}:80" 581 | depends_on: 582 | - "${PMA_DB_ENGINE}" 583 | networks: 584 | - frontend 585 | - backend 586 | 587 | ### Adminer ########################################### 588 | adminer: 589 | build: 590 | context: ./adminer 591 | args: 592 | - INSTALL_MSSQL=${ADM_INSTALL_MSSQL} 593 | ports: 594 | - "${ADM_PORT}:8080" 595 | depends_on: 596 | - php-fpm 597 | networks: 598 | - frontend 599 | - backend 600 | 601 | ### pgAdmin ############################################## 602 | pgadmin: 603 | container_name: pgadmin 604 | image: dpage/pgadmin4:latest 605 | environment: 606 | - "PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}" 607 | - "PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}" 608 | ports: 609 | - "${PGADMIN_PORT}:80" 610 | volumes: 611 | - ${DATA_PATH_HOST}/pgadmin:/var/lib/pgadmin 612 | depends_on: 613 | - postgres 614 | networks: 615 | - frontend 616 | - backend 617 | 618 | ### ElasticSearch ######################################## 619 | elasticsearch: 620 | build: ./elasticsearch 621 | volumes: 622 | - elasticsearch:/usr/share/elasticsearch/data 623 | environment: 624 | - cluster.name=laradock-cluster 625 | - bootstrap.memory_lock=true 626 | - "ES_JAVA_OPTS=-Xms512m -Xmx512m" 627 | ulimits: 628 | memlock: 629 | soft: -1 630 | hard: -1 631 | ports: 632 | - "${ELASTICSEARCH_HOST_HTTP_PORT}:9200" 633 | - "${ELASTICSEARCH_HOST_TRANSPORT_PORT}:9300" 634 | depends_on: 635 | - php-fpm 636 | networks: 637 | - frontend 638 | - backend 639 | 640 | ### Logstash ############################################## 641 | logstash: 642 | build: ./logstash 643 | volumes: 644 | - './logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml' 645 | - './logstash/pipeline:/usr/share/logstash/pipeline' 646 | ports: 647 | - '5001:5001' 648 | environment: 649 | LS_JAVA_OPTS: '-Xmx1g -Xms1g' 650 | env_file: 651 | - .env 652 | networks: 653 | - frontend 654 | - backend 655 | depends_on: 656 | - elasticsearch 657 | 658 | ### Kibana ############################################## 659 | kibana: 660 | build: ./kibana 661 | ports: 662 | - "${KIBANA_HTTP_PORT}:5601" 663 | depends_on: 664 | - elasticsearch 665 | networks: 666 | - frontend 667 | - backend 668 | 669 | ### Certbot ######################################### 670 | certbot: 671 | build: 672 | context: ./certbot 673 | volumes: 674 | - ./data/certbot/certs/:/var/certs 675 | - ./certbot/letsencrypt/:/var/www/letsencrypt 676 | environment: 677 | - CN="fake.domain.com" 678 | - EMAIL="fake.email@gmail.com" 679 | networks: 680 | - frontend 681 | 682 | ### Mailhog ################################################ 683 | mailhog: 684 | build: ./mailhog 685 | ports: 686 | - "1025:1025" 687 | - "8025:8025" 688 | networks: 689 | - frontend 690 | - backend 691 | 692 | ### MailDev ############################################## 693 | maildev: 694 | build: ./maildev 695 | ports: 696 | - "${MAILDEV_HTTP_PORT}:80" 697 | - "${MAILDEV_SMTP_PORT}:25" 698 | networks: 699 | - frontend 700 | - backend 701 | 702 | ### Selenium ############################################### 703 | selenium: 704 | build: ./selenium 705 | ports: 706 | - "${SELENIUM_PORT}:4444" 707 | volumes: 708 | - /dev/shm:/dev/shm 709 | networks: 710 | - frontend 711 | 712 | ### Varnish ########################################## 713 | proxy: 714 | build: ./varnish 715 | expose: 716 | - ${VARNISH_PORT} 717 | environment: 718 | - VARNISH_CONFIG=${VARNISH_CONFIG} 719 | - CACHE_SIZE=${VARNISH_PROXY1_CACHE_SIZE} 720 | - VARNISHD_PARAMS=${VARNISHD_PARAMS} 721 | - VARNISH_PORT=${VARNISH_PORT} 722 | - BACKEND_HOST=${VARNISH_PROXY1_BACKEND_HOST} 723 | - BACKEND_PORT=${VARNISH_BACKEND_PORT} 724 | - VARNISH_SERVER=${VARNISH_PROXY1_SERVER} 725 | links: 726 | - workspace 727 | networks: 728 | - frontend 729 | 730 | proxy2: 731 | build: ./varnish 732 | expose: 733 | - ${VARNISH_PORT} 734 | environment: 735 | - VARNISH_CONFIG=${VARNISH_CONFIG} 736 | - CACHE_SIZE=${VARNISH_PROXY2_CACHE_SIZE} 737 | - VARNISHD_PARAMS=${VARNISHD_PARAMS} 738 | - VARNISH_PORT=${VARNISH_PORT} 739 | - BACKEND_HOST=${VARNISH_PROXY2_BACKEND_HOST} 740 | - BACKEND_PORT=${VARNISH_BACKEND_PORT} 741 | - VARNISH_SERVER=${VARNISH_PROXY2_SERVER} 742 | links: 743 | - workspace 744 | networks: 745 | - frontend 746 | 747 | ### HAProxy #################################### 748 | haproxy: 749 | build: ./haproxy 750 | ports: 751 | - "${HAPROXY_HOST_HTTP_PORT}:8085" 752 | volumes: 753 | - /var/run/docker.sock:/var/run/docker.sock 754 | links: 755 | - proxy 756 | - proxy2 757 | 758 | ### Jenkins ################################################### 759 | jenkins: 760 | build: ./jenkins 761 | environment: 762 | JAVA_OPTS: "-Djava.awt.headless=true" 763 | ports: 764 | - "${JENKINS_HOST_SLAVE_AGENT_PORT}:50000" 765 | - "${JENKINS_HOST_HTTP_PORT}:8080" 766 | privileged: true 767 | volumes: 768 | - ${JENKINS_HOME}:/var/jenkins_home 769 | - /var/run/docker.sock:/var/run/docker.sock 770 | networks: 771 | - frontend 772 | - backend 773 | 774 | ### Grafana ################################################ 775 | grafana: 776 | build: 777 | context: ./grafana 778 | volumes: 779 | - ${DATA_PATH_HOST}/grafana:/var/lib/grafana 780 | ports: 781 | - "${GRAFANA_PORT}:3000" 782 | networks: 783 | - backend 784 | 785 | ### Laravel Echo Server ####################################### 786 | laravel-echo-server: 787 | build: 788 | context: ./laravel-echo-server 789 | volumes: 790 | - ./laravel-echo-server/laravel-echo-server.json:/app/laravel-echo-server.json:ro 791 | ports: 792 | - "${LARAVEL_ECHO_SERVER_PORT}:6001" 793 | links: 794 | - redis 795 | networks: 796 | - frontend 797 | - backend 798 | 799 | ### Solr ################################################ 800 | solr: 801 | build: 802 | context: ./solr 803 | args: 804 | - SOLR_VERSION=${SOLR_VERSION} 805 | - SOLR_DATAIMPORTHANDLER_MYSQL=${SOLR_DATAIMPORTHANDLER_MYSQL} 806 | - SOLR_DATAIMPORTHANDLER_MSSQL=${SOLR_DATAIMPORTHANDLER_MSSQL} 807 | volumes: 808 | - ${DATA_PATH_HOST}/solr:/opt/solr/server/solr/mycores 809 | ports: 810 | - "${SOLR_PORT}:8983" 811 | networks: 812 | - backend 813 | 814 | ### Thumbor ######################################### 815 | thumbor: 816 | build: ./thumbor 817 | volumes: 818 | - ${DATA_PATH_HOST}/thumbor/data:/data 819 | - ${DATA_PATH_HOST}/thumbor/data:/logs 820 | ports: 821 | - "${THUMBOR_PORT}:8000" 822 | environment: 823 | - THUMBOR_LOG_FORMAT=${THUMBOR_LOG_FORMAT} 824 | - THUMBOR_LOG_DATE_FORMAT=${THUMBOR_LOG_DATE_FORMAT} 825 | - MAX_WIDTH=${MAX_WIDTH} 826 | - MAX_HEIGHT=${MAX_HEIGHT} 827 | - MIN_WIDTH=${MIN_WIDTH} 828 | - MIN_HEIGHT=${MIN_HEIGHT} 829 | - ALLOWED_SOURCES=${ALLOWED_SOURCES} 830 | - QUALITY=${QUALITY} 831 | - WEBP_QUALITY=${WEBP_QUALITY} 832 | - PNG_COMPRESSION_LEVEL=${PNG_COMPRESSION_LEVEL} 833 | - AUTO_WEBP=${AUTO_WEBP} 834 | - MAX_AGE=${MAX_AGE} 835 | - MAX_AGE_TEMP_IMAGE=${MAX_AGE_TEMP_IMAGE} 836 | - RESPECT_ORIENTATION=${RESPECT_ORIENTATION} 837 | - IGNORE_SMART_ERRORS=${IGNORE_SMART_ERRORS} 838 | - PRESERVE_EXIF_INFO=${PRESERVE_EXIF_INFO} 839 | - ALLOW_ANIMATED_GIFS=${ALLOW_ANIMATED_GIFS} 840 | - USE_GIFSICLE_ENGINE=${USE_GIFSICLE_ENGINE} 841 | - USE_BLACKLIST=${USE_BLACKLIST} 842 | - LOADER=${LOADER} 843 | - STORAGE=${STORAGE} 844 | - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} 845 | - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} 846 | - RESULT_STORAGE=${RESULT_STORAGE} 847 | - ENGINE=${ENGINE} 848 | - SECURITY_KEY=${SECURITY_KEY} 849 | - ALLOW_UNSAFE_URL=${ALLOW_UNSAFE_URL} 850 | - ALLOW_OLD_URLS=${ALLOW_OLD_URLS} 851 | - FILE_LOADER_ROOT_PATH=${FILE_LOADER_ROOT_PATH} 852 | - HTTP_LOADER_CONNECT_TIMEOUT=${HTTP_LOADER_CONNECT_TIMEOUT} 853 | - HTTP_LOADER_REQUEST_TIMEOUT=${HTTP_LOADER_REQUEST_TIMEOUT} 854 | - HTTP_LOADER_FOLLOW_REDIRECTS=${HTTP_LOADER_FOLLOW_REDIRECTS} 855 | - HTTP_LOADER_MAX_REDIRECTS=${HTTP_LOADER_MAX_REDIRECTS} 856 | - HTTP_LOADER_FORWARD_USER_AGENT=${HTTP_LOADER_FORWARD_USER_AGENT} 857 | - HTTP_LOADER_DEFAULT_USER_AGENT=${HTTP_LOADER_DEFAULT_USER_AGENT} 858 | - HTTP_LOADER_PROXY_HOST=${HTTP_LOADER_PROXY_HOST} 859 | - HTTP_LOADER_PROXY_PORT=${HTTP_LOADER_PROXY_PORT} 860 | - HTTP_LOADER_PROXY_USERNAME=${HTTP_LOADER_PROXY_USERNAME} 861 | - HTTP_LOADER_PROXY_PASSWORD=${HTTP_LOADER_PROXY_PASSWORD} 862 | - HTTP_LOADER_CA_CERTS=${HTTP_LOADER_CA_CERTS} 863 | - HTTP_LOADER_VALIDATE_CERTS=${HTTP_LOADER_VALIDATE_CERTS} 864 | - HTTP_LOADER_CLIENT_KEY=${HTTP_LOADER_CLIENT_KEY} 865 | - HTTP_LOADER_CLIENT_CERT=${HTTP_LOADER_CLIENT_CERT} 866 | - HTTP_LOADER_CURL_ASYNC_HTTP_CLIENT=${HTTP_LOADER_CURL_ASYNC_HTTP_CLIENT} 867 | - STORAGE_EXPIRATION_SECONDS=${STORAGE_EXPIRATION_SECONDS} 868 | - STORES_CRYPTO_KEY_FOR_EACH_IMAGE=${STORES_CRYPTO_KEY_FOR_EACH_IMAGE} 869 | - FILE_STORAGE_ROOT_PATH=${FILE_STORAGE_ROOT_PATH} 870 | - UPLOAD_MAX_SIZE=${UPLOAD_MAX_SIZE} 871 | - UPLOAD_ENABLED=${UPLOAD_ENABLED} 872 | - UPLOAD_PHOTO_STORAGE=${UPLOAD_PHOTO_STORAGE} 873 | - UPLOAD_DELETE_ALLOWED=${UPLOAD_DELETE_ALLOWED} 874 | - UPLOAD_PUT_ALLOWED=${UPLOAD_PUT_ALLOWED} 875 | - UPLOAD_DEFAULT_FILENAME=${UPLOAD_DEFAULT_FILENAME} 876 | - MONGO_STORAGE_SERVER_HOST=${MONGO_STORAGE_SERVER_HOST} 877 | - MONGO_STORAGE_SERVER_PORT=${MONGO_STORAGE_SERVER_PORT} 878 | - MONGO_STORAGE_SERVER_DB=${MONGO_STORAGE_SERVER_DB} 879 | - MONGO_STORAGE_SERVER_COLLECTION=${MONGO_STORAGE_SERVER_COLLECTION} 880 | - REDIS_STORAGE_SERVER_HOST=${REDIS_STORAGE_SERVER_HOST} 881 | - REDIS_STORAGE_SERVER_PORT=${REDIS_STORAGE_SERVER_PORT} 882 | - REDIS_STORAGE_SERVER_DB=${REDIS_STORAGE_SERVER_DB} 883 | - REDIS_STORAGE_SERVER_PASSWORD=${REDIS_STORAGE_SERVER_PASSWORD} 884 | - REDIS_RESULT_STORAGE_SERVER_HOST=${REDIS_RESULT_STORAGE_SERVER_HOST} 885 | - REDIS_RESULT_STORAGE_SERVER_PORT=${REDIS_RESULT_STORAGE_SERVER_PORT} 886 | - REDIS_RESULT_STORAGE_SERVER_DB=${REDIS_RESULT_STORAGE_SERVER_DB} 887 | - REDIS_RESULT_STORAGE_SERVER_PASSWORD=${REDIS_RESULT_STORAGE_SERVER_PASSWORD} 888 | - MEMCACHE_STORAGE_SERVERS=${MEMCACHE_STORAGE_SERVERS} 889 | - MIXED_STORAGE_FILE_STORAGE=${MIXED_STORAGE_FILE_STORAGE} 890 | - MIXED_STORAGE_CRYPTO_STORAGE=${MIXED_STORAGE_CRYPTO_STORAGE} 891 | - MIXED_STORAGE_DETECTOR_STORAGE=${MIXED_STORAGE_DETECTOR_STORAGE} 892 | - META_CALLBACK_NAME=${META_CALLBACK_NAME} 893 | - DETECTORS=${DETECTORS} 894 | - FACE_DETECTOR_CASCADE_FILE=${FACE_DETECTOR_CASCADE_FILE} 895 | - OPTIMIZERS=${OPTIMIZERS} 896 | - JPEGTRAN_PATH=${JPEGTRAN_PATH} 897 | - PROGRESSIVE_JPEG=${PROGRESSIVE_JPEG} 898 | - RESULT_STORAGE_EXPIRATION_SECONDS=${RESULT_STORAGE_EXPIRATION_SECONDS} 899 | - RESULT_STORAGE_FILE_STORAGE_ROOT_PATH=${RESULT_STORAGE_FILE_STORAGE_ROOT_PATH} 900 | - RESULT_STORAGE_STORES_UNSAFE=${RESULT_STORAGE_STORES_UNSAFE} 901 | - REDIS_QUEUE_SERVER_HOST=${REDIS_QUEUE_SERVER_HOST} 902 | - REDIS_QUEUE_SERVER_PORT=${REDIS_QUEUE_SERVER_PORT} 903 | - REDIS_QUEUE_SERVER_DB=${REDIS_QUEUE_SERVER_DB} 904 | - REDIS_QUEUE_SERVER_PASSWORD=${REDIS_QUEUE_SERVER_PASSWORD} 905 | - SQS_QUEUE_KEY_ID=${SQS_QUEUE_KEY_ID} 906 | - SQS_QUEUE_KEY_SECRET=${SQS_QUEUE_KEY_SECRET} 907 | - SQS_QUEUE_REGION=${SQS_QUEUE_REGION} 908 | - USE_CUSTOM_ERROR_HANDLING=${USE_CUSTOM_ERROR_HANDLING} 909 | - ERROR_HANDLER_MODULE=${ERROR_HANDLER_MODULE} 910 | - ERROR_FILE_LOGGER=${ERROR_FILE_LOGGER} 911 | - ERROR_FILE_NAME_USE_CONTEXT=${ERROR_FILE_NAME_USE_CONTEXT} 912 | - SENTRY_DSN_URL=${SENTRY_DSN_URL} 913 | - TC_AWS_REGION=${TC_AWS_REGION} 914 | - TC_AWS_ENDPOINT=${TC_AWS_ENDPOINT} 915 | - TC_AWS_STORAGE_BUCKET=${TC_AWS_STORAGE_BUCKET} 916 | - TC_AWS_STORAGE_ROOT_PATH=${TC_AWS_STORAGE_ROOT_PATH} 917 | - TC_AWS_LOADER_BUCKET=${TC_AWS_LOADER_BUCKET} 918 | - TC_AWS_LOADER_ROOT_PATH=${TC_AWS_LOADER_ROOT_PATH} 919 | - TC_AWS_RESULT_STORAGE_BUCKET=${TC_AWS_RESULT_STORAGE_BUCKET} 920 | - TC_AWS_RESULT_STORAGE_ROOT_PATH=${TC_AWS_RESULT_STORAGE_ROOT_PATH} 921 | - TC_AWS_STORAGE_SSE=${TC_AWS_STORAGE_SSE} 922 | - TC_AWS_STORAGE_RRS=${TC_AWS_STORAGE_RRS} 923 | - TC_AWS_ENABLE_HTTP_LOADER=${TC_AWS_ENABLE_HTTP_LOADER} 924 | - TC_AWS_ALLOWED_BUCKETS=${TC_AWS_ALLOWED_BUCKETS} 925 | - TC_AWS_STORE_METADATA=${TC_AWS_STORE_METADATA} 926 | networks: 927 | - frontend 928 | - backend 929 | 930 | ### AWS EB-CLI ################################################ 931 | aws: 932 | build: 933 | context: ./aws 934 | volumes: 935 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} 936 | depends_on: 937 | - workspace 938 | tty: true 939 | 940 | ### Portainer ################################################ 941 | portainer: 942 | build: 943 | context: ./portainer 944 | volumes: 945 | - ${DATA_PATH_HOST}/portainer_data:/data 946 | - /var/run/docker.sock:/var/run/docker.sock 947 | extra_hosts: 948 | - "dockerhost:${DOCKER_HOST_IP}" 949 | ports: 950 | - 9010:9000 951 | networks: 952 | - backend 953 | 954 | ### Gitlab ################################################ 955 | gitlab: 956 | build: 957 | context: ./gitlab 958 | environment: 959 | GITLAB_OMNIBUS_CONFIG: | 960 | external_url '${GITLAB_DOMAIN_NAME}' 961 | redis['enable'] = false 962 | nginx['listen_https'] = false 963 | nginx['listen_port'] = 80 964 | nginx['custom_gitlab_server_config'] = "set_real_ip_from 172.0.0.0/8;\nreal_ip_header X-Real-IP;\nreal_ip_recursive on;" 965 | postgresql['enable'] = false 966 | gitlab_rails['trusted_proxies'] = ['caddy','nginx','apache2'] 967 | gitlab_rails['redis_host'] = 'redis' 968 | gitlab_rails['redis_database'] = 8 969 | gitlab_rails['db_host'] = '${GITLAB_POSTGRES_HOST}' 970 | gitlab_rails['db_username'] = '${GITLAB_POSTGRES_USER}' 971 | gitlab_rails['db_password'] = '${GITLAB_POSTGRES_PASSWORD}' 972 | gitlab_rails['db_database'] = '${GITLAB_POSTGRES_DB}' 973 | gitlab_rails['initial_root_password'] = '${GITLAB_ROOT_PASSWORD}' 974 | gitlab_rails['gitlab_shell_ssh_port'] = ${GITLAB_HOST_SSH_PORT} 975 | volumes: 976 | - ${DATA_PATH_HOST}/gitlab/config:/etc/gitlab 977 | - ${DATA_PATH_HOST}/gitlab/data:/var/opt/gitlab 978 | - ${GITLAB_HOST_LOG_PATH}:/var/log/gitlab 979 | ports: 980 | - "${GITLAB_HOST_HTTP_PORT}:80" 981 | - "${GITLAB_HOST_HTTPS_PORT}:443" 982 | - "${GITLAB_HOST_SSH_PORT}:22" 983 | networks: 984 | - backend 985 | depends_on: 986 | - redis 987 | - postgres 988 | gitlab-runner: 989 | image: gitlab/gitlab-runner:latest 990 | environment: 991 | - CI_SERVER_URL=${GITLAB_CI_SERVER_URL} 992 | - REGISTRATION_TOKEN=${GITLAB_RUNNER_REGISTRATION_TOKEN} 993 | - RUNNER_NAME=${COMPOSE_PROJECT_NAME}-runner 994 | - REGISTER_NON_INTERACTIVE=${GITLAB_REGISTER_NON_INTERACTIVE} 995 | - RUNNER_EXECUTOR=shell 996 | volumes: 997 | - ${DATA_PATH_HOST}/gitlab/runner:/etc/gitlab-runner 998 | - /var/run/docker.sock:/var/run/docker.sock:rw 999 | 1000 | ### JupyterHub ######################################### 1001 | jupyterhub: 1002 | build: 1003 | context: ./jupyterhub 1004 | depends_on: 1005 | - postgres 1006 | - jupyterhub-user 1007 | volumes: 1008 | - /var/run/docker.sock:/var/run/docker.sock:rw 1009 | - ${DATA_PATH_HOST}/jupyterhub/:/data 1010 | - ${JUPYTERHUB_CUSTOM_CONFIG}:/jupyterhub_config.py 1011 | - ${JUPYTERHUB_USER_DATA}:/user-data 1012 | - ${JUPYTERHUB_USER_LIST}:/userlist 1013 | networks: 1014 | - backend 1015 | ports: 1016 | - "${JUPYTERHUB_PORT}:80" 1017 | environment: 1018 | - TERM=xterm 1019 | - JUPYTERHUB_USER_DATA=${JUPYTERHUB_USER_DATA} 1020 | - JUPYTERHUB_POSTGRES_DB=${JUPYTERHUB_POSTGRES_DB} 1021 | - JUPYTERHUB_POSTGRES_USER=${JUPYTERHUB_POSTGRES_USER} 1022 | - JUPYTERHUB_POSTGRES_HOST=${JUPYTERHUB_POSTGRES_HOST} 1023 | - JUPYTERHUB_POSTGRES_PASSWORD=${JUPYTERHUB_POSTGRES_PASSWORD} 1024 | - JUPYTERHUB_OAUTH_CALLBACK_URL=${JUPYTERHUB_OAUTH_CALLBACK_URL} 1025 | - JUPYTERHUB_OAUTH_CLIENT_ID=${JUPYTERHUB_OAUTH_CLIENT_ID} 1026 | - JUPYTERHUB_OAUTH_CLIENT_SECRET=${JUPYTERHUB_OAUTH_CLIENT_SECRET} 1027 | - JUPYTERHUB_LOCAL_NOTEBOOK_IMAGE=${COMPOSE_PROJECT_NAME}_jupyterhub-user 1028 | - JUPYTERHUB_ENABLE_NVIDIA=${JUPYTERHUB_ENABLE_NVIDIA} 1029 | jupyterhub-user: 1030 | build: 1031 | context: ./jupyterhub 1032 | dockerfile: Dockerfile.user 1033 | command: ["sh", "-c", "echo \"build only\""] 1034 | 1035 | ### IPython ######################################### 1036 | ipython-controller: 1037 | build: 1038 | context: ./ipython 1039 | dockerfile: Dockerfile.controller 1040 | networks: 1041 | - backend 1042 | extra_hosts: 1043 | - "laradock-ipython:${LARADOCK_IPYTHON_CONTROLLER_IP}" 1044 | ports: 1045 | - "33327-33338:33327-33338" 1046 | ipython-engine: 1047 | build: 1048 | context: ./ipython 1049 | dockerfile: Dockerfile.engine 1050 | networks: 1051 | - backend 1052 | extra_hosts: 1053 | - "laradock-ipython:${LARADOCK_IPYTHON_CONTROLLER_IP}" 1054 | 1055 | ### Docker-in-Docker ################################################ 1056 | docker-in-docker: 1057 | image: docker:dind 1058 | privileged: true 1059 | volumes: 1060 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} 1061 | expose: 1062 | - 2375 1063 | networks: 1064 | - backend 1065 | 1066 | ### NetData ################################################ 1067 | netdata: 1068 | image: titpetric/netdata:latest 1069 | cap_add: 1070 | - SYS_PTRACE 1071 | volumes: 1072 | - /:/host:ro 1073 | ports: 1074 | - "${NETDATA_PORT}:19999" 1075 | networks: 1076 | - backend 1077 | 1078 | ### REDISWEBUI ################################################ 1079 | redis-webui: 1080 | build: 1081 | context: ./redis-webui 1082 | environment: 1083 | - ADMIN_USER=${REDIS_WEBUI_USERNAME} 1084 | - ADMIN_PASS=${REDIS_WEBUI_PASSWORD} 1085 | - REDIS_1_HOST=${REDIS_WEBUI_CONNECT_HOST} 1086 | - REDIS_1_PORT=${REDIS_WEBUI_CONNECT_PORT} 1087 | networks: 1088 | - backend 1089 | ports: 1090 | - "${REDIS_WEBUI_PORT}:80" 1091 | depends_on: 1092 | - redis 1093 | 1094 | ### MongoWebUI ################################################ 1095 | mongo-webui: 1096 | build: 1097 | context: ./mongo-webui 1098 | environment: 1099 | - ROOT_URL=${MONGO_WEBUI_ROOT_URL} 1100 | - MONGO_URL=${MONGO_WEBUI_MONGO_URL} 1101 | - INSTALL_MONGO=${MONGO_WEBUI_INSTALL_MONGO} 1102 | volumes: 1103 | - ${DATA_PATH_HOST}/mongo-webui:/data/db 1104 | ports: 1105 | - "${MONGO_WEBUI_PORT}:3000" 1106 | networks: 1107 | - backend 1108 | depends_on: 1109 | - mongo 1110 | 1111 | ### Metabase ################################################# 1112 | metabase: 1113 | image: metabase/metabase:latest 1114 | environment: 1115 | - MB_DB_FILE=/metabase-data/${METABASE_DB_FILE} 1116 | ports: 1117 | - ${METABASE_PORT}:3000 1118 | volumes: 1119 | - ${DATA_PATH_HOST}/metabase-data:/metabase-data 1120 | networks: 1121 | - backend 1122 | 1123 | ### IDE-THEIA ################################################ 1124 | ide-theia: 1125 | build: 1126 | context: ./ide-theia 1127 | volumes: 1128 | - ${APP_CODE_PATH_HOST}:/home/project 1129 | ports: 1130 | - "${IDE_THEIA_PORT}:3000" 1131 | networks: 1132 | - backend 1133 | 1134 | ### IDE-WEBIDE ################################################ 1135 | ide-webide: 1136 | build: 1137 | context: ./ide-webide 1138 | volumes: 1139 | - ${DATA_PATH_HOST}/ide/webide/ide.db:/root/.coding-ide/ide.db 1140 | ports: 1141 | - "${IDE_WEBIDE_PORT}:8080" 1142 | networks: 1143 | - backend 1144 | 1145 | ### IDE-CODIAD ################################################ 1146 | ide-codiad: 1147 | build: 1148 | context: ./ide-codiad 1149 | environment: 1150 | - APP_CODE_PATH_CONTAINER=${APP_CODE_PATH_CONTAINER} 1151 | - TZ=${WORKSPACE_TIMEZONE} 1152 | - PGID=1000 1153 | - PUID=1000 1154 | volumes: 1155 | - /etc/localtime:/etc/localtime:ro 1156 | - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER} 1157 | - ${DATA_PATH_HOST}/ide/codiad:/config 1158 | ports: 1159 | - "${IDE_CODIAD_PORT}:80" 1160 | networks: 1161 | - backend 1162 | 1163 | ### IDE-ICECODER ################################################ 1164 | ide-icecoder: 1165 | build: 1166 | context: ./ide-icecoder 1167 | environment: 1168 | - DOCUMENT_ROOT=${APP_CODE_PATH_CONTAINER} 1169 | - TZ=${WORKSPACE_TIMEZONE} 1170 | - PGID=1000 1171 | - PUID=1000 1172 | volumes: 1173 | - /etc/localtime:/etc/localtime:ro 1174 | - ${APP_CODE_PATH_HOST}:/home/laradock/ICEcoder/dev 1175 | ports: 1176 | - "${IDE_ICECODER_PORT}:8080" 1177 | networks: 1178 | - backend 1179 | 1180 | ### DOCKER-REGISTRY ################################################ 1181 | docker-registry: 1182 | build: 1183 | context: ./docker-registry 1184 | volumes: 1185 | - /etc/localtime:/etc/localtime:ro 1186 | - ${DATA_PATH_HOST}/docker-registry:/var/lib/registry 1187 | ports: 1188 | - "${DOCKER_REGISTRY_PORT}:5000" 1189 | networks: 1190 | - backend 1191 | 1192 | ### DOCKER-WEB-UI ################################################ 1193 | docker-web-ui: 1194 | build: 1195 | context: ./docker-web-ui 1196 | environment: 1197 | - TZ=${WORKSPACE_TIMEZONE} 1198 | - ENV_DOCKER_REGISTRY_HOST=${DOCKER_WEBUI_REGISTRY_HOST} 1199 | - ENV_DOCKER_REGISTRY_PORT=${DOCKER_WEBUI_REGISTRY_PORT} 1200 | - ENV_DOCKER_REGISTRY_USE_SSL=${DOCKER_REGISTRY_USE_SSL} 1201 | - ENV_MODE_BROWSE_ONLY=${DOCKER_REGISTRY_BROWSE_ONLY} 1202 | volumes: 1203 | - /etc/localtime:/etc/localtime:ro 1204 | ports: 1205 | - "${DOCKER_WEBUI_PORT}:80" 1206 | networks: 1207 | - frontend 1208 | - backend 1209 | 1210 | ### MAILU ################################################ 1211 | mailu: 1212 | image: mailu/admin:${MAILU_VERSION} 1213 | volumes: 1214 | - "${DATA_PATH_HOST}/mailu/data:/data" 1215 | - "${DATA_PATH_HOST}/mailu/dkim:/dkim" 1216 | - "${DATA_PATH_HOST}/mailu/webmail:/webmail" 1217 | - /var/run/docker.sock:/var/run/docker.sock:ro 1218 | depends_on: 1219 | - mailu-front 1220 | - mailu-imap 1221 | - mailu-smtp 1222 | - mailu-antispam 1223 | - mailu-antivirus 1224 | - mailu-webdav 1225 | - mailu-admin 1226 | - mailu-webmail 1227 | - mailu-fetchmail 1228 | command: ["sh", "-c", "echo ${MAILU_INIT_ADMIN_USERNAME}@${MAILU_DOMAIN} ${MAILU_INIT_ADMIN_PASSWORD} ;python manage.py advertise ; python manage.py db upgrade ; python manage.py admin ${MAILU_INIT_ADMIN_USERNAME} ${MAILU_DOMAIN} ${MAILU_INIT_ADMIN_PASSWORD} || true;sed -i -- \"s/= Off/= On/g\" /webmail/_data_/_default_/configs/config.ini || true;if grep -Fq \"registration_link_url\" /webmail/_data_/_default_/configs/config.ini;then echo Already set!;else echo \"\" >> /webmail/_data_/_default_/configs/config.ini; echo \"[login]\" >> /webmail/_data_/_default_/configs/config.ini;echo \"registration_link_url = '${MAILU_WEBSITE}${MAILU_WEB_ADMIN}/ui/user/signup'\" >> /webmail/_data_/_default_/configs/config.ini;fi"] 1229 | networks: 1230 | - backend 1231 | mailu-front: 1232 | image: mailu/nginx:${MAILU_VERSION} 1233 | environment: 1234 | - ADMIN=${MAILU_ADMIN} 1235 | - WEB_ADMIN=${MAILU_WEB_ADMIN} 1236 | - WEB_WEBMAIL=${MAILU_WEB_WEBMAIL} 1237 | - WEBDAV=${MAILU_WEBDAV} 1238 | - HOSTNAMES=${MAILU_HOSTNAMES} 1239 | - TLS_FLAVOR=${MAILU_TLS_FLAVOR} 1240 | - MESSAGE_SIZE_LIMIT=${MAILU_MESSAGE_SIZE_LIMIT} 1241 | ports: 1242 | - "${MAILU_HTTP_PORT}:80" 1243 | - "${MAILU_HTTPS_PORT}:443" 1244 | - "110:110" 1245 | - "143:143" 1246 | - "993:993" 1247 | - "995:995" 1248 | - "25:25" 1249 | - "465:465" 1250 | - "587:587" 1251 | volumes: 1252 | - "${DATA_PATH_HOST}/mailu/certs:/certs" 1253 | networks: 1254 | backend: 1255 | aliases: 1256 | - front 1257 | mailu-imap: 1258 | image: mailu/dovecot:${MAILU_VERSION} 1259 | environment: 1260 | - DOMAIN=${MAILU_DOMAIN} 1261 | - HOSTNAMES=${MAILU_HOSTNAMES} 1262 | - POSTMASTER=${MAILU_POSTMASTER} 1263 | - WEBMAIL=${MAILU_WEBMAIL} 1264 | - RECIPIENT_DELIMITER=${MAILU_RECIPIENT_DELIMITER} 1265 | volumes: 1266 | - "${DATA_PATH_HOST}/mailu/data:/data" 1267 | - "${DATA_PATH_HOST}/mailu/mail:/mail" 1268 | - "${DATA_PATH_HOST}/mailu/overrides:/overrides" 1269 | depends_on: 1270 | - mailu-front 1271 | networks: 1272 | backend: 1273 | aliases: 1274 | - imap 1275 | mailu-smtp: 1276 | image: mailu/postfix:${MAILU_VERSION} 1277 | environment: 1278 | - DOMAIN=${MAILU_DOMAIN} 1279 | - HOSTNAMES=${MAILU_HOSTNAMES} 1280 | - RELAYHOST=${MAILU_RELAYHOST} 1281 | - RELAYNETS=${MAILU_RELAYNETS} 1282 | - RECIPIENT_DELIMITER=${MAILU_RECIPIENT_DELIMITER} 1283 | - MESSAGE_SIZE_LIMIT=${MAILU_MESSAGE_SIZE_LIMIT} 1284 | volumes: 1285 | - "${DATA_PATH_HOST}/mailu/data:/data" 1286 | - "${DATA_PATH_HOST}/mailu/overrides:/overrides" 1287 | depends_on: 1288 | - mailu-front 1289 | networks: 1290 | backend: 1291 | aliases: 1292 | - smtp 1293 | mailu-antispam: 1294 | image: mailu/rspamd:${MAILU_VERSION} 1295 | volumes: 1296 | - "${DATA_PATH_HOST}/mailu/filter:/var/lib/rspamd" 1297 | - "${DATA_PATH_HOST}/mailu/dkim:/dkim" 1298 | - "${DATA_PATH_HOST}/mailu/overrides/rspamd:/etc/rspamd/override.d" 1299 | depends_on: 1300 | - mailu-front 1301 | networks: 1302 | backend: 1303 | aliases: 1304 | - antispam 1305 | mailu-antivirus: 1306 | image: mailu/clamav:${MAILU_VERSION} 1307 | volumes: 1308 | - "${DATA_PATH_HOST}/mailu/filter:/data" 1309 | networks: 1310 | backend: 1311 | aliases: 1312 | - antivirus 1313 | mailu-webdav: 1314 | image: mailu/${MAILU_WEBDAV}:${MAILU_VERSION} 1315 | volumes: 1316 | - "${DATA_PATH_HOST}/mailu/dav:/data" 1317 | networks: 1318 | backend: 1319 | aliases: 1320 | - webdav 1321 | mailu-admin: 1322 | image: mailu/admin:${MAILU_VERSION} 1323 | environment: 1324 | - DOMAIN=${MAILU_DOMAIN} 1325 | - HOSTNAMES=${MAILU_HOSTNAMES} 1326 | - POSTMASTER=${MAILU_POSTMASTER} 1327 | - SECRET_KEY=${MAILU_SECRET_KEY} 1328 | - AUTH_RATELIMIT=${MAILU_AUTH_RATELIMIT} 1329 | - TLS_FLAVOR=${MAILU_TLS_FLAVOR} 1330 | - DISABLE_STATISTICS=${MAILU_DISABLE_STATISTICS} 1331 | - DMARC_RUA=${MAILU_DMARC_RUA} 1332 | - DMARC_RUF=${MAILU_DMARC_RUF} 1333 | - WELCOME=${MAILU_WELCOME} 1334 | - WELCOME_SUBJECT=${MAILU_WELCOME_SUBJECT} 1335 | - WELCOME_BODY=${MAILU_WELCOME_BODY} 1336 | - WEB_ADMIN=${MAILU_WEB_ADMIN} 1337 | - WEB_WEBMAIL=${MAILU_WEB_WEBMAIL} 1338 | - WEBSITE=${MAILU_WEBSITE} 1339 | - WEBMAIL=${MAILU_WEBMAIL} 1340 | - SITENAME=${MAILU_SITENAME} 1341 | - PASSWORD_SCHEME=${MAILU_PASSWORD_SCHEME} 1342 | - RECAPTCHA_PUBLIC_KEY=${MAILU_RECAPTCHA_PUBLIC_KEY} 1343 | - RECAPTCHA_PRIVATE_KEY=${MAILU_RECAPTCHA_PRIVATE_KEY} 1344 | volumes: 1345 | - "${DATA_PATH_HOST}/mailu/data:/data" 1346 | - "${DATA_PATH_HOST}/mailu/dkim:/dkim" 1347 | - /var/run/docker.sock:/var/run/docker.sock:ro 1348 | depends_on: 1349 | - redis 1350 | networks: 1351 | backend: 1352 | aliases: 1353 | - admin 1354 | mailu-webmail: 1355 | image: "mailu/${MAILU_WEBMAIL}:${MAILU_VERSION}" 1356 | volumes: 1357 | - "${DATA_PATH_HOST}/mailu/webmail:/data" 1358 | networks: 1359 | backend: 1360 | aliases: 1361 | - webmail 1362 | mailu-fetchmail: 1363 | image: mailu/fetchmail:${MAILU_VERSION} 1364 | environment: 1365 | - FETCHMAIL_DELAY=${MAILU_FETCHMAIL_DELAY} 1366 | volumes: 1367 | - "${DATA_PATH_HOST}/mailu/data:/data" 1368 | networks: 1369 | backend: 1370 | aliases: 1371 | - fetchmail 1372 | 1373 | ### TRAEFIK ######################################### 1374 | traefik: 1375 | build: 1376 | context: ./traefik 1377 | command: --docker 1378 | volumes: 1379 | - /var/run/docker.sock:/var/run/docker.sock 1380 | ports: 1381 | - "${TRAEFIK_HOST_HTTP_PORT}:80" 1382 | - "${TRAEFIK_HOST_HTTPS_PORT}:443" 1383 | networks: 1384 | - frontend 1385 | - backend 1386 | labels: 1387 | - traefik.backend=traefik 1388 | - traefik.frontend.rule=Host:monitor.localhost 1389 | - traefik.port=8080 1390 | 1391 | ### MOSQUITTO Broker ######################################### 1392 | mosquitto: 1393 | build: 1394 | context: ./mosquitto 1395 | volumes: 1396 | - ${DATA_PATH_HOST}/mosquitto/data:/mosquitto/data 1397 | ports: 1398 | - "${MOSQUITTO_PORT}:9001" 1399 | networks: 1400 | - frontend 1401 | - backend 1402 | 1403 | ### COUCHDB ################################################### 1404 | couchdb: 1405 | build: 1406 | context: ./couchdb 1407 | volumes: 1408 | - ${DATA_PATH_HOST}/couchdb/data:/opt/couchdb/data 1409 | ports: 1410 | - "${COUCHDB_PORT}:5984" 1411 | networks: 1412 | - backend 1413 | 1414 | ### Manticore Search ########################################### 1415 | manticore: 1416 | build: 1417 | context: ./manticore 1418 | volumes: 1419 | - ${MANTICORE_CONFIG_PATH}:/etc/sphinxsearch 1420 | - ${DATA_PATH_HOST}/manticore/data:/var/lib/manticore/data 1421 | - ${DATA_PATH_HOST}/manticore/log:/var/lib/manticore/log 1422 | ports: 1423 | - "${MANTICORE_API_PORT}:9312" 1424 | - "${MANTICORE_SPHINXQL_PORT}:9306" 1425 | - "${MANTICORE_HTTP_PORT}:9308" 1426 | networks: 1427 | - backend 1428 | --------------------------------------------------------------------------------