version: '3.3' {% if drupal.live|default(0) %} name: {{ projectname }} {% endif %} networks: traefik-public: external: true services: mariadb: image: {% if dbserver.type == 'mariadb' %}'wodby/mariadb:{{ dbserver.version }}'{% elseif dbserver.type == 'mysql' %}'mysql/mysql-server:{{ dbserver.version }}'{% else %}''{% endif %} {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: drupal MYSQL_USER: drupal MYSQL_PASSWORD: drupal MYSQL_LOG_CONSOLE: 0 {% if drupal.live|default(0) %} volumes: - {{ projectrootdb }}:/var/lib/mysql {% if backup.enable|default(0) %} - {{ projectrootbackup }}/db:/var/backups/mysql {% endif %} {% endif %} {% if not drupal.live|default(0) %} mariadbtest: image: {% if dbserver.type == 'mariadb' %}'wodby/mariadb:{{ dbserver.version }}'{% elseif dbserver.type == 'mysql' %}'mysql/mysql-server:{{ dbserver.version }}'{% else %}''{% endif %} environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: drupal MYSQL_USER: drupal MYSQL_PASSWORD: drupal MYSQL_LOG_CONSOLE: 0 {% endif %} php: image: 'wodby/drupal-php:{{ php.version }}' {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} environment: {% if mailhog.enable %} PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025 {% endif %} DB_HOST: mariadb DB_USER: drupal DB_PASSWORD: drupal DB_NAME: drupal DB_DRIVER: mysql COMPOSER_ALLOW_SUPERUSER: 1 {% if php.xdebug and not drupal.live|default(0) %} PHP_XDEBUG: 1 PHP_XDEBUG_MAX_NESTING_LEVEL: 512 PHP_XDEBUG_MODE: {% if php.coverage %}coverage{% else %}debug{% endif %} PHP_XDEBUG_REMOTE_HOST: {{ docker0.ip }} PHP_XDEBUG_CLIENT_HOST: {{ docker0.ip }} PHP_XDEBUG_LOG: /dev/null PHP_XDEBUG_START_WITH_REQUEST: 1 PHP_IDE_CONFIG: serverName=Docker DRUSH_ALLOW_XDEBUG: 1 {% if webgrind.enable %} PHP_XDEBUG_PROFILER_ENABLE: 1 PHP_XDEBUG_PROFILER_ENABLE_TRIGGER: 1 PHP_XDEBUG_PROFILER_ENABLE_TRIGGER_VALUE: 1 PHP_XDEBUG_PROFILER_OUTPUT_DIR: /mnt/files/xdebug/profiler PHP_XDEBUG_TRACE_OUTPUT_DIR: /mnt/files/xdebug/traces {% endif %} {% endif %} {% if blackfire.enable and not drupal.live|default(0) %} PHP_BLACKFIRE: 1 {% endif %} {% if php.ssh and not drupal.live|default(0) %} SSH_AUTH_SOCK: /ssh-agent {% endif %} volumes: - {{ projectroot }}:/var/www/html - {{ projectroot }}/drush:/etc/drush {% if drupal.live|default(0) %} - {{ projectrootfiles }}:/data/default {% endif %} {% if php.ssh and not drupal.live|default(0) %} - {{ php.ssh_auth_sock }}:/ssh-agent {% endif %} {% if webgrind.enable and not drupal.live|default(0) %} - files:/mnt/files {% endif %} {% if wkhtmltox.enable %} - './.docker-init/wkhtmltox.sh:/docker-entrypoint-init.d/50-wkhtmltox.sh' {% endif %} extra_hosts: - '{{ projectdomain }}:{{ docker0.ip }}' {% for subdomain in relatedprojectdomains %} - '{{ subdomain }}:{{ docker0.ip }}' {% endfor %} {% if drupal.live|default(0) %} cron: image: 'wodby/drupal-php:{{ php.version }}' restart: unless-stopped environment: {% if mailhog.enable %} PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025 {% endif %} DB_HOST: mariadb DB_USER: drupal DB_PASSWORD: drupal DB_NAME: drupal DB_DRIVER: mysql COMPOSER_ALLOW_SUPERUSER: 1 {% if php.ssh and not drupal.live|default(0) %} SSH_AUTH_SOCK: /ssh-agent {% endif %} volumes: - {{ projectroot }}:/var/www/html - {{ projectroot }}/drush:/etc/drush - {{ projectrootfiles }}:/data/default - {{ projectroot }}/crontabs:/etc/crontabs {% if php.ssh and not drupal.live|default(0) %} - {{ php.ssh_auth_sock }}:/ssh-agent {% endif %} extra_hosts: - '{{ projectdomain }}:{{ docker0.ip }}' {% for subdomain in relatedprojectdomains %} - '{{ subdomain }}:{{ docker0.ip }}' {% endfor %} command: sudo -E crond -f -d 0 {% endif %} {{ webserver.type }}: image: {% if webserver.type == 'nginx' %}'wodby/drupal-nginx:{{ webserver.version|default("1.21") }}'{% elseif webserver.type == 'apache' %}'wodby/apache:2.4'{% endif %} {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} networks: - traefik-public - default depends_on: - php environment: {% if webserver.type == 'nginx' %} {% if live is defined and live.uri is defined %} NGINX_DRUPAL_FILE_PROXY_URL: '{{ live.uri }}' {% endif %} NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: 'off' NGINX_ERROR_LOG_LEVEL: debug {% elseif webserver.type == 'apache' %} APACHE_VHOST_PRESET: php APACHE_LOG_LEVEL: debug {% if webserver.overwriteconfig %} APACHE_INCLUDE_CONF: /var/www/html/apache/vhost.conf {% endif %} {% endif %} {{ webserver.type|upper }}_BACKEND_HOST: php {{ webserver.type|upper }}_SERVER_ROOT: /var/www/html/{{ webRoot }}/ volumes: - {{ projectroot }}:/var/www/html {% if drupal.live|default(0) %} - {{ projectrootfiles }}:/data/default {% endif %} labels: traefik.enable: 'true' traefik.docker.network: traefik-public {% if basicauth.enable %} traefik.http.middlewares.{{ webserver.type }}-{{ projectname }}-auth.basicauth.users: {{ basicauth.code }} {% endif %} traefik.http.routers.{{ webserver.type }}-{{ projectname }}.rule: Host(`{{ projectdomain }}`){% for domain in extradomains|default([]) %} || Host(`{{ domain }}`){% endfor %} {% if drupal.live|default(0) %} traefik.http.routers.{{ webserver.type }}-{{ projectname }}.tls: 'true' traefik.http.routers.{{ webserver.type }}-{{ projectname }}.tls.certresolver: lakedrops {% endif %} {% if extradomains|default([]) and basicauth.enable %} traefik.http.routers.{{ webserver.type }}-{{ projectname }}.middlewares: {{ webserver.type }}-{{ projectname }}-middleware traefik.http.middlewares.{{ webserver.type }}-{{ projectname }}-middleware.chain.middlewares: {% for domain in extradomains %}{% if loop.index > 1 %},{% endif %}{{ webserver.type }}-{{ projectname }}-redirectregex{{ loop.index }}@docker{% endfor %},{{ webserver.type }}-{{ projectname }}-auth@docker {% elseif extradomains|default([])|length = 1 %} traefik.http.routers.{{ webserver.type }}-{{ projectname }}.middlewares: {{ webserver.type }}-{{ projectname }}-redirectregex1@docker {% elseif extradomains|default([]) %} traefik.http.routers.{{ webserver.type }}-{{ projectname }}.middlewares: {{ webserver.type }}-{{ projectname }}-middleware traefik.http.middlewares.{{ webserver.type }}-{{ projectname }}-middleware.chain.middlewares: {% for domain in extradomains %}{% if loop.index > 1 %},{% endif %}{{ webserver.type }}-{{ projectname }}-redirectregex{{ loop.index }}@docker{% endfor %} {% elseif basicauth.enable %} traefik.http.routers.{{ webserver.type }}-{{ projectname }}.middlewares: {{ webserver.type }}-{{ projectname }}-auth@docker {% endif %} {% for domain in extradomains|default([]) %} traefik.http.middlewares.{{ webserver.type }}-{{ projectname }}-redirectregex{{ loop.index }}.redirectRegex.regex: "^https://{{ domain }}/(.*)" traefik.http.middlewares.{{ webserver.type }}-{{ projectname }}-redirectregex{{ loop.index }}.redirectRegex.replacement: "https://{{ projectdomain }}/$${1}" {% endfor %} {% if varnish.enable %} varnish: image: 'wodby/varnish:6.0' {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} networks: - traefik-public - default depends_on: - {{ webserver.type }} environment: VARNISH_SECRET: secret VARNISH_BACKEND_HOST: {{ webserver.type }} VARNISH_BACKEND_PORT: 80 labels: traefik.enable: 'true' traefik.docker.network: traefik-public traefik.http.routers.varnish-{{ projectname }}.rule: Host(`varnish-{{ projectdomain }}`) {% endif %} redis: image: 'wodby/redis:{{ redis.version }}' {% if drupal.live|default(0) %} restart: unless-stopped volumes: - {{ projectrootredis }}:/data {% endif %} {% if not drupal.live|default(0) %} {% if dbbrowser.type == 'adminer' %} adminer: image: 'wodby/adminer:{{ dbbrowser.version|default("4.6") }}' networks: - traefik-public - default environment: ADMINER_SALT: adminer-salt labels: traefik.enable: 'true' traefik.docker.network: traefik-public traefik.http.services.{{ projectname }}_adminer.loadbalancer.server.port: 9000 traefik.http.routers.adminer-{{ projectname }}.rule: Host(`adminer-{{ projectdomain }}`) {% elseif dbbrowser.type == 'pma' %} pma: image: 'phpmyadmin/phpmyadmin:latest' networks: - traefik-public - default depends_on: - mariadb environment: PMA_HOST: mariadb PMA_USER: drupal PMA_PASSWORD: drupal PHP_UPLOAD_MAX_FILESIZE: 1G PHP_MAX_INPUT_VARS: 1G labels: traefik.enable: 'true' traefik.docker.network: traefik-public traefik.http.routers.pma-{{ projectname }}.rule: Host(`pma-{{ projectdomain }}`) {% endif %} {% endif %} {% if solr.enable %} solr: image: 'wodby/solr:8-{{ solr.version }}' {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} networks: - traefik-public - default environment: SOLR_HEAP: 1024m labels: traefik.enable: 'true' traefik.docker.network: traefik-public traefik.http.services.{{ projectname }}_solr.loadbalancer.server.port: 8983 traefik.http.routers.solr-{{ projectname }}.rule: Host(`solr-{{ projectdomain }}`) {% endif %} {% if mailhog.enable and (not drupal.live|default(0) or staging) %} mailhog: image: 'mailhog/mailhog' {% if staging %} restart: unless-stopped {% endif %} networks: - traefik-public - default environment: MH_OUTGOING_SMTP: /test/mhout.json privileged: true volumes: - {{ projectroot }}/tests/mhout.json:/test/mhout.json labels: traefik.enable: 'true' traefik.docker.network: traefik-public {% if basicauth.enable %} traefik.http.middlewares.mailhog-{{ projectname }}-auth.basicauth.users: {{ basicauth.code }} traefik.http.routers.mailhog-{{ projectname }}.middlewares: mailhog-{{ projectname }}-auth@docker {% endif %} traefik.http.services.{{ projectname }}_mailhog.loadbalancer.server.port: 8025 traefik.http.routers.mailhog-{{ projectname }}.rule: Host(`mailhog-{{ projectdomain }}`) {% if drupal.live|default(0) %} traefik.http.routers.mailhog-{{ projectname }}.tls: 'true' traefik.http.routers.mailhog-{{ projectname }}.tls.certresolver: lakedrops {% endif %} {% endif %} {% if node.enable %} nodejs: image: 'wodby/drupal-node:1.0' networks: - traefik-public - default environment: NODE_SERVICE_KEY: '{{ node.key }}' labels: traefik.enable: 'true' traefik.docker.network: traefik-public traefik.http.services.{{ projectname }}_nodejs.loadbalancer.server.port: 8080 traefik.http.routers.nodejs-{{ projectname }}.rule: Host(`nodejs-{{ projectdomain }}`) volumes: - {{ projectroot }}/{{ node.path }}:/app command: sh -c 'npm install && npm run start' node: image: 'node:alpine' networks: - traefik-public - default working_dir: /app labels: traefik.enable: 'true' traefik.docker.network: traefik-public traefik.http.services.{{ projectname }}_node.loadbalancer.server.port: 3000 traefik.http.routers.node-{{ projectname }}.rule: Host(`front-{{ projectdomain }}`) expose: - '3000' volumes: - {{ projectroot }}/{{ node.path }}:/app command: sh -c 'npm install && npm run start' {% endif %} {% if memcached.enable %} memcached: image: 'wodby/memcached:1.6' {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} {% endif %} {% if rsyslog.enable %} rsyslog: image: 'wodby/rsyslog' {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} {% endif %} {% if athenapdf.enable %} athenapdf: image: 'arachnysdocker/athenapdf-service' {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} environment: WEAVER_AUTH_KEY: '{{ athenapdf.key }}' WEAVER_ATHENA_CMD: 'athenapdf -S' WEAVER_MAX_WORKERS: 10 WEAVER_MAX_CONVERSION_QUEUE: 50 WEAVER_WORKER_TIMEOUT: 90 WEAVER_CONVERSION_FALLBACK: false {% endif %} {% if blackfire.enable and not drupal.live|default(0) %} blackfire: image: 'blackfire/blackfire' environment: BLACKFIRE_SERVER_ID: '{{ blackfire.id }}' BLACKFIRE_SERVER_TOKEN: '{{ blackfire.token }}' {% endif %} {% if webgrind.enable and not drupal.live|default(0) %} webgrind: # add XDEBUG_PROFILE=1 to your request to profile that image: 'wodby/webgrind:1' networks: - traefik-public - default environment: WEBGRIND_PROFILER_DIR: '/mnt/files/xdebug/profiler' labels: traefik.enable: 'true' traefik.docker.network: traefik-public traefik.http.services.{{ projectname }}_webgrind.loadbalancer.server.port: 8080 traefik.http.routers.webgrind-{{ projectname }}.rule: Host(`webgrind-{{ projectdomain }}`) volumes: - {{ projectroot }}/files:/mnt/files {% endif %} {% if selenium.enable and not drupal.live|default(0) %} hub: image: 'elgalu/selenium' volumes: - /dev/shm:/dev/shm privileged: true environment: SELENIUM_HUB_HOST: 'hub' SELENIUM_HUB_PORT: '4444' GRID: 'true' CHROME: 'false' FIREFOX: 'false' depends_on: - php chrome: image: 'elgalu/selenium' depends_on: - hub volumes: - /dev/shm:/dev/shm privileged: true environment: NOVNC: 'true' SELENIUM_HUB_HOST: 'hub' SELENIUM_HUB_PORT: '4444' SELENIUM_NODE_HOST: '{{ docker0.ip }}' SCREEN_WIDTH: '1300' SCREEN_HEIGHT: '999' VIDEO: 'false' GRID: 'false' CHROME: 'true' FIREFOX: 'false' #ports: # VNC: See what's going on by connecting your VNC client to 0.0.0.0:5900 #- 5900:25900 # noVNC: See what's going on by hitting http://0.0.0.0:6080 in your browser # Important: http://127.0.0.1:6081 works but http://localhost:6081 doesn't #- 6080:26080 {% endif %} {% if elasticsearch.enable %} elasticsearch: image: 'wodby/elasticsearch:7' {% if drupal.live|default(0) %} restart: unless-stopped {% endif %} environment: discovery.type: single-node ES_BOOTSTRAP_MEMORY_LOCK: false ES_JAVA_OPTS: '-Xms512m -Xmx512m' ports: - 9200 - 9300 {% endif %} {% if drupal.live|default(0) %} {% if backup.enable|default(0) %} borgmatic: image: 'b3vis/borgmatic:{{ backup.version }}' restart: unless-stopped volumes: - {{ projectrootfiles }}:/mnt/source:ro - {{ projectrootbackup }}/files:/mnt/borg-repository - {{ projectroot }}/backup:/etc/borgmatic.d/ - {{ projectrootbackup }}/config:/root/.config/borg - {{ projectrootbackup }}/ssh:/root/.ssh - {{ projectrootbackup }}/cache:/root/.cache/borg environment: TZ: Europe/Berlin env_file: ../backup/.env {% endif %} {% endif %}