diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000..6b8710a711
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1 @@
+.git
diff --git a/.env b/.env
new file mode 100644
index 0000000000..d822fd38af
--- /dev/null
+++ b/.env
@@ -0,0 +1,101 @@
+### Documentation available at https://wodby.com/docs/stacks/drupal/local
+### Changelog can be found at https://github.com/wodby/docker4drupal/releases
+### Images tags format explained at https://github.com/wodby/docker4drupal#images-tags
+
+### PROJECT SETTINGS
+
+PROJECT_NAME=my_drupal11_project
+PROJECT_BASE_URL=drupal.docker.localhost
+PROJECT_PORT=8000
+
+DB_NAME=drupal
+DB_USER=drupal
+DB_PASSWORD=drupal
+DB_ROOT_PASSWORD=password
+DB_HOST=mariadb
+DB_PORT=3306
+DB_DRIVER=mysql
+
+### --- MARIADB ----
+
+MARIADB_TAG=11.4-3.30.5
+#MARIADB_TAG=10.11-3.30.5
+#MARIADB_TAG=10.6-3.30.5
+#MARIADB_TAG=10.5-3.30.5
+
+### --- DRUPAL CMS ----
+
+DRUPAL_CMS_TAG=1-0.3.2
+
+### --- VANILLA DRUPAL ----
+
+DRUPAL_TAG=11-4.81.6
+#DRUPAL_TAG=10-4.81.6
+
+### --- PHP ----
+
+# Linux (uid 1000 gid 1000)
+
+PHP_TAG=8.4-dev-4.66.2
+#PHP_TAG=8.3-dev-4.66.2
+#PHP_TAG=8.2-dev-4.66.2
+#PHP_TAG=8.1-dev-4.66.2
+
+# macOS (uid 501 gid 20)
+
+#PHP_TAG=8.4-dev-macos-4.66.2
+#PHP_TAG=8.3-dev-macos-4.66.2
+#PHP_TAG=8.2-dev-macos-4.66.2
+#PHP_TAG=8.1-dev-macos-4.66.2
+
+### --- NGINX ----
+
+NGINX_TAG=1.27-5.40.3
+#NGINX_TAG=1.26-5.40.3
+
+NGINX_VHOST_PRESET=drupal11
+#NGINX_VHOST_PRESET=drupal10
+
+### --- SOLR ---
+
+SOLR_TAG=9-5.1.6
+
+### --- OPENSEARCH ---
+
+OPENSEARCH_TAG=2
+OPENSEARCH_ADMIN_PASSWORD=VERY%@bad123password
+
+### --- VALKEY ---
+
+VALKEY_TAG=8-1.0.0
+#VALKEY_TAG=7-1.0.0
+
+### --- NODE ---
+
+NODE_TAG=22-dev-1.48.1
+#NODE_TAG=20-dev-1.48.1
+#NODE_TAG=18-dev-1.48.1
+
+### --- VARNISH ---
+
+VARNISH_TAG=6.0-4.19.1
+
+### --- POSTGRESQL ----
+
+POSTGRES_TAG=17-1.35.5
+#POSTGRES_TAG=16-1.35.5
+#POSTGRES_TAG=15-1.35.5
+#POSTGRES_TAG=14-1.35.5
+#POSTGRES_TAG=13-1.35.5
+
+### OTHERS
+
+ADMINER_TAG=5-4.1.2
+APACHE_TAG=2.4-4.15.3
+MEMCACHED_TAG=1-2.19.1
+OPENSMTPD_TAG=7-1.23.1
+RSYSLOG_TAG=latest
+SELENIUM_CHROME_TAG=3.141
+WEBGRIND_TAG=1-1.36.2
+XHPROF_TAG=3.14.2
+ZOOKEEPER_TAG=3.8
diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md
new file mode 100644
index 0000000000..db72c170bd
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Bug_report.md
@@ -0,0 +1,39 @@
+---
+name: Bug report
+about: Create a report to help us improve
+
+---
+
+***OS type***
+Linux/Windows/macOS
+
+***Drupal version***
+7 / 8
+
+***Codebase***
+Built-in vanilla Drupal or mounted codebase
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**Output of `docker info`**
+```
+Paste here
+```
+
+**Contents of your `compose.yml`**
+```
+Paste here
+REMOVE COMMENTED LINES
+```
+
+**Contents of your `.env`**
+```
+Paste here
+REMOVE COMMENTED LINES
+```
+
+**Logs output `docker compose logs`**
+```
+Paste here
+```
diff --git a/.github/ISSUE_TEMPLATE/Custom.md b/.github/ISSUE_TEMPLATE/Custom.md
new file mode 100644
index 0000000000..5b5cf5b007
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Custom.md
@@ -0,0 +1,31 @@
+---
+name: Support request
+about: Request support from community
+
+---
+
+***Codebase***
+Built-in vanilla Drupal or mounted codebase
+
+**Describe your issue**
+A clear and concise description of your issue.
+
+**Output of `docker info`**
+```
+Paste here
+```
+
+**Contents of your `compose.yml`**
+```
+Paste here
+```
+
+**Contents of your `.env`**
+```
+Paste here
+```
+
+**Logs output `docker compose logs`**
+```
+Paste here
+```
diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md
new file mode 100644
index 0000000000..5384295126
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/Feature_request.md
@@ -0,0 +1,17 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/issue_template.md b/.github/issue_template.md
index 98bb812f07..374ec121b0 100644
--- a/.github/issue_template.md
+++ b/.github/issue_template.md
@@ -10,11 +10,17 @@ e.g. macOS Sierra
```
### Docker compose file
+Make sure you remove all commented services.
```yml
-# Content of your docker-compose.yml file. Make sure you remove all sensible information you might have there.
+# Content of your compose.yml file. Make sure you remove all sensible information you might have there.
+```
+
+### .env file
+```
+# Content of .env file. Make sure you remove all sensible information you might have there.
```
### Logs output
```
-# Run "docker-compose logs [service]". Let's say you get 500 error for some reason then it'll be helpful to provide logs for php and http server (nginx/apache) services.
+# Run "docker compose logs [service]". Let's say you get 500 error for some reason then it'll be helpful to provide logs for php and http server (nginx/apache) services.
```
diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml
new file mode 100644
index 0000000000..0e35ec44f4
--- /dev/null
+++ b/.github/workflows/workflow.yml
@@ -0,0 +1,58 @@
+name: Run tests
+
+on:
+ push:
+ branches:
+ - master
+
+ tags:
+ - '*'
+
+ pull_request:
+
+jobs:
+ test:
+ strategy:
+ matrix:
+ drupal_ver: [ 11,10 ]
+ php_ver: [ '8.4','8.3','8.2','8.1' ]
+ exclude:
+ - drupal_ver: 11
+ php_ver: '8.2'
+ - drupal_ver: 11
+ php_ver: '8.1'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: test
+ env:
+ DRUPAL_VER: ${{ matrix.drupal_ver }}
+ PHP_VER: ${{ matrix.php_ver }}
+ run: make test
+ test-cms:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: test
+ run: make test-cms
+ release:
+ runs-on: ubuntu-latest
+ if: startsWith(github.ref, 'refs/tags/')
+ needs: [test,test-cms]
+ steps:
+ - uses: actions/checkout@v4
+ - name: prepare artifact
+ run: cp docker.mk Makefile && tar -czf docker4drupal.tar.gz compose.yml compose.override.yml Makefile .env traefik.yml
+ - name: get tag name
+ id: vars
+ run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
+ - uses: xresloader/upload-to-github-release@v1
+ id: upload_artifact
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ file: docker4drupal.tar.gz
+ overwrite: true
+ tags: true
+ draft: false
+ tag_name: ${{ steps.vars.outputs.tag }}
diff --git a/.gitignore b/.gitignore
index db98e97330..875c38cd9c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
.idea/
-.docker-sync/
\ No newline at end of file
+mariadb-init
+postgres-init
+mutagen.yml.lock
+.vscode
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 0ebb5e3ab8..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-language: bash
-
-sudo: required
-
-services:
- - docker
-
-env:
- global:
- - DOCKER_COMPOSE_VERSION=1.10.0
- matrix:
- - DRUPAL_VER=6 PHP_VER=5.3
- - DRUPAL_VER=6 PHP_VER=5.6
- - DRUPAL_VER=7 PHP_VER=5.6
- - DRUPAL_VER=7 PHP_VER=7.0
- - DRUPAL_VER=7 PHP_VER=7.1
- - DRUPAL_VER=8 PHP_VER=7.0
- - DRUPAL_VER=8 PHP_VER=7.1
-
-install:
- - sudo rm /usr/local/bin/docker-compose
- - curl -L "https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-$(uname -s)-$(uname -m)" > docker-compose
- - chmod +x docker-compose
- - sudo mv docker-compose /usr/local/bin
-
-script:
- - make test
-
-deploy:
- provider: releases
- api_key: $GITHUB_ACCESS_TOKEN
- overwrite: true
- skip_cleanup: true
- file_glob: true
- file:
- - docker-compose.yml
- - docker-sync.yml
- - traefik.yml
- on:
- tags: true
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 134d35510b..2ffba95e2d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,11 +1,12 @@
--include env_make
+include docker.mk
-.PHONY: test
-
-DRUPAL_VER ?= 8
-PHP_VER ?= 7.1
-
-default: test
+DRUPAL_VER ?= 11
+PHP_VER ?= 8.4
test:
- cd ./test/$(DRUPAL_VER)/$(PHP_VER) && ./run.sh
+ cd ./tests/$(DRUPAL_VER) && PHP_VER=$(PHP_VER) ./run.sh
+.PHONY: test
+
+test-cms:
+ cd ./tests/cms && ./run.sh
+.PHONY: test-cms
diff --git a/README.md b/README.md
index 7686f3d489..693f17ebfa 100644
--- a/README.md
+++ b/README.md
@@ -1,74 +1,169 @@
# Docker-based Drupal stack
-[](http://docs.docker4drupal.org)
-[](https://travis-ci.org/wodby/docker4drupal)
-[](http://slack.wodby.com)
-[](https://twitter.com/wodbyhq)
+[](https://github.com/wodby/docker4drupal/actions)
## Introduction
-Docker4Drupal is a set of docker images optimized for Drupal. Use `docker-compose.yml` file from the [latest stable release](https://github.com/wodby/docker4drupal/releases) to spin up local environment on Linux, Mac OS X and Windows.
+Docker4Drupal is a set of docker images optimized for Drupal. Use
+`compose.yml` file from the [latest stable release](https://github.com/wodby/docker4drupal/releases) to spin up local environment on Linux, Mac OS X and Windows.
-Read [**Getting Started**](https://docker4drupal.readthedocs.io).
+* Read the docs on [**how to use**](https://wodby.com/docs/stacks/drupal/local#usage)
+* Ask questions on [Discord](http://discord.wodby.com/)
+* Ask questions on [Slack](http://slack.wodby.com/)
+* Follow [@wodbycloud](https://twitter.com/wodbycloud) for future announcements
## Stack
-[wodby/drupal-nginx]: https://github.com/wodby/drupal-nginx
-[wodby/php-apache]: https://github.com/wodby/php-apache
-[wodby/drupal]: https://github.com/wodby/drupal
-[wodby/drupal-php]: https://github.com/wodby/drupal-php
-[wodby/mariadb]: https://github.com/wodby/mariadb
-[wodby/redis]: https://github.com/wodby/redis
-[wodby/drupal-varnish]: https://github.com/wodby/drupal-varnish
-[wodby/drupal-solr]: https://github.com/wodby/drupal-solr
-[wodby/drupal-node]: https://github.com/wodby/drupal-node
-[wodby/memcached]: https://github.com/wodby/memcached
-[wodby/webgrind]: https://hub.docker.com/r/wodby/webgrind
-[blackfire/blackfire]: https://hub.docker.com/r/blackfire/blackfire
-[wodby/rsyslog]: https://hub.docker.com/r/wodby/rsyslog
-[arachnysdocker/athenapdf-service]: https://hub.docker.com/r/arachnysdocker/athenapdf-service
-[mailhog/mailhog]: https://hub.docker.com/r/mailhog/mailhog
-[wodby/adminer]: https://hub.docker.com/r/wodby/adminer
-[phpmyadmin/phpmyadmin]: https://hub.docker.com/r/phpmyadmin/phpmyadmin
-[portainer/portainer]: https://hub.docker.com/portainer/portainer
-[_/node]: https://hub.docker.com/_/node
-[_/traefik]: https://hub.docker.com/_/traefik
-
The Drupal stack consist of the following containers:
-| Container | Versions | Service name | Image | Enabled by default |
-| ---------- | ------------------ | ------------ | ---------------------------------- | ------------------ |
-| Nginx | 1.13, 1.12 | nginx | [wodby/drupal-nginx] | ✓ |
-| Apache | 2.4 | apache | [wodby/php-apache] | |
-| Drupal | 8, 7, 6 | php | [wodby/drupal] | ✓ |
-| PHP | 7.1, 7.0, 5.6, 5.3 | php | [wodby/drupal-php] | |
-| MariaDB | 10.1 | mariadb | [wodby/mariadb] | ✓ |
-| Redis | 3.2, 4.0 | redis | [wodby/redis] | |
-| Varnish | 4.1 | varnish | [wodby/drupal-varnish] | |
-| Solr | 6.x, 5.5, 5.4 | solr | [wodby/drupal-solr] | |
-| Node.js | 1.0 | nodejs | [wodby/drupal-node] | |
-| Memcached | 1.4 | memcached | [wodby/memcached] | |
-| Webgrind | 1.5 | webgrind | [wodby/webgrind] | |
-| Blackfire | latest | blackfire | [blackfire/blackfire] | |
-| Rsyslog | latest | rsyslog | [wodby/rsyslog] | |
-| AthenaPDF | 2.10.0 | athenapdf | [arachnysdocker/athenapdf-service] | |
-| Mailhog | latest | mailhog | [mailhog/mailhog] | ✓ |
-| Adminer | 4.3 | adminer | [wodby/adminer] | |
-| phpMyAdmin | latest | pma | [phpmyadmin/phpmyadmin] | |
-| Node | latest | node | [_/node] | |
-| Portainer | latest | portainer | [portainer/portainer] | ✓ |
-| Traefik | latest | traefik | [_/traefik] | ✓ |
-
-Supported Drupal versions: 8 / 7 / 6
+| Container | Versions | Image | ARM64 support | Enabled by default |
+|-----------------------|-------------------------|-------------------------------------------|---------------|--------------------|
+| [Nginx] | 1.27, 1.26 | [wodby/nginx] | ✓ | ✓ |
+| [Apache] | 2.4 | [wodby/apache] | ✓ | |
+| Drupal CMS | 1 | [wodby/drupal-cms] | ✓ | ✓ |
+| Vanilla Drupal | 11, 10 | [wodby/drupal] | ✓ | |
+| [PHP] | 8.4, 8.3, 8.2, 8.1 | [wodby/drupal-php] | ✓ | |
+| Crond | | [wodby/drupal-php] | ✓ | ✓ |
+| [MariaDB] | 11.4, 10.11, 10.6, 10.5 | [wodby/mariadb] | ✓ | ✓ |
+| [PostgreSQL] | 17, 16, 15, 14, 13 | [wodby/postgres] | ✓ | |
+| [Valkey] | 8, 7 | [wodby/valkey] | ✓ | |
+| [Memcached] | 1 | [wodby/memcached] | ✓ | |
+| [Varnish] | 6.0 | [wodby/varnish] | ✓ | |
+| [Node.js] | 22, 20, 18 | [wodby/node] | ✓ | |
+| [Solr] | 9 | [wodby/solr] | ✓ | |
+| Zookeeper | 3.8 | [zookeeper] | ✓ | |
+| OpenSearch | 2 | [opensearchproject/opensearch] | ✓ | |
+| OpenSearch Dashboards | 2 | [opensearchproject/opensearch-dashboards] | ✓ | |
+| [OpenSMTPD] | 7 | [wodby/opensmtpd] | ✓ | |
+| Mailpit | latest | [axllent/mailpit] | ✓ | ✓ |
+| Gotenberg | latest | [gotenberg/gotenberg] | ✓ | |
+| [Rsyslog] | latest | [wodby/rsyslog] | ✓ | |
+| [Webgrind] | 1 | [wodby/webgrind] | ✓ | |
+| [Xhprof viewer] | latest | [wodby/xhprof] | ✓ | |
+| Adminer | 5 | [wodby/adminer] | ✓ | |
+| phpMyAdmin | latest | [phpmyadmin/phpmyadmin] | | |
+| Selenium chrome | 3.141 | [selenium/standalone-chrome] | | |
+| Traefik | latest | [_/traefik] | ✓ | ✓ |
## Documentation
-Full documentation is available at https://docker4drupal.readthedocs.io.
+Full documentation is available at https://wodby.com/docs/stacks/drupal/local.
+
+## Image's tags
+
+Images' tags format is `[VERSION]-[STABILITY_TAG]` where:
+
+`[VERSION]` is the _version of an application_ (without patch version) running in a container, e.g.
+`wodby/nginx:1.15-x.x.x` where Nginx version is `1.15` and
+`x.x.x` is a stability tag. For some images we include both major and minor version like PHP
+`7.2`, for others we include only major like Valkey `7`.
+
+`[STABILITY_TAG]` is the _version of an image_ that corresponds to a git tag of the image repository, e.g.
+`wodby/mariadb:10.2-3.3.8` has MariaDB `10.2` and stability tag [
+`3.3.8`](https://github.com/wodby/mariadb/releases/tag/3.3.8). New stability tags include patch updates for applications and image's fixes/improvements (new env vars, orchestration actions fixes, etc). Stability tag changes described in the corresponding a git tag description. Stability tags follow [semantic versioning](https://semver.org/).
+
+We highly encourage to use images only with stability tags.
+
+## Maintenance
+
+We regularly update images used in this stack and release them together, see [releases page](https://github.com/wodby/docker4drupal/releases) for full changelog and update instructions. Most of routine updates for images and this project performed by [the bot](https://github.com/wodbot) via scripts located at [wodby/images](https://github.com/wodby/images).
+
+## Beyond local environment
-## Deployment
+Docker4Drupal is a project designed to help you spin up local environment with Docker Compose. If you want to deploy a consistent stack with orchestrations to your own server, check out [Drupal stack](https://wodby.com/stacks/drupal) on Wodby .
-Deploy consistent docker-based Drupal stack with orchestrations to your own server via [ Wodby](https://cloud.wodby.com/stackhub/ada51e9b-2204-45ee-8e49-a4151912a168/detail).
+## Other Docker4x projects
+
+* [docker4php](https://github.com/wodby/docker4php)
+* [docker4laravel](https://github.com/wodby/docker4laravel)
+* [docker4wordpress](https://github.com/wodby/docker4wordpress)
+* [docker4ruby](https://github.com/wodby/docker4ruby)
+* [docker4python](https://github.com/wodby/docker4python)
## License
This project is licensed under the MIT open source license.
+
+[Apache]: https://wodby.com/docs/stacks/drupal/containers#apache
+
+[Drupal CMS]: https://wodby.com/docs/stacks/drupal/containers#php
+
+[Vanilla Drupal]: https://wodby.com/docs/stacks/drupal/containers#php
+
+[MariaDB]: https://wodby.com/docs/stacks/drupal/containers#mariadb
+
+[Memcached]: https://wodby.com/docs/stacks/drupal/containers#memcached
+
+[Nginx]: https://wodby.com/docs/stacks/drupal/containers#nginx
+
+[Node.js]: https://wodby.com/docs/stacks/drupal/containers#nodejs
+
+[OpenSMTPD]: https://wodby.com/docs/stacks/drupal/containers#opensmtpd
+
+[PHP]: https://wodby.com/docs/stacks/drupal/containers#php
+
+[PostgreSQL]: https://wodby.com/docs/stacks/drupal/containers#postgresql
+
+[Redis]: https://wodby.com/docs/stacks/drupal/containers#redis
+
+[Valkey]: https://wodby.com/docs/stacks/valkey/containers#valkey
+
+[Rsyslog]: https://wodby.com/docs/stacks/drupal/containers#rsyslog
+
+[Solr]: https://wodby.com/docs/stacks/drupal/containers#solr
+
+[Varnish]: https://wodby.com/docs/stacks/drupal/containers#varnish
+
+[Webgrind]: https://wodby.com/docs/stacks/drupal/containers#webgrind
+
+[XHProf viewer]: https://wodby.com/docs/stacks/php/containers#xhprof-viewer
+
+[_/traefik]: https://hub.docker.com/_/traefik
+
+[gotenberg/gotenberg]: https://hub.docker.com/r/gotenberg/gotenberg
+
+[axllent/mailpit]: https://hub.docker.com/r/axllent/mailpit
+
+[phpmyadmin/phpmyadmin]: https://hub.docker.com/r/phpmyadmin/phpmyadmin
+
+[selenium/standalone-chrome]: https://hub.docker.com/r/selenium/standalone-chrome
+
+[wodby/adminer]: https://hub.docker.com/r/wodby/adminer
+
+[wodby/apache]: https://github.com/wodby/apache
+
+[wodby/drupal-php]: https://github.com/wodby/drupal-php
+
+[wodby/drupal]: https://github.com/wodby/drupal
+
+[wodby/drupal-cms]: https://github.com/wodby/drupal-cms
+
+[wodby/mariadb]: https://github.com/wodby/mariadb
+
+[wodby/memcached]: https://github.com/wodby/memcached
+
+[wodby/nginx]: https://github.com/wodby/nginx
+
+[wodby/node]: https://github.com/wodby/node
+
+[wodby/opensmtpd]: https://github.com/wodby/opensmtpd
+
+[wodby/postgres]: https://github.com/wodby/postgres
+
+[wodby/valkey]: https://github.com/wodby/valkey
+
+[wodby/rsyslog]: https://hub.docker.com/r/wodby/rsyslog
+
+[wodby/solr]: https://github.com/wodby/solr
+
+[wodby/varnish]: https://github.com/wodby/varnish
+
+[wodby/webgrind]: https://hub.docker.com/r/wodby/webgrind
+
+[wodby/xhprof]: https://hub.docker.com/r/wodby/xhprof
+
+[zookeeper]: https://hub.docker.com/_/zookeeper
+
+[opensearchproject/opensearch]: https://hub.docker.com/r/opensearchproject/opensearch
+
+[opensearchproject/opensearch-dashboards]: https://hub.docker.com/r/opensearchproject/opensearch-dashboards
diff --git a/compose.override.yml b/compose.override.yml
new file mode 100644
index 0000000000..bddf31f1f6
--- /dev/null
+++ b/compose.override.yml
@@ -0,0 +1,27 @@
+services:
+ php:
+ image: wodby/drupal-cms:$DRUPAL_CMS_TAG
+# image: wodby/drupal:$DRUPAL_TAG
+ environment:
+ PHP_FPM_CLEAR_ENV: "no"
+ volumes:
+ - codebase:/var/www/html
+
+ crond:
+ image: wodby/drupal-cms:$DRUPAL_CMS_TAG
+# image: wodby/drupal:$DRUPAL_TAG
+ environment:
+ PHP_FPM_CLEAR_ENV: "no"
+ volumes:
+ - codebase:/var/www/html
+
+ nginx:
+ volumes:
+ - codebase:/var/www/html
+
+# webgrind:
+# volumes:
+# - codebase:/mnt/codebase
+
+volumes:
+ codebase:
diff --git a/compose.yml b/compose.yml
new file mode 100644
index 0000000000..ab985c2508
--- /dev/null
+++ b/compose.yml
@@ -0,0 +1,310 @@
+services:
+ mariadb:
+ image: wodby/mariadb:$MARIADB_TAG
+ container_name: "${PROJECT_NAME}_mariadb"
+ stop_grace_period: 30s
+ environment:
+ MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
+ MYSQL_DATABASE: $DB_NAME
+ MYSQL_USER: $DB_USER
+ MYSQL_PASSWORD: $DB_PASSWORD
+ MYSQL_TRANSACTION_ISOLATION: READ-COMMITTED
+# volumes:
+# - ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here.
+# - /path/to/mariadb/data/on/host:/var/lib/mysql # Use bind mount
+
+ php:
+ image: wodby/drupal-php:$PHP_TAG
+ container_name: "${PROJECT_NAME}_php"
+ environment:
+ # By default xdebug extension also disabled.
+ PHP_EXTENSIONS_DISABLE: xhprof,spx
+ PHP_MAIL_MIXED_LF_AND_CRLF: 'On'
+ # Mailpit:
+ MSMTP_HOST: mailpit
+ MSMTP_PORT: 1025
+# # OpenSMTPD:
+# MSMTP_HOST: opensmtpd
+# MSMTP_PORT: 25
+# DB_HOST: $DB_HOST
+# DB_PORT: $DB_PORT
+# DB_USER: $DB_USER
+# DB_PASSWORD: $DB_PASSWORD
+# DB_NAME: $DB_NAME
+# DB_DRIVER: $DB_DRIVER
+# DRUSH_OPTIONS_URI: "http://${PROJECT_BASE_URL}:${PROJECT_PORT}"
+# PHP_FPM_USER: wodby
+# PHP_FPM_GROUP: wodby
+# COLUMNS: 80 # Set 80 columns for docker exec -it.
+# # Read instructions at https://wodby.com/docs/stacks/php/local/#xdebug
+# PHP_XDEBUG_MODE: debug
+# PHP_XDEBUG_MODE: profile
+# PHP_XDEBUG_USE_COMPRESSION: false
+# PHP_IDE_CONFIG: serverName=my-ide
+# PHP_XDEBUG_IDEKEY: "my-ide"
+# PHP_XDEBUG_LOG: /tmp/php-xdebug.log
+# # PHPUnit Drupal testing configurations
+# SIMPLETEST_BASE_URL: "http://nginx"
+# SIMPLETEST_DB: "${DB_DRIVER}://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}#tests_"
+# MINK_DRIVER_ARGS_WEBDRIVER: '["chrome", {"browserName":"chrome","goog:chromeOptions":{"args":["--disable-gpu","--headless"]}}, "http://chrome:9515"]'
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+ volumes:
+ - ./:/var/www/html:cached
+## Alternative for macOS users: Mutagen https://wodby.com/docs/stacks/drupal/local#docker-for-mac
+# - drupal:/var/www/html
+## For XHProf and Xdebug profiler traces
+# - files:/mnt/files
+
+ crond:
+ init: true
+ image: wodby/drupal-php:$PHP_TAG
+ container_name: "${PROJECT_NAME}_crond"
+ environment:
+ CRONTAB: "0 * * * * drush -r /var/www/html/web cron"
+ command: sudo -E crond -f -d 0
+ volumes:
+ - ./:/var/www/html:cached
+## Alternative for macOS users: Mutagen https://wodby.com/docs/stacks/drupal/local#docker-for-mac
+# - drupal:/var/www/html
+
+ nginx:
+ image: wodby/nginx:$NGINX_TAG
+ container_name: "${PROJECT_NAME}_nginx"
+ depends_on:
+ - php
+ environment:
+ NGINX_STATIC_OPEN_FILE_CACHE: "off"
+ NGINX_ERROR_LOG_LEVEL: debug
+ NGINX_BACKEND_HOST: php
+ NGINX_SERVER_ROOT: /var/www/html/web
+ NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
+ # NGINX_DRUPAL_FILE_PROXY_URL: http://example.com
+ volumes:
+ - ./:/var/www/html:cached
+## Alternative for macOS users: Mutagen https://wodby.com/docs/stacks/drupal/local#docker-for-mac
+# - drupal:/var/www/html
+ labels:
+ - "traefik.http.routers.${PROJECT_NAME}_nginx.rule=Host(`${PROJECT_BASE_URL}`)"
+
+ mailpit:
+ image: axllent/mailpit
+ container_name: "${PROJECT_NAME}_mailpit"
+ labels:
+ - "traefik.http.services.${PROJECT_NAME}_mailpit.loadbalancer.server.port=8025"
+ - "traefik.http.routers.${PROJECT_NAME}_mailpit.rule=Host(`mailpit.${PROJECT_BASE_URL}`)"
+
+# postgres:
+# image: wodby/postgres:$POSTGRES_TAG
+# container_name: "${PROJECT_NAME}_postgres"
+# stop_grace_period: 30s
+# environment:
+# POSTGRES_PASSWORD: $DB_PASSWORD
+# POSTGRES_DB: $DB_NAME
+# POSTGRES_USER: $DB_USER
+# POSTGRES_DB_EXTENSIONS: pg_trgm
+# volumes:
+# - ./postgres-init:/docker-entrypoint-initdb.d # Place init file(s) here.
+# - /path/to/postgres/data/on/host:/var/lib/postgresql/data # Use bind mount
+# healthcheck:
+# test: netstat -an | grep $DB_PORT > /dev/null; if [ 0 != $? ]; then exit 1; fi;
+# interval: 10s
+# timeout: 15s
+# retries: 15
+
+# apache:
+# image: wodby/apache:$APACHE_TAG
+# container_name: "${PROJECT_NAME}_apache"
+# depends_on:
+# - php
+# environment:
+# APACHE_LOG_LEVEL: debug
+# APACHE_BACKEND_HOST: php
+# APACHE_VHOST_PRESET: php
+# APACHE_DOCUMENT_ROOT: /var/www/html/web
+# volumes:
+# - ./:/var/www/html:cached
+## Alternative for macOS users: Mutagen https://wodby.com/docs/stacks/drupal/local#docker-for-mac
+# - drupal:/var/www/html
+
+# labels:
+# - "traefik.http.routers.${PROJECT_NAME}_apache.rule=Host(`${PROJECT_BASE_URL}`)"
+
+# varnish:
+# image: wodby/varnish:$VARNISH_TAG
+# container_name: "${PROJECT_NAME}_varnish"
+# depends_on:
+# - nginx
+# environment:
+# VARNISH_SECRET: secret
+# VARNISH_BACKEND_HOST: nginx
+# VARNISH_BACKEND_PORT: 80
+# VARNISH_CONFIG_PRESET: drupal
+# VARNISH_ALLOW_UNRESTRICTED_PURGE: 1
+# labels:
+# - "traefik.http.services.${PROJECT_NAME}_varnish.loadbalancer.server.port=6081"
+# - "traefik.http.routers.${PROJECT_NAME}_varnish.rule=Host(`varnish.${PROJECT_BASE_URL}`)"
+
+# valkey:
+# container_name: "${PROJECT_NAME}_valkey"
+# image: wodby/valkey:$VALKEY_TAG
+
+# adminer:
+# container_name: "${PROJECT_NAME}_adminer"
+# init: true
+# image: wodby/adminer:$ADMINER_TAG
+# environment:
+# # For PostgreSQL:
+# # ADMINER_DEFAULT_DB_DRIVER: pgsql
+# ADMINER_DEFAULT_DB_HOST: $DB_HOST
+# ADMINER_DEFAULT_DB_NAME: $DB_NAME
+# labels:
+# - "traefik.http.routers.${PROJECT_NAME}_adminer.rule=Host(`adminer.${PROJECT_BASE_URL}`)"
+
+# pma:
+# image: phpmyadmin/phpmyadmin
+# container_name: "${PROJECT_NAME}_pma"
+# environment:
+# PMA_HOST: $DB_HOST
+# PMA_USER: $DB_USER
+# PMA_PASSWORD: $DB_PASSWORD
+# UPLOAD_LIMIT: 1G
+# labels:
+# - "traefik.http.routers.${PROJECT_NAME}_pma.rule=Host(`pma.${PROJECT_BASE_URL}`)"
+
+# solr:
+# image: wodby/solr:$SOLR_TAG
+# container_name: "${PROJECT_NAME}_solr"
+# environment:
+# SOLR_OPTS: "-Dsolr.config.lib.enabled=true"
+# SOLR_MODULES: extraction,langid,ltr,analysis-extras
+# ZK_HOST: zookeeper:2181
+# SOLR_HEAP: 1024m
+# depends_on:
+# - zookeeper
+# labels:
+# - "traefik.http.services.${PROJECT_NAME}_solr.loadbalancer.server.port=8983"
+# - "traefik.http.routers.${PROJECT_NAME}_solr.rule=Host(`solr.${PROJECT_BASE_URL}`)"
+
+# zookeeper:
+# image: zookeeper:$ZOOKEEPER_TAG
+# container_name: "${PROJECT_NAME}_zookeeper"
+# environment:
+# ZOO_MY_ID: 1
+# ZOO_SERVERS: server.1=zookeeper:2888:3888;2181
+# ZOO_4LW_COMMANDS_WHITELIST: mntr, conf, ruok
+
+# memcached:
+# container_name: "${PROJECT_NAME}_memcached"
+# image: wodby/memcached:$MEMCACHED_TAG
+
+# rsyslog:
+# container_name: "${PROJECT_NAME}_rsyslog"
+# image: wodby/rsyslog:$RSYSLOG_TAG
+
+# gotenberg:
+# image: gotenberg/gotenberg
+# container_name: "${PROJECT_NAME}_gotenberg"
+
+# node:
+# image: wodby/node:$NODE_TAG
+# container_name: "${PROJECT_NAME}_node"
+# working_dir: /var/www/html/path/to/theme/to/build
+# labels:
+# - "traefik.http.services.${PROJECT_NAME}_node.loadbalancer.server.port=3000"
+# - "traefik.http.routers.${PROJECT_NAME}_node.rule=Host(`node.${PROJECT_BASE_URL}`)"
+# expose:
+# - "3000"
+# volumes:
+# - ./:/var/www/html
+# command: sh -c 'yarn install && yarn run start'
+
+# webgrind:
+# image: wodby/webgrind:$WEBGRIND_TAG
+# container_name: "${PROJECT_NAME}_webgrind"
+# environment:
+# WEBGRIND_PROFILER_DIR: /mnt/files/xdebug
+# labels:
+# - "traefik.http.routers.${PROJECT_NAME}_webgrind.rule=Host(`webgrind.${PROJECT_BASE_URL}`)"
+# volumes:
+# - files:/mnt/files
+# - ./:/mnt/codebase:cached
+
+# opensearch:
+# image: opensearchproject/opensearch:$OPENSEARCH_TAG
+# environment:
+# "discovery.type": "single-node"
+# "plugins.security.disabled": true
+# OPENSEARCH_INITIAL_ADMIN_PASSWORD: $OPENSEARCH_ADMIN_PASSWORD
+#
+# opensearch-dashboards:
+# image: opensearchproject/opensearch-dashboards:$OPENSEARCH_TAG
+# environment:
+# OPENSEARCH_HOSTS: '["http://opensearch:9200"]'
+# DISABLE_SECURITY_DASHBOARDS_PLUGIN: true
+# depends_on:
+# - opensearch
+# labels:
+# - "traefik.http.services.${PROJECT_NAME}_opensearch.loadbalancer.server.port=5601"
+# - "traefik.http.routers.${PROJECT_NAME}_opensearch.rule=Host(`opensearch.${PROJECT_BASE_URL}`)"
+
+# opensmtpd:
+# container_name: "${PROJECT_NAME}_opensmtpd"
+# image: wodby/opensmtpd:$OPENSMTPD_TAG
+
+# xhprof:
+# image: wodby/xhprof:$XHPROF_TAG
+# container_name: "${PROJECT_NAME}_xhprof"
+# restart: always
+# volumes:
+# - files:/mnt/files
+# labels:
+# - "traefik.http.routers.${PROJECT_NAME}_xhprof.rule=Host(`xhprof.${PROJECT_BASE_URL}`)"
+
+# chrome:
+# image: selenium/standalone-chrome:$SELENIUM_CHROME_TAG
+# container_name: "${PROJECT_NAME}_chrome"
+# volumes:
+# - /dev/shm:/dev/shm
+# entrypoint:
+# - chromedriver
+# - "--no-sandbox"
+# - "--disable-dev-shm-usage"
+# - "--log-path=/tmp/chromedriver.log"
+# - "--verbose"
+# - "--whitelisted-ips="
+
+ traefik:
+ image: traefik:v2.0
+ container_name: "${PROJECT_NAME}_traefik"
+ command: --api.insecure=true --providers.docker
+ ports:
+ - "${PROJECT_PORT}:80"
+# - '8080:8080' # Dashboard
+ volumes:
+ - /var/run/docker.sock:/var/run/docker.sock
+
+#x-mutagen:
+# sync:
+# defaults:
+# ignore:
+# vcs: true
+# paths:
+# - .DS_Store
+# - .history
+# - .idea
+# drupal:
+# alpha: "."
+# beta: "volume://drupal"
+# configurationBeta:
+# permissions:
+# defaultFileMode: 0644
+# defaultDirectoryMode: 0755
+# defaultOwner: "id:501"
+# defaultGroup: "id:20"
+
+volumes:
+## For macOS users (Mutagen)
+# drupal:
+# For Xdebug profiler
+ files:
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index 4cf3a953e0..0000000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,239 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: wodby/mariadb:10.1-2.3.5
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-# volumes:
-# - ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here.
-# - /path/to/mariadb/data/on/host:/var/lib/mysql # I want to manage volumes manually.
-
- php:
-# 1. Images with vanilla Drupal – wodby/drupal:[DRUPAL_VERSION]-[PHP_VERSION]-[STABILITY_TAG].
- image: wodby/drupal:8-7.1-3.0.0
-# image: wodby/drupal:8-7.0-3.0.0
-# image: wodby/drupal:7-7.1-3.0.0
-# image: wodby/drupal:7-7.0-3.0.0
-# image: wodby/drupal:7-5.6-3.0.0
-# image: wodby/drupal:6-5.6-3.0.0
-# image: wodby/drupal:6-5.3-3.0.0
-# 2. Images without Drupal – wodby/drupal-php:[PHP_VERSION]-[STABILITY_TAG].
-# image: wodby/drupal-php:7.1-3.0.0
-# image: wodby/drupal-php:7.0-3.0.0
-# image: wodby/drupal-php:5.6-3.0.0
-# image: wodby/drupal-php:5.3-3.0.0
- environment:
- PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025
- PHP_FPM_CLEAR_ENV: "no"
- DB_HOST: mariadb
- DB_USER: drupal
- DB_PASSWORD: drupal
- DB_NAME: drupal
- DB_DRIVER: mysql
-# PHP_XDEBUG: 1
-# PHP_XDEBUG_DEFAULT_ENABLE: 1
-# PHP_XDEBUG_REMOTE_CONNECT_BACK: 0
-# PHP_XDEBUG_REMOTE_HOST: "10.254.254.254"
-# PHP_XDEBUG_PROFILER_OUTPUT_DIR: /mnt/files/xdebug/profiler
-# PHP_XDEBUG_TRACE_OUTPUT_DIR: /mnt/files/xdebug/traces
-# PHP_BLACKFIRE: 1
- volumes:
- - codebase:/var/www/html
-## Options for macOS users (https://docker4drupal.readthedocs.io/en/latest/macos)
-# - codebase:/var/www/html:cached # User-guided caching
-# - docker-sync:/var/www/html # Docker-sync
-## For Xdebug profiler files
-# - files:/mnt/files
-
- nginx:
-# wodby/drupal-nginx:[DRUPAL_VERSION]-[NGINX_VERSION]-[STABILITY_TAG].
- image: wodby/drupal-nginx:8-1.13-3.0.1
-# image: wodby/drupal-nginx:7-1.13-3.0.1
-# image: wodby/drupal-nginx:6-1.13-3.0.1
-# image: wodby/drupal-nginx:8-1.12-3.0.1
-# image: wodby/drupal-nginx:7-1.12-3.0.1
-# image: wodby/drupal-nginx:6-1.12-3.0.1
- depends_on:
- - php
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
-# Options for macOS users (https://docker4drupal.readthedocs.io/en/latest/macos)
-# - codebase:/var/www/html:cached # User-guided caching
-# - docker-sync:/var/www/html # Docker-sync
- labels:
- - 'traefik.backend=nginx'
- - 'traefik.port=80'
- - 'traefik.frontend.rule=Host:drupal.docker.localhost'
-
-# apache:
-# image: wodby/php-apache:2.4-2.0.0
-# depends_on:
-# - php
-# environment:
-# APACHE_LOG_LEVEL: debug
-# APACHE_BACKEND_HOST: php
-# APACHE_SERVER_ROOT: /var/www/html/web
-# volumes:
-# - codebase:/var/www/html
-## Options for macOS users (https://docker4drupal.readthedocs.io/en/latest/macos)
-## - codebase:/var/www/html:cached # User-guided caching
-## - docker-sync:/var/www/html # Docker-sync
-# labels:
-# - 'traefik.backend=apache'
-# - 'traefik.port=80'
-# - 'traefik.frontend.rule=Host:drupal.docker.localhost'
-
-# varnish:
-# image: wodby/drupal-varnish:4.1-2.2.0
-# depends_on:
-# - nginx
-# environment:
-# VARNISH_SECRET: secret
-# VARNISH_BACKEND_HOST: nginx
-# VARNISH_BACKEND_PORT: 80
-# labels:
-# - 'traefik.backend=varnish'
-# - 'traefik.port=6081'
-# - 'traefik.frontend.rule=Host:varnish.drupal.docker.localhost'
-
-# redis:
-# image: wodby/redis:3.2-2.1.3
-## image: wodby/redis:4.0-2.1.3
-
-# adminer:
-# image: wodby/adminer:4.3-1.1.0
-# environment:
-# ADMINER_SALT: adminer-salt
-# labels:
-# - 'traefik.backend=adminer'
-# - 'traefik.port=9000'
-# - 'traefik.frontend.rule=Host:adminer.drupal.docker.localhost'
-
-# pma:
-# image: phpmyadmin/phpmyadmin
-# environment:
-# PMA_HOST: mariadb
-# PMA_USER: drupal
-# PMA_PASSWORD: drupal
-# PHP_UPLOAD_MAX_FILESIZE: 1G
-# PHP_MAX_INPUT_VARS: 1G
-# labels:
-# - 'traefik.backend=pma'
-# - 'traefik.port=80'
-# - 'traefik.frontend.rule=Host:pma.drupal.docker.localhost'
-
-# solr:
-## wodby/drupal-solr:[DRUPAL_VERSION]-[SOLR_VERSION]-[STABILITY_TAG].
-# image: wodby/drupal-solr:8-6.6-2.2.0
-## image: wodby/drupal-solr:8-6.5-2.2.0
-## image: wodby/drupal-solr:8-6.4-2.2.0
-## image: wodby/drupal-solr:8-6.3-2.2.0
-## image: wodby/drupal-solr:8-5.5-2.2.0
-## image: wodby/drupal-solr:7-5.4-2.2.0
-# environment:
-# SOLR_HEAP: 1024m
-# labels:
-# - 'traefik.backend=solr'
-# - 'traefik.port=8983'
-# - 'traefik.frontend.rule=Host:solr.drupal.docker.localhost'
-
- mailhog:
- image: mailhog/mailhog
- labels:
- - 'traefik.backend=mailhog'
- - 'traefik.port=8025'
- - 'traefik.frontend.rule=Host:mailhog.drupal.docker.localhost'
-
-# nodejs:
-# image: wodby/drupal-node:1.0-1.0.0
-# environment:
-# NODE_SERVICE_KEY: node-service-key
-# labels:
-# - 'traefik.backend=nodejs'
-# - 'traefik.port=8080'
-# - 'traefik.frontend.rule=Host:nodejs.drupal.docker.localhost'
-# volumes:
-# - ./path/to/your/single-page-app:/app
-# command: sh -c 'npm install && npm run start'
-
-# node:
-# image: node:alpine
-# working_dir: /app
-# labels:
-# - 'traefik.backend=node'
-# - 'traefik.port=3000'
-# - 'traefik.frontend.rule=Host:front.drupal.docker.localhost'
-# expose:
-# - "3000"
-# volumes:
-# - ./path/to/your/single-page-app:/app
-# command: sh -c 'npm install && npm run start'
-
-# memcached:
-# image: wodby/memcached:1.4-2.0.0
-
-# rsyslog:
-# image: wodby/rsyslog
-
-# athenapdf:
-# image: arachnysdocker/athenapdf-service:2.10.0
-# environment:
-# WEAVER_AUTH_KEY: weaver-auth-key
-# WEAVER_ATHENA_CMD: "athenapdf -S"
-# WEAVER_MAX_WORKERS: 10
-# WEAVER_MAX_CONVERSION_QUEUE: 50
-# WEAVER_WORKER_TIMEOUT: 90
-# WEAVER_CONVERSION_FALLBACK: false
-
-# blackfire:
-# image: blackfire/blackfire
-# environment:
-# BLACKFIRE_SERVER_ID: XXXXX
-# BLACKFIRE_SERVER_TOKEN: YYYYY
-
-# webgrind:
-# image: wodby/webgrind:1.5-1.0.0
-# environment:
-# WEBGRIND_PROFILER_DIR: /mnt/files/xdebug/profiler
-# labels:
-# - 'traefik.backend=webgrind'
-# - 'traefik.port=8080'
-# - 'traefik.frontend.rule=Host:webgrind.drupal.docker.localhost'
-# volumes:
-# - files:/mnt/files
-
- portainer:
- image: portainer/portainer
- command: --no-auth -H unix:///var/run/docker.sock
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
- labels:
- - 'traefik.backend=portainer'
- - 'traefik.port=9000'
- - 'traefik.frontend.rule=Host:portainer.drupal.docker.localhost'
-
- traefik:
- image: traefik
- command: -c /dev/null --web --docker --logLevel=INFO
- ports:
- - '8000:80'
-# - '8080:8080' # Dashboard
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock
-
-volumes:
- codebase:
-## Docker-sync for macOS users
-# docker-sync:
-# external: true
-## For Xdebug profiler
-# files:
diff --git a/docker-sync.yml b/docker-sync.yml
deleted file mode 100644
index a715f635a8..0000000000
--- a/docker-sync.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-version: "2"
-
-syncs:
- docker-sync:
- src: './'
- sync_userid: '82'
- sync_excludes: ['.gitignore', '.git/', '.idea/']
-# docker-sync-another-project:
-# src: '/absolute/path/to/project/codebase'
-# sync_userid: '82'
-# sync_excludes: ['.gitignore', '.git/', '.idea/']
diff --git a/docker.mk b/docker.mk
new file mode 100644
index 0000000000..788454f006
--- /dev/null
+++ b/docker.mk
@@ -0,0 +1,89 @@
+include .env
+
+default: up
+
+COMPOSER_ROOT ?= /var/www/html
+DRUPAL_ROOT ?= /var/www/html/web
+
+## help : Print commands help.
+.PHONY: help
+ifneq (,$(wildcard docker.mk))
+help : docker.mk
+ @sed -n 's/^##//p' $<
+else
+help : Makefile
+ @sed -n 's/^##//p' $<
+endif
+
+## up : Start up containers.
+.PHONY: up
+up:
+ @echo "Starting up containers for $(PROJECT_NAME)..."
+ docker compose pull
+ docker compose up -d --remove-orphans
+
+.PHONY: mutagen
+mutagen:
+ mutagen-compose up
+
+## down : Stop containers.
+.PHONY: down
+down: stop
+
+## start : Start containers without updating.
+.PHONY: start
+start:
+ @echo "Starting containers for $(PROJECT_NAME) from where you left off..."
+ @docker compose start
+
+## stop : Stop containers.
+.PHONY: stop
+stop:
+ @echo "Stopping containers for $(PROJECT_NAME)..."
+ @docker compose stop
+
+## prune : Remove containers and their volumes.
+## You can optionally pass an argument with the service name to prune single container
+## prune mariadb : Prune `mariadb` container and remove its volumes.
+## prune mariadb solr : Prune `mariadb` and `solr` containers and remove their volumes.
+.PHONY: prune
+prune:
+ @echo "Removing containers for $(PROJECT_NAME)..."
+ @docker compose down -v $(filter-out $@,$(MAKECMDGOALS))
+
+## ps : List running containers.
+.PHONY: ps
+ps:
+ @docker ps --filter name='$(PROJECT_NAME)*'
+
+## shell : Access `php` container via shell.
+## You can optionally pass an argument with a service name to open a shell on the specified container
+.PHONY: shell
+shell:
+ docker exec -ti -e COLUMNS=$(shell tput cols) -e LINES=$(shell tput lines) $(shell docker ps --filter name='$(PROJECT_NAME)_$(or $(filter-out $@,$(MAKECMDGOALS)), 'php')' --format "{{ .ID }}") sh
+
+## composer : Executes `composer` command in a specified `COMPOSER_ROOT` directory (default is `/var/www/html`).
+## To use "--flag" arguments include them in quotation marks.
+## For example: make composer "update drupal/core --with-dependencies"
+.PHONY: composer
+composer:
+ docker exec $(shell docker ps --filter name='^/$(PROJECT_NAME)_php' --format "{{ .ID }}") composer --working-dir=$(COMPOSER_ROOT) $(filter-out $@,$(MAKECMDGOALS))
+
+## drush : Executes `drush` command in a specified `DRUPAL_ROOT` directory (default is `/var/www/html/web`).
+## To use "--flag" arguments include them in quotation marks.
+## For example: make drush "watchdog:show --type=cron"
+.PHONY: drush
+drush:
+ docker exec $(shell docker ps --filter name='^/$(PROJECT_NAME)_php' --format "{{ .ID }}") drush -r $(DRUPAL_ROOT) $(filter-out $@,$(MAKECMDGOALS))
+
+## logs : View containers logs.
+## You can optinally pass an argument with the service name to limit logs
+## logs php : View `php` container logs.
+## logs nginx php : View `nginx` and `php` containers logs.
+.PHONY: logs
+logs:
+ @docker compose logs -f $(filter-out $@,$(MAKECMDGOALS))
+
+# https://stackoverflow.com/a/6273809/1826109
+%:
+ @:
diff --git a/docs/access.md b/docs/access.md
deleted file mode 100644
index b30fb0ce47..0000000000
--- a/docs/access.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Accessing containers
-
-You can connect to any container by executing the following command:
-```bash
-$ docker-compose exec [service] sh
-```
-
-Make sure you're using correct users to access the container, e.g. use user www-data (82) for Nginx and PHP containers:
-```bash
-$ docker-compose exec php sh
-```
diff --git a/docs/containers/apache.md b/docs/containers/apache.md
deleted file mode 100644
index 33dd381069..0000000000
--- a/docs/containers/apache.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Apache
-
-To set apache as a default container uncomment apache service definition and comment nginx service definition.
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/php-apache).
diff --git a/docs/containers/athenapdf.md b/docs/containers/athenapdf.md
deleted file mode 100644
index cf16c72ca3..0000000000
--- a/docs/containers/athenapdf.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# AthenaPDF
-
-AthenaPDF is a drop-in replacement for wkhtmltopdf
-
-Usage:
-
-```bash
-$ curl http://athenapdf:8080/convert\?auth\=wodby-athenapdf\&url\=http://google.com/ |> out.pdf
-```
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/arachnys/athenapdf/blob/master/weaver/conf/sample.env).
\ No newline at end of file
diff --git a/docs/containers/blackfire.md b/docs/containers/blackfire.md
deleted file mode 100644
index 9e3e3bb259..0000000000
--- a/docs/containers/blackfire.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# Blackfire
-
-You can profile your Drupal application via blackfire.io by following the next steps:
-
-* Enable blackfire probe extension by uncommenting the environment variable `PHP_BLACKFIRE: 1` in the PHP (Drupal) service
-* Uncomment `blackfire` agent service in your docker compose file
-* Specify values for `BLACKFIRE_SERVER_ID` and `BLACKFIRE_SERVER_TOKEN` environment variables (you can acquire them from your blackfire.io profile)
-* Install blackfire companion extension for [Chrome](https://blackfire.io/docs/integrations/chrome) or [Firefox](https://blackfire.io/docs/integrations/firefox)
-* Start profiling your app via the extension and see data from blackfire.io dashboard
-
-Fore more details please refer to the official documentation: https://blackfire.io/docs/introduction
diff --git a/docs/containers/mariadb.md b/docs/containers/mariadb.md
deleted file mode 100644
index f2dfab941e..0000000000
--- a/docs/containers/mariadb.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# MariaDB
-
-MariaDB uses a persistent volume defined in Dockerfile.
-
-IMPORTANT: Do not use `docker-compose down` command because it will purge MariaDB volume. Instead use `docker-compose stop`. If you restart Docker you WILL NOT lose your MariaDB data.
-
-## Import existing database
-
-if you want to import your database, uncomment the following line in the compose file:
-```yml
-# - ./mariadb-init:/docker-entrypoint-initdb.d # Place init .sql file(s) here
-```
-
-Create the volume directory `./mariadb-init` in the same directory as the compose file and put there your SQL file(s). All SQL files will be automatically imported once MariaDB container has started.
-
-## Export
-
-Exporting all databases:
-```bash
-docker-compose exec mariadb sh -c 'exec mysqldump --all-databases -uroot -p"root-password"' > databases.sql
-```
-
-Exporting a specific database:
-```bash
-docker-compose exec mariadb sh -c 'exec mysqldump -uroot -p"root-password" my-db' > my-db.sql
-```
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/mariadb).
diff --git a/docs/containers/memcached.md b/docs/containers/memcached.md
deleted file mode 100644
index 442d5f903f..0000000000
--- a/docs/containers/memcached.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Memcached
-
-To spin up a container with Memcached and use it as a default cache storage follow these steps:
-
-1. Uncomment lines with memcached service definition in the compose file.
-2. Download and install [memcache module](https://www.drupal.org/project/memcache)
-3. Add the following lines to the settings.php file:
-
-## Drupal 7
-
-```php
-$conf['memcache_extension'] = 'memcached';
-$conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc';
-$conf['lock_inc'] = 'sites/all/modules/memcache/memcache-lock.inc';
-$conf['memcache_stampede_protection'] = TRUE;
-$conf['cache_default_class'] = 'MemCacheDrupal';
-$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
-$conf['memcache_servers'] = array('memcached:11211' => 'default');
-```
-## Drupal 8
-
-You _must enable the module_ before you do this.
-```php
-$settings['memcache']['servers'] = ['memcached:11211' => 'default'];
-$settings['cache']['default'] = 'cache.backend.memcache';
-```
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/memcached).
diff --git a/docs/containers/nginx.md b/docs/containers/nginx.md
deleted file mode 100644
index bbef37f77f..0000000000
--- a/docs/containers/nginx.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Nginx
-
-Nginx is being used as a default http server.
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/drupal-nginx).
-
diff --git a/docs/containers/nodejs.md b/docs/containers/nodejs.md
deleted file mode 100644
index 3537a6864b..0000000000
--- a/docs/containers/nodejs.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Node.js
-
-Server app for the [Node.js Integration Drupal module](https://www.drupal.org/project/nodejs)
-
-## Integration
-
-1. Install [Node.js Integration Drupal module](https://www.drupal.org/project/nodejs) on your site
-2. Visit the Node.js configuration page under the Configuration menu, and enter the connection information for your Node.js server application. Set host to `node` and service key to `node-service-key` (can be changed in the compose file).
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/drupal-node).
diff --git a/docs/containers/php.md b/docs/containers/php.md
deleted file mode 100644
index bf8f6d1afe..0000000000
--- a/docs/containers/php.md
+++ /dev/null
@@ -1,95 +0,0 @@
-# PHP
-
-PHP is used with Nginx via PHP-FPM.
-
-## Drush
-
-PHP container has installed drush. When running drush make sure to open the shell as user 82 (www-data) to avoid access problems in the web server, which is running as user 82, too:
-```bash
-$ docker-compose exec php drush
-```
-
-Also, you can use preconfigured drush alias @dev:
-```bash
-$ docker-compose exec php drush @dev
-```
-
-## Composer
-
-PHP container has installed composer. Example:
-```bash
-$ docker-compose exec php composer update
-```
-
-## Drupal Console
-
-PHP container has installed drupal launcher. Drupal console itself must be installed per project manually via composer.
-
-## Xdebug
-
-If you want to use Xdebug, uncomment this line to enable it in the compose file before starting containers:
-```yml
-PHP_XDEBUG: 1 # Enable Xdebug extension
-PHP_XDEBUG_DEFAULT_ENABLE: 1 # Comment out to disable (default).
-```
-
-If you would like to autostart xdebug, uncomment this line:
-```yml
-PHP_XDEBUG_REMOTE_AUTOSTART: 1 # Comment out to disable (default).
-```
-
-### Xdebug on Mac OS X
-
-There are two more things that need to be done on macOS in order to have Xdebug working (because there's no docker0 interface). Enable Xdebug as described in the previous section and uncomment the following two lines:
-
-```yml
-PHP_XDEBUG_REMOTE_CONNECT_BACK: 0 # Disabled for remote.host to work (enabled by default)
-PHP_XDEBUG_REMOTE_HOST: "10.254.254.254" # Setting the host (localhost by default)
-```
-
-You also need to have loopback alias with IP from above. You need this only once and that settings stays active until logout or restart.
-
-```bash
-sudo ifconfig lo0 alias 10.254.254.254
-```
-To add the loopback alias after a reboot, add the following contents to /Library/LaunchDaemons/docker4drupal.loopback.plist
-
-```xml
-
-
- Label
- Default Loopback alias
- ProgramArguments
-
- /sbin/ifconfig
- lo0
- alias
- 10.254.254.254
- netmask
- 255.255.255.0
-
- RunAtLoad
-
-
-
-```
-
-### Xdebug on Windows
-
-You should do same things as for Mac OS. Enable Xdebug as described in the previous 2 sections and replace value of _PHP_XDEBUG_REMOTE_HOST_ to your DockerNAT ip assigned (by default it should be 10.0.75.1):
-
-```yml
-PHP_XDEBUG_REMOTE_HOST: "10.0.75.1" # Setting the host (localhost by default)
-```
-
-You also need to check firewall not to block your connection. Disabling firewall should help.
-
-## PHPUnit
-
-1. Inside your drupal/core directory, copy the file `phpunit.xml.dist` and rename it to `phpunit.xml`
-2. Open that file and make sure that you update `SIMPLETEST_BASE_URL` to `http://nginx`
-3. In order to make sure that your DB connection is working as well, update `SIMPLETEST_DB` to `mysql://drupal:drupal@mariadb/drupal`
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/drupal-php).
diff --git a/docs/containers/redis.md b/docs/containers/redis.md
deleted file mode 100644
index 5dbdf59aeb..0000000000
--- a/docs/containers/redis.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Redis
-
-## Integration
-
-To spin up a container with Redis cache and use it as a default cache storage follow these steps:
-
-1. Uncomment lines with redis service definition in the compose file.
-2. Download and install [redis module](https://www.drupal.org/project/redis)
-3. Add the following lines to the settings.php file:
-
-DRUPAL 7:
-
-```php
-$contrib_path = is_dir('sites/all/modules/contrib') ? 'sites/all/modules/contrib' : 'sites/all/modules';
-
-$conf['redis_client_base'] = 0;
-$conf['redis_client_interface'] = 'PhpRedis';
-$conf['lock_inc'] = $contrib_path . '/redis/redis.lock.inc';
-$conf['path_inc'] = $contrib_path . '/redis/redis.path.inc';
-$conf['cache_backends'][] = $contrib_path . '/redis/redis.autoload.inc';
-$conf['cache_default_class'] = 'Redis_Cache';
-$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
-$conf['redis_client_host'] = 'redis';
-$conf['redis_client_port'] = '6379';
-```
-
-DRUPAL 8:
-
-```php
-$contrib_path = is_dir('modules/contrib') ? 'modules/contrib' : 'modules';
-
-$settings['redis.connection']['host'] = 'redis';
-$settings['redis.connection']['port'] = '6379';
-$settings['redis.connection']['password'] = '';
-$settings['redis.connection']['base'] = 0;
-$settings['redis.connection']['interface'] = 'PhpRedis';
-$settings['cache']['default'] = 'cache.backend.redis';
-$settings['cache']['bins']['bootstrap'] = 'cache.backend.chainedfast';
-$settings['cache']['bins']['discovery'] = 'cache.backend.chainedfast';
-$settings['cache']['bins']['config'] = 'cache.backend.chainedfast';
-
-$settings['container_yamls'][] = $contrib_path . '/redis/example.services.yml';
-```
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/redis).
diff --git a/docs/containers/rsyslog.md b/docs/containers/rsyslog.md
deleted file mode 100644
index 7a5bf32b0d..0000000000
--- a/docs/containers/rsyslog.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# Rsyslog container
-
-Rsyslog can be used to stream your applications logs (watchdog). It's similar to using syslog, however there's no syslog in PHP container (one process per container). Rsyslog will stream all incoming logs to a container output.
-
-Here how you can use it with Monolog (Drupal 8):
-
-1. Install [monolog module](https://www.drupal.org/project/monolog). Make sure all dependencies being downloaded
-2. Add new handler at `monolog/monolog.services.yml`:
-```yml
-monolog.handler.rsyslog:
- class: Monolog\Handler\SyslogUdpHandler
- arguments: ['rsyslog']
-```
-3. Rebuild cache (`drush cr`)
-4. Use `rsyslog` handler for your channels
-5. Find your logs in [rsyslog container output](../logs.md)
-
-Read [Logging in Drupal 8](https://www.wellnet.it/en/blog/logging-drupal-8) to learn more.
diff --git a/docs/containers/solr.md b/docs/containers/solr.md
deleted file mode 100644
index 21117239ab..0000000000
--- a/docs/containers/solr.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# Solr
-
-To spin up a container with Apache Solr search engine uncomment lines with solr service definition in the compose file.
-
-By default, Solr admin UI can be accessed by [http://solr.drupal.docker.localhost:8000](http://solr.drupal.docker.localhost:8000). Solr container has a persistent volume defined in Dockerfile, so your data won't be lost if you stop the container. Solr cores can be found under `/opt/solr/server/solr`.
-
-## Integration with Search API Solr module
-
-1. Create new solr core `docker exec -ti [ID] make core=core1 -f /usr/local/bin/actions.mk`. The new core will already include config files from Search API Solr module
-2. Download and enable [Search API Solr module](https://www.drupal.org/project/search_api_solr)
-3. Open module configuration page and add a new search server
-4. Choose Solr as a backend and _Standard_ Solr Connector
-5. Specify `solr` as a Solr host, `8983` as a port, `/solr` as a solr path and your core name (`core1` from step 1)
-6. That's it! Now Drupal should be connected to our Solr backend
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/drupal-solr).
\ No newline at end of file
diff --git a/docs/containers/varnish.md b/docs/containers/varnish.md
deleted file mode 100644
index 4b2868aece..0000000000
--- a/docs/containers/varnish.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Varnish
-
-## Integration
-
-### Drupal 7
-
-To spin up a container with Varnish cache and use it as a cache solution follow these steps:
-
-1. Uncomment lines with varnish service definition in the compose file.
-2. Download and install [varnish module](https://www.drupal.org/project/varnish)
-3. Add the following lines to the settings.php file:
-
-```php
-$conf['varnish_version'] = 4;
-$conf['varnish_control_terminal'] = 'varnish:6082';
-$conf['varnish_control_key'] = 'secret';
-```
-
-### Drupal 8
-
-Read [https://wunderkraut.se/blogg/purge-cachetags-varnish](https://wunderkraut.se/blogg/purge-cachetags-varnish).
-
-## Configuration
-
-Configuration is possible via environment variables. See the full list of variables on [GitHub](https://github.com/wodby/drupal-varnish).
diff --git a/docs/containers/webgrind.md b/docs/containers/webgrind.md
deleted file mode 100644
index bab1cc0949..0000000000
--- a/docs/containers/webgrind.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Webgrind
-
-[Webgrind](https://github.com/jokkedk/webgrind) allows you view and analyze Xdebug profiler output and generate call graphs for visualisation.
-
-Usage:
-
-1. Enable Xdebug profiler by uncommenting the following environment variables for `php` service:
-```
-PHP_XDEBUG: 1
-PHP_XDEBUG_PROFILER_ENABLE: 1
-PHP_XDEBUG_PROFILER_ENABLE_TRIGGER: 1
-PHP_XDEBUG_PROFILER_ENABLE_TRIGGER_VALUE: 1
-```
-2. Uncomment `webgrind` service in your docker-compose file
-3. Uncomment `files` volume for `php` service and the definition in global volumes
-4. Add `XDEBUG_PROFILE=1` param to GET or POST request (or set a cookie) you want to profile. Xdebug will generate profile files in `/mnt/files/xdebug/profiler`
-5. Click Update in Webgrind to access the new information. See https://xdebug.org/docs/profiler to learn more about xdebug profiling.
-
-> ! IMPORTANT: Xdebug profiling significantly decreases performance and increases resources usage. DO NOT USE it on Production servers.
diff --git a/docs/domains.md b/docs/domains.md
deleted file mode 100644
index 60b623bda2..0000000000
--- a/docs/domains.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# Domains Configuration
-
-Docker4Drupal uses [traefik](https://hub.docker.com/_/traefik/) container for routing. By default, we use port `8000` to avoid potential conflicts but if port `80` is free on your host machine just replace traefik's ports definition in the compose file.
-
-Add `127.0.0.1 drupal.docker.localhost` to your `/etc/hosts` file (some browsers like Chrome may work without it). Do the same for other default domains you might need from listed below:
-
-| Service | Domain |
-| ------------ | ---------------------------------------------------------------------------------------------- |
-| nginx/apache | [http://drupal.docker.localhost:8000](http://drupal.docker.localhost:8000) |
-| pma | [http://pma.drupal.docker.localhost:8000](http://pma.drupal.docker.localhost:8000) |
-| adminer | [http://adminer.drupal.docker.localhost:8000](http://adminer.drupal.docker.localhost:8000) |
-| mailhog | [http://mailhog.drupal.docker.localhost:8000](http://mailhog.drupal.docker.localhost:8000) |
-| solr | [http://solr.drupal.docker.localhost:8000](http://solr.drupal.docker.localhost:8000) |
-| nodejs | [http://nodejs.drupal.docker.localhost:8000](http://nodejs.drupal.docker.localhost:8000) |
-| node | [http://front.drupal.docker.localhost:8000](http://front.drupal.docker.localhost:8000) |
-| varnish | [http://varnish.drupal.docker.localhost:8000](http://varnish.drupal.docker.localhost:8000) |
-| portainer | [http://portainer.drupal.docker.localhost:8000](http://portainer.drupal.docker.localhost:8000) |
-| webgrind | [http://webgrind.drupal.docker.localhost:8000](http://webgrind.drupal.docker.localhost:8000) |
-
-You can modify domains under labels definition, e.g. `traefik.frontend.rule=Host:mailhog.drupal.docker.localhost`.
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index a4e7f781d8..0000000000
--- a/docs/index.md
+++ /dev/null
@@ -1,126 +0,0 @@
-# Docker4Drupal Getting Started
-
-Docker4Drupal is a set of docker containers optimized for Drupal. Use docker-compose.yml file from [docker4drupal repository](https://github.com/wodby/docker4drupal) to spin up local environment on Linux, Mac OS X and Windows.
-
-Docker4Drupal is designed to be used for local development, if you're looking for a production solution see [using in production](production.md).
-
-## Overview
-
-The Drupal stack consist of the following containers:
-
-[wodby/drupal-nginx]: https://github.com/wodby/drupal-nginx
-[wodby/php-apache]: https://github.com/wodby/php-apache
-[wodby/drupal]: https://github.com/wodby/drupal
-[wodby/drupal-php]: https://github.com/wodby/drupal-php
-[wodby/mariadb]: https://github.com/wodby/mariadb
-[wodby/redis]: https://github.com/wodby/redis
-[wodby/drupal-varnish]: https://github.com/wodby/drupal-varnish
-[wodby/drupal-solr]: https://github.com/wodby/drupal-solr
-[wodby/drupal-node]: https://github.com/wodby/drupal-node
-[wodby/memcached]: https://github.com/wodby/memcached
-[wodby/webgrind]: https://hub.docker.com/r/wodby/webgrind
-[blackfire/blackfire]: https://hub.docker.com/r/blackfire/blackfire
-[wodby/rsyslog]: https://hub.docker.com/r/wodby/rsyslog
-[arachnysdocker/athenapdf-service]: https://hub.docker.com/r/arachnysdocker/athenapdf-service
-[mailhog/mailhog]: https://hub.docker.com/r/mailhog/mailhog
-[wodby/adminer]: https://hub.docker.com/r/wodby/adminer
-[phpmyadmin/phpmyadmin]: https://hub.docker.com/r/phpmyadmin/phpmyadmin
-[portainer/portainer]: https://hub.docker.com/portainer/portainer
-[_/node]: https://hub.docker.com/_/node
-[_/traefik]: https://hub.docker.com/_/traefik
-[Nginx]: containers/nginx.md
-[Apache]: containers/apache.md
-[PHP]: containers/php.md
-[MariaDB]: containers/mariadb.md
-[Redis]: containers/redis.md
-[Varnish]: containers/varnish.md
-[Solr]: containers/solr.md
-[Node.js]: containers/nodejs.md
-[Memcached]: containers/memcached.md
-[Webgrind]: containers/webgrind.md
-[Blackfire]: containers/blackfire.md
-[Rsyslog]: containers/rsyslog.md
-[AthenaPDF]: containers/athenapdf.md
-
-| Container | Versions | Service name | Image | Enabled by default |
-| --------- | ------------------ | ------------ | ---------------------------------- | ------------------ |
-| [Nginx] | 1.13, 1.12 | nginx | [wodby/drupal-nginx] | ✓ |
-| [Apache] | 2.4 | apache | [wodby/php-apache] | |
-| Drupal | 8, 7, 6 | php | [wodby/drupal] | ✓ |
-| [PHP] | 7.1, 7.0, 5.6, 5.3 | php | [wodby/drupal-php] | |
-| [MariaDB] | 10.1 | mariadb | [wodby/mariadb] | ✓ |
-| [Redis] | 3.2, 4.0 | redis | [wodby/redis] | |
-| [Varnish] | 4.1 | varnish | [wodby/drupal-varnish] | |
-| [Solr] | 6.x, 5.5, 5.4 | solr | [wodby/drupal-solr] | |
-| [Node.js] | 1.0 | nodejs | [wodby/drupal-node] | |
-| [Memcached] | 1.4 | memcached | [wodby/memcached] | |
-| [Webgrind] | 1.5 | webgrind | [wodby/webgrind] | |
-| [Blackfire] | latest | blackfire | [blackfire/blackfire] | |
-| [Rsyslog] | latest | rsyslog | [wodby/rsyslog] | |
-| [AthenaPDF] | 2.10.0 | athenapdf | [arachnysdocker/athenapdf-service] | |
-| Mailhog | latest | mailhog | [mailhog/mailhog] | ✓ |
-| Adminer | 4.3 | adminer | [wodby/adminer] | |
-| phpMyAdmin | latest | pma | [phpmyadmin/phpmyadmin] | |
-| Node | latest | node | [_/node] | |
-| Portainer | latest | portainer | [portainer/portainer] | ✓ |
-| Traefik | latest | traefik | [_/traefik] | ✓ |
-
-Supported Drupal versions: 8 / 7 / 6
-
-## Requirements
-
-* Install Docker ([Linux](https://docs.docker.com/engine/installation), [Docker for Mac](https://docs.docker.com/engine/installation/mac) or [Docker for Windows (10+ Pro)](https://docs.docker.com/engine/installation/windows))
-* For Linux additionally install [docker compose](https://docs.docker.com/compose/install)
-
-## Must know before you start
-
-1. **(!!!) You will lose MariaDB data** if you run `docker-compose down`. Instead use `docker-compose stop` to stop containers. Alternatively, you can use a manual volume for mariadb data (see compose file), this way your data will always persist
-2. To avoid potential problems with permissions between your host and containers please follow [these instructions](permissions.md)
-3. _For macOS users_: Out of box Docker for Mac volumes has [poor performance](https://github.com/Wodby/docker4drupal/issues/4). However there are workarounds, read more [here](macos.md)
-4. For better reliability we release images with stability tags (e.g. `wodby/drupal-php:7.1-X.X.X`) which correspond to git tags. We strongly recommend using images only with stability tags.
-
-## Usage
-
-There are 2 options how to use docker4drupal – you can either run [vanilla](https://en.wikipedia.org/wiki/Vanilla_software) Drupal from the image or mount your own Drupal codebase:
-
-### 1. Run Vanilla Drupal from Image (default)
-
-1. Download `docker-compose.yml` file from the [latest stable release](https://github.com/wodby/docker4drupal/releases)
-2. Optional: update _php_ and _nginx_ images tags if you want to run Drupal 7 or 6 (by default Drupal 8)
-3. Run containers: `docker-compose up -d` (it may take some time for them to initialize)
-4. [Configure domains](domains.md)
-5. That's it! Proceed with Drupal installation at [http://drupal.docker.localhost:8000](http://drupal.docker.localhost:8000). Default database user, password and database name are all `drupal`, database host is `mariadb`
-6. You can see status of your containers and their logs via portainer: [http://portainer.drupal.docker.localhost:8000](http://portainer.drupal.docker.localhost:8000)
-
-### 2. Mount my Drupal Codebase
-
-0. Read [must know before you start](#must-know-before-you-start)
-1. Download `docker-compose.yml` file from the [latest stable release](https://github.com/wodby/docker4drupal/releases) to your Drupal project root
-2. Replace php image from `wodby/drupal` (PHP + vanilla Drupal) to `wodby/drupal-php` (just PHP)
-3. Depending on your Drupal version use appropriate tags for _php_ and _nginx_ images
-4. Update _nginx_ and _php_ volumes to `- ./:/var/www/html` to mount your codebase
-4. Update `NGINX_SERVER_ROOT` (or `APACHE_SERVER_ROOT`) to `/var/www/html` unless your project is based on [composer template](https://github.com/drupal-composer/drupal-project)
-5. Ensure your settings.php uses the same credentials as _mariadb_ service
-6. Optional: [import existing database](containers/mariadb.md#import-existing-database)
-7. Optional: uncomment lines in the compose file to run _redis_, _solr_, etc
-8. [Configure domains](domains.md)
-9. Run containers: `docker-compose up -d`
-10. That's it! Your drupal website should be up and running at [http://drupal.docker.localhost:8000](http://drupal.docker.localhost:8000). If you need to run multiple projects simultaneously see [this article](multiple-projects.md)
-11. You can see status of your containers and their logs via portainer: [http://portainer.drupal.docker.localhost:8000](http://portainer.drupal.docker.localhost:8000)
-
-You can stop containers by executing:
-```bash
-docker-compose stop
-```
-
-Feel free to adjust volumes and ports in the compose file for your convenience. Also, read [how to access containers](access.md) and [how to get logs](logs.md)
-
-## Status
-
-We're actively working on these instructions and containers. More options will be added soon. If you have a feature request or found a bug please [submit an issue on GitHub](https://github.com/wodby/docker4drupal/issues/new) or [ join us on Slack](https://slack.wodby.com/)
-
-We update containers from time to time by releasing new images (stability tags change).
-
-## License
-
-This project is licensed under the MIT open source license.
diff --git a/docs/known-issues.md b/docs/known-issues.md
deleted file mode 100644
index 3cd87ca0f1..0000000000
--- a/docs/known-issues.md
+++ /dev/null
@@ -1,12 +0,0 @@
-## Windows permissions problems
-[https://github.com/Wodby/docker4drupal/issues/35#issuecomment-253806588](https://github.com/Wodby/docker4drupal/issues/35#issuecomment-253806588)
-
-## Windows interactive mode isn't supported
-[https://github.com/Wodby/docker4drupal/issues/41#issuecomment-254051955](https://github.com/Wodby/docker4drupal/issues/41#issuecomment-254051955)
-
-## Xdebug on macOS
-[https://github.com/Wodby/drupal-php/issues/1](https://github.com/Wodby/drupal-php/issues/1)
-
-## Site in a subdirectory
-[https://github.com/Wodby/drupal-php/issues/16](https://github.com/Wodby/drupal-php/issues/16)
-[https://github.com/Wodby/docker4drupal/issues/58](https://github.com/Wodby/docker4drupal/issues/58)
diff --git a/docs/logs.md b/docs/logs.md
deleted file mode 100644
index 0b32727a4e..0000000000
--- a/docs/logs.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Containers Logs
-
-## GUI
-
-You can find containers logs from portainer UI: [http://portainer.drupal.docker.localhost:8000](http://portainer.drupal.docker.localhost:8000)
-
-## CLI
-
-To get logs from a container simply run (skip the last param to get logs form all the containers):
-```
-$ docker-compose logs [service]
-```
-
-Example: real-time logs of the PHP container:
-```
-$ docker-compose logs -f php
-```
diff --git a/docs/macos.md b/docs/macos.md
deleted file mode 100644
index 987600fa10..0000000000
--- a/docs/macos.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Docker for Mac Performance
-
-There 2 ways how can improve [performance](https://github.com/Wodby/docker4drupal/issues/4) of docker volumes on macOS:
-
-## 1. User-guided Caching
-
-Since Docker for Mac 17.06 there's a new `:cached` option available for volumes. You can find more information about this in [docker blog](https://blog.docker.com/2017/05/user-guided-caching-in-docker-for-mac/).
-
-### Usage
-
-Replace _codebase_ volume definition of _php_ and _nginx_/_apache_ services with the option below marked as "User-guided caching".
-
-## 2. Docker-sync
-
-The core idea of this project is to use an external volume that will sync your files with a file synchronizer tool.
-
-### Installation
-
-```bash
-$ gem install docker-sync
-```
-
-### Usage
-
-1. Download `docker-sync.yml` file from the [latest stable release](https://github.com/wodby/docker4drupal/releases)
-2. Uncomment _docker-sync_ volume definition in your compose file
-3. Replace _volumes_ definition of _php_ and _nginx_/_apache_ services with the option below marked as "Docker-sync".
-4. Start docker-sync: `docker-sync start`
-5. In a new shell run after you started docker-sync `docker-compose up -d`
-
-Now when you change your code on the host machine docker-sync will sync your data to php and nginx/apache containers.
-
-For more information visit [docker-sync project page](https://github.com/EugenMayer/docker-sync/).
diff --git a/docs/multiple-projects.md b/docs/multiple-projects.md
deleted file mode 100644
index fe90a57120..0000000000
--- a/docs/multiple-projects.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Running Multiple Projects with Træfik
-
-[Træfik](https://docs.traefik.io/) is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease.
-To understand the basics of Traefik it is suggested to check Træfik's documentation page: https://docs.traefik.io/
-
-
-
-Image: Multi-domain set-up example
-(Source: traefik.io)
-
-## Steps to set up two projects on one host ##
-
-1. Create two dirs where you will host two projects. Let's name them _site1_ and _site2_
-2. Copy `docker-compose.yml` file to both dirs (_site1_ and _site2_)
-3. Download `traefik.yml` file from the [latest stable release](https://github.com/wodby/docker4drupal/releases) to the parent dir where _site1_ and _site2_ dirs are
-4. Edit `traefik.yml` and change `project1-dir_default` to `site1_default` and `project2-dir_default` to `site2_default`. Those are docker networks names that are created automatically from the dir name where docker-compose.yml is located
-5. Edit site1's `docker-compose.yml` file. There are 3 main things that need to be done there:
- * In nginx service, under labels, change `traefik.backend=nginx` to `traefik.backend=site1_nginx_1`. This is the name of the container. You can see that under NAMES when your have the containers running by executing `docker ps`
- * Change `traefik.frontend.rule` from `Host:drupal.docker.localhost` to `Host:site1.docker.localhost`
- * Comment out all lines of `traefik` service at the bottom of the file
-6. Make similar 3 changes in site2's `docker-compose.yml` file:
- * `traefik.backend=nginx` to `traefik.backend=site2_nginx_1`
- * `Host:drupal.docker.localhost` to `Host:site2.docker.localhost`
- * Comment out all lines of `traefik` service at the bottom of the file
-7. Run `docker-compose up -d` in _site1_ and _site2_ dirs to spin up containers for both projects
-8. Run stand-alone traefik `docker-compose -f traefik.yml up -d` to spin up traefik reverse proxy
-9. Visit http://site1.docker.localhost and http://site2.docker.localhost in your browser
-
-This set up also works for other Docker projects (non Drupal and non docker4drupal based). You can replace nginx-proxy config with Traefik and get other projects all routed with on traefik container.
-
-## Problems? ##
-
-* Check `docker ps` to see which containers are running and check if you have set up all names correctly.
-* Check `docker network ls` to check if the network names are matching.
-* Run `docker-compose logs -f` in site1 or site2 to see the log of each project.
-
-To report issues about multi-project set up with docker4drupal or if you have more suggestions and use-cases, please use [this issue on GitHub](https://github.com/wodby/docker4drupal/issues/124)
-
-## Additional for macOS users with docker-sync:
-
-Names of `syncs` in docker-sync.yml file must be unique per project. The recommended way is to run stand-alone docker-sync with syncs definition for all projects. Do not forget to update `src` paths for projects.
diff --git a/docs/permissions.md b/docs/permissions.md
deleted file mode 100644
index 0d166f8c1c..0000000000
--- a/docs/permissions.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Fixing Permissions Problems
-
-To avoid potential permissions problems between host machine and containers (e.g. can't access files generated by PHP) you can add a group on your host machine with ID 82, it's a standard GID/UID for www-data user in Alpine Linux.
-
-## Linux
-
-Create a new group with ID 82 and add yourself to this group.
-
-```bash
-sudo groupadd -r -g 82 alpine-www-data
-sudo usermod -a -G alpine-www-data $(id -un)
-```
-
-Another solution is to use ACL mechanism, available on most of Linux distributions.
-
-It's available by default on Ubuntu, with ext4 filesystem (starting from 14.04 version).
-If you need more information, how to enable it on your Linux distribution, please check https://help.ubuntu.com/community/FilePermissionsACLs document.
-
-
-```bash
-sudo setfacl -dR -m u:$(whoami):rwX -m u:82:rwX -m u:100:rX path_to_shared_volume
-sudo setfacl -R -m u:$(whoami):rwX -m u:82:rwX -m u:100:rX path_to_shared_volume
-```
-Code above will make sure that both your current user and php-fpm have full permissions to all files, and nginx worker has read-only access to all files in workspace.
-
-## macOS
-
-On macOS group with 82 already exists (_clamav).
-
-```bash
-sudo dseditgroup -o edit -a $(id -un) -t user _clamav
-```
-
-## Windows
-
-TBD
diff --git a/docs/production.md b/docs/production.md
deleted file mode 100644
index 6a94774918..0000000000
--- a/docs/production.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Using in production
-
-Docker4Drupal is designed to be used for local development. Deploy consistent docker-based Drupal stack with orchestrations to your own server via [ Wodby](https://cloud.wodby.com/stackhub/ada51e9b-2204-45ee-8e49-a4151912a168/detail).
diff --git a/mkdocs.yml b/mkdocs.yml
deleted file mode 100644
index 46a2285053..0000000000
--- a/mkdocs.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-site_name: Docker4Drupal Documentation
-
-repo_url: https://github.com/wodby/docker4drupal
-site_description: 'Docker4Drupal – Docker-based Drupal environment for local development'
-theme: readthedocs
-
-markdown_extensions:
- - toc:
- permalink: True
-
-pages:
- - Getting Started: 'index.md'
- - Domains: 'domains.md'
- - Logs: 'logs.md'
- - Accessing Containers: 'access.md'
- - Permissions: 'permissions.md'
- - Docker for Mac: 'macos.md'
- - Multiple Projects: 'multiple-projects.md'
- - Known Issues: 'known-issues.md'
- - Using In Production: 'production.md'
- - Containers:
- - 'Nginx': 'containers/nginx.md'
- - 'Apache': 'containers/apache.md'
- - 'PHP': 'containers/php.md'
- - 'MariaDB': 'containers/mariadb.md'
- - 'Redis': 'containers/redis.md'
- - 'Node.js': 'containers/nodejs.md'
- - 'Memcached': 'containers/memcached.md'
- - 'Apache Solr': 'containers/solr.md'
- - 'Varnish': 'containers/varnish.md'
- - 'AthenaPDF': 'containers/athenapdf.md'
- - 'Rsyslog': 'containers/rsyslog.md'
- - 'Webgrind': 'containers/webgrind.md'
- - 'Blackfire': 'containers/blackfire.md'
diff --git a/test/6/5.3/docker-compose.yml b/test/6/5.3/docker-compose.yml
deleted file mode 100644
index 6f310e5b75..0000000000
--- a/test/6/5.3/docker-compose.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: $MARIADB
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-
- php:
- image: $DRUPAL6_PHP53
- environment:
- # To skip auto init.
- WODBY_APP_NAME: drupal
- DRUPAL_VERSION: 6
- PHP_SENDMAIL_PATH: '/bin/true'
- volumes:
- - codebase:/var/www/html
- - ./test.sh:/var/www/html/test.sh
- - ./test.settings.php:/var/www/html/test.settings.php
-
- nginx:
- image: $DRUPAL6_NGINX
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
- depends_on:
- - php
-
- memcached:
- image: $MEMCACHED
-
-volumes:
- codebase:
diff --git a/test/6/5.3/run.sh b/test/6/5.3/run.sh
deleted file mode 100755
index 5a5c9b824b..0000000000
--- a/test/6/5.3/run.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-. ../../images.env
-
-docker-compose up -d
-docker-compose exec mariadb make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=5
-docker-compose exec --user=0 php chown -R www-data:www-data /var/www/html
-docker-compose exec php ./test.sh
-docker-compose down
diff --git a/test/6/5.3/test.settings.php b/test/6/5.3/test.settings.php
deleted file mode 100644
index efe7183412..0000000000
--- a/test/6/5.3/test.settings.php
+++ /dev/null
@@ -1,17 +0,0 @@
- 'default');
- $conf['memcache_key_prefix'] = 'docker4drupal';
- $conf['memcache_bins'] = array(
- 'cache' => 'default',
- 'cache_update' => 'database',
- 'cache_form' => 'database',
- );
-}
diff --git a/test/6/5.3/test.sh b/test/6/5.3/test.sh
deleted file mode 100755
index 259bdd48d7..0000000000
--- a/test/6/5.3/test.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-DB_NAME=drupal
-DB_HOST=mariadb
-DB_USER=drupal
-DB_PASS=drupal
-DB_URL="mysql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}"
-
-make init -f /usr/local/bin/actions.mk
-
-cd ./web
-
-drush si --db-url="${DB_URL}" -y
-drush dl memcache-6.x-1.11
-
-chmod 755 "${APP_ROOT}/web/sites/default/settings.php"
-echo "include '${APP_ROOT}/test.settings.php';" >> "${APP_ROOT}/web/sites/default/settings.php"
-
-drush en memcache -y
diff --git a/test/6/5.6/docker-compose.yml b/test/6/5.6/docker-compose.yml
deleted file mode 100644
index c4249bff40..0000000000
--- a/test/6/5.6/docker-compose.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: $MARIADB
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-
- php:
- image: $DRUPAL6_PHP56
- environment:
- # To skip auto init.
- WODBY_APP_NAME: drupal
- DRUPAL_VERSION: 6
- PHP_SENDMAIL_PATH: '/bin/true'
- volumes:
- - codebase:/var/www/html
- - ./test.sh:/var/www/html/test.sh
- - ./test.settings.php:/var/www/html/test.settings.php
-
- nginx:
- image: $DRUPAL6_NGINX
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
- depends_on:
- - php
-
- memcached:
- image: $MEMCACHED
-
-volumes:
- codebase:
diff --git a/test/6/5.6/run.sh b/test/6/5.6/run.sh
deleted file mode 100755
index 5a5c9b824b..0000000000
--- a/test/6/5.6/run.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-. ../../images.env
-
-docker-compose up -d
-docker-compose exec mariadb make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=5
-docker-compose exec --user=0 php chown -R www-data:www-data /var/www/html
-docker-compose exec php ./test.sh
-docker-compose down
diff --git a/test/6/5.6/test.settings.php b/test/6/5.6/test.settings.php
deleted file mode 100644
index efe7183412..0000000000
--- a/test/6/5.6/test.settings.php
+++ /dev/null
@@ -1,17 +0,0 @@
- 'default');
- $conf['memcache_key_prefix'] = 'docker4drupal';
- $conf['memcache_bins'] = array(
- 'cache' => 'default',
- 'cache_update' => 'database',
- 'cache_form' => 'database',
- );
-}
diff --git a/test/6/5.6/test.sh b/test/6/5.6/test.sh
deleted file mode 100755
index 259bdd48d7..0000000000
--- a/test/6/5.6/test.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-DB_NAME=drupal
-DB_HOST=mariadb
-DB_USER=drupal
-DB_PASS=drupal
-DB_URL="mysql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}"
-
-make init -f /usr/local/bin/actions.mk
-
-cd ./web
-
-drush si --db-url="${DB_URL}" -y
-drush dl memcache-6.x-1.11
-
-chmod 755 "${APP_ROOT}/web/sites/default/settings.php"
-echo "include '${APP_ROOT}/test.settings.php';" >> "${APP_ROOT}/web/sites/default/settings.php"
-
-drush en memcache -y
diff --git a/test/7/5.6/docker-compose.yml b/test/7/5.6/docker-compose.yml
deleted file mode 100644
index d7d087c6ea..0000000000
--- a/test/7/5.6/docker-compose.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: $MARIADB
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-
- php:
- image: $DRUPAL7_PHP56
- environment:
- # To skip auto init.
- WODBY_APP_NAME: drupal
- DRUPAL_VERSION: 7
- PHP_SENDMAIL_PATH: '/bin/true'
- volumes:
- - codebase:/var/www/html
- - ./test.sh:/var/www/html/test.sh
- - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
- - ./feature_search_api_solr:/var/www/html/web/sites/all/modules/features/feature_search_api_solr
-
- nginx:
- image: $DRUPAL7_NGINX
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
- depends_on:
- - php
-
- varnish:
- image: $DRUPAL_VARNISH
- depends_on:
- - nginx
- environment:
- VARNISH_SECRET: secret
- VARNISH_BACKEND_HOST: nginx
- VARNISH_BACKEND_PORT: 80
-
- redis:
- image: $REDIS
-
- solr:
- image: $DRUPAL7_SOLR
- environment:
- SOLR_HEAP: 1024m
-
-volumes:
- codebase:
diff --git a/test/7/5.6/feature_search_api_solr/feature_search_api_solr.features.inc b/test/7/5.6/feature_search_api_solr/feature_search_api_solr.features.inc
deleted file mode 100644
index d8642514b6..0000000000
--- a/test/7/5.6/feature_search_api_solr/feature_search_api_solr.features.inc
+++ /dev/null
@@ -1,40 +0,0 @@
-public download method)"
-
-drush en -y redis search_api search_api_solr varnish features
-
-# Enable redis
-chmod 755 "${PWD}/sites/default/settings.php"
-echo "include '${PWD}/sites/default/test.settings.php';" >> "${PWD}/sites/default/settings.php"
-drush cc all
-check_rq "redis" "Connected, using the PhpRedis client"
-
-# Test solr server connection
-drush en -y feature_search_api_solr
-check_rq "search_api_solr" "1 server"
-
-# Test varnish cache and purge
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
-
-drush varnish-purge-all
-
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
diff --git a/test/7/7.0/docker-compose.yml b/test/7/7.0/docker-compose.yml
deleted file mode 100644
index 8730ed6d6f..0000000000
--- a/test/7/7.0/docker-compose.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: $MARIADB
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-
- php:
- image: $DRUPAL7_PHP70
- environment:
- # To skip auto init.
- WODBY_APP_NAME: drupal
- DRUPAL_VERSION: 7
- PHP_SENDMAIL_PATH: '/bin/true'
- volumes:
- - codebase:/var/www/html
- - ./test.sh:/var/www/html/test.sh
- - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
- - ./feature_search_api_solr:/var/www/html/web/sites/all/modules/features/feature_search_api_solr
-
- nginx:
- image: $DRUPAL7_NGINX
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
- depends_on:
- - php
-
- varnish:
- image: $DRUPAL_VARNISH
- depends_on:
- - nginx
- environment:
- VARNISH_SECRET: secret
- VARNISH_BACKEND_HOST: nginx
- VARNISH_BACKEND_PORT: 80
-
- redis:
- image: $REDIS
-
- solr:
- image: $DRUPAL7_SOLR
- environment:
- SOLR_HEAP: 1024m
-
-volumes:
- codebase:
diff --git a/test/7/7.0/feature_search_api_solr/feature_search_api_solr.features.inc b/test/7/7.0/feature_search_api_solr/feature_search_api_solr.features.inc
deleted file mode 100644
index d8642514b6..0000000000
--- a/test/7/7.0/feature_search_api_solr/feature_search_api_solr.features.inc
+++ /dev/null
@@ -1,40 +0,0 @@
-public download method)"
-
-drush en -y redis search_api search_api_solr varnish features
-
-# Enable redis
-chmod 755 "${PWD}/sites/default/settings.php"
-echo "include '${PWD}/sites/default/test.settings.php';" >> "${PWD}/sites/default/settings.php"
-drush cc all
-check_rq "redis" "Connected, using the PhpRedis client"
-
-# Test solr server connection
-drush en -y feature_search_api_solr
-check_rq "search_api_solr" "1 server"
-
-# Test varnish cache and purge
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
-
-drush varnish-purge-all
-
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
diff --git a/test/7/7.1/docker-compose.yml b/test/7/7.1/docker-compose.yml
deleted file mode 100644
index 3c71c4571e..0000000000
--- a/test/7/7.1/docker-compose.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: $MARIADB
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-
- php:
- image: $DRUPAL7_PHP71
- environment:
- # To skip auto init.
- WODBY_APP_NAME: drupal
- DRUPAL_VERSION: 7
- PHP_SENDMAIL_PATH: '/bin/true'
- volumes:
- - codebase:/var/www/html
- - ./test.sh:/var/www/html/test.sh
- - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
- - ./feature_search_api_solr:/var/www/html/web/sites/all/modules/features/feature_search_api_solr
-
- nginx:
- image: $DRUPAL7_NGINX
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
- depends_on:
- - php
-
- varnish:
- image: $DRUPAL_VARNISH
- depends_on:
- - nginx
- environment:
- VARNISH_SECRET: secret
- VARNISH_BACKEND_HOST: nginx
- VARNISH_BACKEND_PORT: 80
-
- redis:
- image: $REDIS
-
- solr:
- image: $DRUPAL7_SOLR
- environment:
- SOLR_HEAP: 1024m
-
-volumes:
- codebase:
diff --git a/test/7/7.1/feature_search_api_solr/feature_search_api_solr.features.inc b/test/7/7.1/feature_search_api_solr/feature_search_api_solr.features.inc
deleted file mode 100644
index d8642514b6..0000000000
--- a/test/7/7.1/feature_search_api_solr/feature_search_api_solr.features.inc
+++ /dev/null
@@ -1,40 +0,0 @@
-public download method)"
-
-drush en -y redis search_api search_api_solr varnish features
-
-# Enable redis
-chmod 755 "${PWD}/sites/default/settings.php"
-echo "include '${PWD}/sites/default/test.settings.php';" >> "${PWD}/sites/default/settings.php"
-drush cc all
-check_rq "redis" "Connected, using the PhpRedis client"
-
-# Test solr server connection
-drush en -y feature_search_api_solr
-check_rq "search_api_solr" "1 server"
-
-# Test varnish cache and purge
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
-
-drush varnish-purge-all
-
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
diff --git a/test/8/7.0/docker-compose.yml b/test/8/7.0/docker-compose.yml
deleted file mode 100644
index 4b7f7e52ed..0000000000
--- a/test/8/7.0/docker-compose.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: $MARIADB
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-
- php:
- image: $DRUPAL8_PHP70
- environment:
- # To skip auto init.
- WODBY_APP_NAME: drupal
- DRUPAL_VERSION: 8
- DB_HOST: mariadb
- DB_NAME: drupal
- DB_USER: drupal
- DB_PASSWORD: drupal
- DB_DRIVER: mysql
- PHP_SENDMAIL_PATH: '/bin/true'
- volumes:
- - codebase:/var/www/html
- - ./test.sh:/var/www/html/test.sh
- - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
- - ./varnish-purger.yml:/var/www/html/web/varnish-purger.yml
- - ./search-api-solr-server.yml:/var/www/html/web/search_api.server.solr_6_4.yml
-
- nginx:
- image: $DRUPAL8_NGINX
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
- depends_on:
- - php
-
- varnish:
- image: $DRUPAL_VARNISH
- depends_on:
- - nginx
- environment:
- VARNISH_SECRET: secret
- VARNISH_BACKEND_HOST: nginx
- VARNISH_BACKEND_PORT: 80
- VARNISH_MEMORY_SIZE: 256M
- VARNISH_STORAGE_SIZE: 1024M
-
- redis:
- image: $REDIS
-
- solr:
- image: $DRUPAL8_SOLR
- environment:
- SOLR_HEAP: 1024m
-
-volumes:
- codebase:
diff --git a/test/8/7.0/run.sh b/test/8/7.0/run.sh
deleted file mode 100755
index 2219f01500..0000000000
--- a/test/8/7.0/run.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-. ../../images.env
-
-docker-compose up -d
-docker-compose exec mariadb make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=5
-docker-compose exec solr make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=3
-docker-compose exec solr make core=core1 -f /usr/local/bin/actions.mk
-docker-compose exec --user=0 php apk add --update jq
-docker-compose exec --user=0 php chown -R www-data:www-data /var/www/html
-docker-compose exec php ./test.sh
-docker-compose down
diff --git a/test/8/7.0/search-api-solr-server.yml b/test/8/7.0/search-api-solr-server.yml
deleted file mode 100644
index 2169366faa..0000000000
--- a/test/8/7.0/search-api-solr-server.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-uuid: 705c9f7c-0819-4ff6-8d97-d94435c12184
-langcode: en
-status: true
-dependencies:
- module:
- - search_api_solr
-id: solr_6_4
-name: 'Solr 6.4'
-description: ''
-backend: search_api_solr
-backend_config:
- connector: standard
- connector_config:
- scheme: http
- host: solr
- port: '8983'
- path: /solr
- core: core1
- timeout: 5
- index_timeout: 5
- optimize_timeout: 10
- solr_version: ''
- http_method: AUTO
- retrieve_data: false
- highlight_data: false
- excerpt: false
- skip_schema_check: false
- site_hash: true
- autocorrect_spell: true
- autocorrect_suggest_words: true
diff --git a/test/8/7.0/test.sh b/test/8/7.0/test.sh
deleted file mode 100755
index 31102ff72b..0000000000
--- a/test/8/7.0/test.sh
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-check_rq() {
- echo "Checking requirement: ${1} must be ${2}"
- drush rq --format=json | jq ".\"${1}\".value" | grep -q "${2}"
- echo "OK"
-}
-
-check_status() {
- echo "Checking status: ${1} must be ${2}"
- drush status --format=yaml | grep -q "${1}: ${2}"
- echo "OK"
-}
-
-DB_NAME=drupal
-DB_HOST=mariadb
-DB_USER=drupal
-DB_PASS=drupal
-DB_URL="mysql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}"
-
-make init -f /usr/local/bin/actions.mk
-
-composer require \
- drupal/redis \
- drupal/search_api \
- drupal/search_api_solr \
- drupal/purge \
- drupal/varnish_purge \
- drupal/cache_tags
-
-cd ./web
-
-drush si -y --db-url="${DB_URL}"
-
-# Test Drupal status and requirements
-check_status "drush-version" "8.*"
-check_status "root" "${APP_ROOT}/${DOCROOT_SUBDIR}"
-check_status "drupal-settings-file" "sites/default/settings.php"
-check_status "site" "sites/default"
-check_status "files" "sites/default/files"
-check_status "temp" "/tmp"
-check_status "config-sync" "../config/sync"
-
-check_rq "database_system" "MySQL, MariaDB, Percona Server, or equivalent"
-check_rq "image.toolkit" "gd"
-check_rq "php_opcache" "Enabled"
-check_rq "php" "${PHP_VERSION}"
-check_rq "file system" "Writable (public download method)"
-check_rq "configuration_files" "Protected"
-
-drush en -y \
- redis \
- search_api \
- search_api_solr \
- purge \
- purge_queuer_coretags \
- purge_drush \
- varnish_purger \
- varnish_purge_tags \
- cache_tags
-
-# Enable redis
-chmod 755 "${PWD}/sites/default/settings.php"
-echo "include '${PWD}/sites/default/test.settings.php';" >> "${PWD}/sites/default/settings.php"
-check_rq "redis" "Connected, using the PhpRedis client"
-
-# Import solr server
-drupal cis --file search_api.server.solr_6_4.yml
-check_rq "search_api_solr" "1 server"
-check_rq "search_api_solr_multiple_indexes" "1 server"
-
-# Test varnish cache and purge
-cp varnish-purger.yml purger.yml
-
-drush ppadd varnish
-drush cr
-
-## Workaround for varnish purger import https://www.drupal.org/node/2856221
-PURGER_ID=$(drush ppls --format=json | jq -r "keys[0]")
-
-sed -i "s/PLUGIN_ID/${PURGER_ID}/g" purger.yml
-mv purger.yml "varnish_purger.settings.${PURGER_ID}.yml"
-drupal cis --file "varnish_purger.settings.${PURGER_ID}.yml"
-
-drush -y config-set system.performance cache.page.max_age 43200
-
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
-
-drush cc render
-drush pqw
-
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
diff --git a/test/8/7.1/docker-compose.yml b/test/8/7.1/docker-compose.yml
deleted file mode 100644
index 866f26b398..0000000000
--- a/test/8/7.1/docker-compose.yml
+++ /dev/null
@@ -1,64 +0,0 @@
-version: "2"
-
-services:
- mariadb:
- image: $MARIADB
- environment:
- MYSQL_ROOT_PASSWORD: password
- MYSQL_DATABASE: drupal
- MYSQL_USER: drupal
- MYSQL_PASSWORD: drupal
-
- php:
- image: $DRUPAL8_PHP71
- environment:
- # To skip auto init.
- WODBY_APP_NAME: drupal
- DEBUG: 1
- DRUPAL_VERSION: 8
- DB_HOST: mariadb
- DB_NAME: drupal
- DB_USER: drupal
- DB_PASSWORD: drupal
- DB_DRIVER: mysql
- PHP_SENDMAIL_PATH: '/bin/true'
- volumes:
- - codebase:/var/www/html
- - ./test.sh:/var/www/html/test.sh
- - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
- - ./varnish-purger.yml:/var/www/html/web/varnish-purger.yml
- - ./search-api-solr-server.yml:/var/www/html/web/search_api.server.solr_6_4.yml
-
- nginx:
- image: $DRUPAL8_NGINX
- environment:
- NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off"
- NGINX_ERROR_LOG_LEVEL: debug
- NGINX_BACKEND_HOST: php
- NGINX_SERVER_ROOT: /var/www/html/web
- volumes:
- - codebase:/var/www/html
- depends_on:
- - php
-
- varnish:
- image: $DRUPAL_VARNISH
- depends_on:
- - nginx
- environment:
- VARNISH_SECRET: secret
- VARNISH_BACKEND_HOST: nginx
- VARNISH_BACKEND_PORT: 80
- VARNISH_MEMORY_SIZE: 256M
- VARNISH_STORAGE_SIZE: 1024M
-
- redis:
- image: $REDIS
-
- solr:
- image: $DRUPAL8_SOLR
- environment:
- SOLR_HEAP: 1024m
-
-volumes:
- codebase:
diff --git a/test/8/7.1/run.sh b/test/8/7.1/run.sh
deleted file mode 100755
index 2219f01500..0000000000
--- a/test/8/7.1/run.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-. ../../images.env
-
-docker-compose up -d
-docker-compose exec mariadb make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=5
-docker-compose exec solr make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=3
-docker-compose exec solr make core=core1 -f /usr/local/bin/actions.mk
-docker-compose exec --user=0 php apk add --update jq
-docker-compose exec --user=0 php chown -R www-data:www-data /var/www/html
-docker-compose exec php ./test.sh
-docker-compose down
diff --git a/test/8/7.1/search-api-solr-server.yml b/test/8/7.1/search-api-solr-server.yml
deleted file mode 100644
index 2169366faa..0000000000
--- a/test/8/7.1/search-api-solr-server.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-uuid: 705c9f7c-0819-4ff6-8d97-d94435c12184
-langcode: en
-status: true
-dependencies:
- module:
- - search_api_solr
-id: solr_6_4
-name: 'Solr 6.4'
-description: ''
-backend: search_api_solr
-backend_config:
- connector: standard
- connector_config:
- scheme: http
- host: solr
- port: '8983'
- path: /solr
- core: core1
- timeout: 5
- index_timeout: 5
- optimize_timeout: 10
- solr_version: ''
- http_method: AUTO
- retrieve_data: false
- highlight_data: false
- excerpt: false
- skip_schema_check: false
- site_hash: true
- autocorrect_spell: true
- autocorrect_suggest_words: true
diff --git a/test/8/7.1/test.sh b/test/8/7.1/test.sh
deleted file mode 100755
index 31102ff72b..0000000000
--- a/test/8/7.1/test.sh
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-if [[ -n "${DEBUG}" ]]; then
- set -x
-fi
-
-check_rq() {
- echo "Checking requirement: ${1} must be ${2}"
- drush rq --format=json | jq ".\"${1}\".value" | grep -q "${2}"
- echo "OK"
-}
-
-check_status() {
- echo "Checking status: ${1} must be ${2}"
- drush status --format=yaml | grep -q "${1}: ${2}"
- echo "OK"
-}
-
-DB_NAME=drupal
-DB_HOST=mariadb
-DB_USER=drupal
-DB_PASS=drupal
-DB_URL="mysql://${DB_USER}:${DB_PASS}@${DB_HOST}/${DB_NAME}"
-
-make init -f /usr/local/bin/actions.mk
-
-composer require \
- drupal/redis \
- drupal/search_api \
- drupal/search_api_solr \
- drupal/purge \
- drupal/varnish_purge \
- drupal/cache_tags
-
-cd ./web
-
-drush si -y --db-url="${DB_URL}"
-
-# Test Drupal status and requirements
-check_status "drush-version" "8.*"
-check_status "root" "${APP_ROOT}/${DOCROOT_SUBDIR}"
-check_status "drupal-settings-file" "sites/default/settings.php"
-check_status "site" "sites/default"
-check_status "files" "sites/default/files"
-check_status "temp" "/tmp"
-check_status "config-sync" "../config/sync"
-
-check_rq "database_system" "MySQL, MariaDB, Percona Server, or equivalent"
-check_rq "image.toolkit" "gd"
-check_rq "php_opcache" "Enabled"
-check_rq "php" "${PHP_VERSION}"
-check_rq "file system" "Writable (public download method)"
-check_rq "configuration_files" "Protected"
-
-drush en -y \
- redis \
- search_api \
- search_api_solr \
- purge \
- purge_queuer_coretags \
- purge_drush \
- varnish_purger \
- varnish_purge_tags \
- cache_tags
-
-# Enable redis
-chmod 755 "${PWD}/sites/default/settings.php"
-echo "include '${PWD}/sites/default/test.settings.php';" >> "${PWD}/sites/default/settings.php"
-check_rq "redis" "Connected, using the PhpRedis client"
-
-# Import solr server
-drupal cis --file search_api.server.solr_6_4.yml
-check_rq "search_api_solr" "1 server"
-check_rq "search_api_solr_multiple_indexes" "1 server"
-
-# Test varnish cache and purge
-cp varnish-purger.yml purger.yml
-
-drush ppadd varnish
-drush cr
-
-## Workaround for varnish purger import https://www.drupal.org/node/2856221
-PURGER_ID=$(drush ppls --format=json | jq -r "keys[0]")
-
-sed -i "s/PLUGIN_ID/${PURGER_ID}/g" purger.yml
-mv purger.yml "varnish_purger.settings.${PURGER_ID}.yml"
-drupal cis --file "varnish_purger.settings.${PURGER_ID}.yml"
-
-drush -y config-set system.performance cache.page.max_age 43200
-
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
-
-drush cc render
-drush pqw
-
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: MISS"
-curl -Is varnish:6081 | grep -q "X-Varnish-Cache: HIT"
diff --git a/test/images.env b/test/images.env
deleted file mode 100644
index 68e6dbb25f..0000000000
--- a/test/images.env
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-
-# Generic.
-export MARIADB=wodby/mariadb:10.1-2.3.5
-export REDIS=wodby/redis:3.2-2.1.3
-
-# Drupal generic.
-export DRUPAL_VARNISH=wodby/drupal-varnish:4.1-2.2.0
-
-# Drupal 6.
-export MEMCACHED=wodby/memcached:1.4-2.0.0
-export DRUPAL6_PHP53=wodby/drupal:6-5.3-3.0.0
-export DRUPAL6_PHP56=wodby/drupal:6-5.6-3.0.0
-export DRUPAL6_NGINX=wodby/drupal-nginx:6-1.13-3.0.1
-
-# Drupal 7.
-export DRUPAL7_PHP56=wodby/drupal:7-5.6-3.0.0
-export DRUPAL7_PHP70=wodby/drupal:7-7.0-3.0.0
-export DRUPAL7_PHP71=wodby/drupal:7-7.1-3.0.0
-export DRUPAL7_NGINX=wodby/drupal-nginx:7-1.13-3.0.1
-export DRUPAL7_SOLR=wodby/drupal-solr:7-5.4-2.2.0
-
-# Drupal 8.
-export DRUPAL8_PHP70=wodby/drupal:8-7.0-3.0.0
-export DRUPAL8_PHP71=wodby/drupal:8-7.1-3.0.0
-export DRUPAL8_NGINX=wodby/drupal-nginx:8-1.13-3.0.1
-export DRUPAL8_SOLR=wodby/drupal-solr:8-6.4-2.2.0
diff --git a/tests/10/.env b/tests/10/.env
new file mode 100644
index 0000000000..f719813145
--- /dev/null
+++ b/tests/10/.env
@@ -0,0 +1,16 @@
+DB_NAME=drupal
+DB_USER=drupal
+DB_PASSWORD=drupal
+DB_ROOT_PASSWORD=password
+DB_HOST=mariadb
+DB_DRIVER=mysql
+
+MARIADB_TAG=11.4-3.30.5
+VALKEY_TAG=8-1.0.0
+VARNISH_TAG=6.0-4.19.1
+SOLR_TAG=9-5.1.6
+
+NGINX_VHOST_PRESET=drupal10
+NGINX_TAG=1.27-5.40.3
+DRUPAL_STABILITY_TAG=4.81.6
+ZOOKEEPER_TAG=3.8
\ No newline at end of file
diff --git a/tests/10/compose.yml b/tests/10/compose.yml
new file mode 100644
index 0000000000..5963ce9e7d
--- /dev/null
+++ b/tests/10/compose.yml
@@ -0,0 +1,78 @@
+services:
+ mariadb:
+ image: wodby/mariadb:$MARIADB_TAG
+ environment:
+ MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
+ MYSQL_DATABASE: $DB_NAME
+ MYSQL_USER: $DB_USER
+ MYSQL_PASSWORD: $DB_PASSWORD
+
+ php:
+ image: "wodby/drupal:10-${PHP_VER}-${DRUPAL_STABILITY_TAG}"
+ environment:
+ # To skip auto init.
+ WODBY_APP_NAME: drupal
+ DEBUG: 1
+ DRUPAL_VERSION: 10
+ DB_HOST: $DB_HOST
+ DB_NAME: $DB_NAME
+ DB_USER: $DB_USER
+ DB_PASSWORD: $DB_PASSWORD
+ DB_DRIVER: $DB_DRIVER
+ PHP_SENDMAIL_PATH: '/bin/true'
+ COLUMNS: 80
+ PHP_FPM_USER: wodby
+ PHP_FPM_GROUP: wodby
+ COMPOSER_MEMORY_LIMIT: -1
+ PHP_ERROR_REPORTING: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
+ volumes:
+ - codebase:/var/www/html
+ - ./tests.sh:/usr/local/bin/tests.sh
+ - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
+ - ./varnish-purger.yml:/var/www/html/varnish-purger.yml
+ - ./search_api.server.solr.yml:/var/www/html/solr/search_api.server.solr.yml
+
+ nginx:
+ image: wodby/nginx:$NGINX_TAG
+ environment:
+ NGINX_STATIC_OPEN_FILE_CACHE: "off"
+ NGINX_BACKEND_HOST: php
+ NGINX_SERVER_ROOT: /var/www/html/web
+ NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
+ volumes:
+ - codebase:/var/www/html
+ depends_on:
+ - php
+
+ varnish:
+ image: wodby/varnish:$VARNISH_TAG
+ depends_on:
+ - nginx
+ environment:
+ VARNISH_SECRET: secret
+ VARNISH_BACKEND_HOST: nginx
+ VARNISH_BACKEND_PORT: 80
+ VARNISH_CONFIG_PRESET: drupal
+ VARNISH_PURGE_EXTERNAL_REQUEST_HEADER: X-Real-IP
+
+ valkey:
+ image: wodby/valkey:$VALKEY_TAG
+ environment:
+ VALKEY_PASSWORD: bad-password
+
+ solr:
+ image: wodby/solr:$SOLR_TAG
+ environment:
+ ZK_HOST: zookeeper:2181
+ depends_on:
+ - zookeeper
+
+ zookeeper:
+ image: zookeeper:$ZOOKEEPER_TAG
+ environment:
+ ZOO_MY_ID: 1
+ ZOO_SERVERS: server.1=zookeeper:2888:3888;2181
+ ZOO_4LW_COMMANDS_WHITELIST: mntr, conf, ruok
+
+volumes:
+ codebase:
diff --git a/tests/10/run.sh b/tests/10/run.sh
new file mode 100755
index 0000000000..c21bd03e79
--- /dev/null
+++ b/tests/10/run.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ -n "${DEBUG}" ]]; then
+ set -x
+fi
+
+docker compose up -d
+docker compose exec -T mariadb make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=5
+docker compose exec -T solr make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=3
+docker compose exec -T solr make init -f /usr/local/bin/actions.mk
+docker compose exec -T --user=0 php apk add --update jq
+docker compose exec -T --user=0 php chown -R wodby:wodby /var/www/html
+docker compose exec -T php tests.sh
+docker compose down
diff --git a/tests/10/search_api.server.solr.yml b/tests/10/search_api.server.solr.yml
new file mode 100644
index 0000000000..f735ed6552
--- /dev/null
+++ b/tests/10/search_api.server.solr.yml
@@ -0,0 +1,77 @@
+uuid: ddc2786c-c601-4e6c-a625-b8ce51768ea3
+langcode: en
+status: true
+dependencies:
+ config:
+ - search_api_solr.solr_cache.cache_document_default_7_0_0
+ - search_api_solr.solr_cache.cache_fieldvalue_default_7_0_0
+ - search_api_solr.solr_cache.cache_filter_default_7_0_0
+ - search_api_solr.solr_cache.cache_persegfilter_default_7_0_0
+ - search_api_solr.solr_cache.cache_queryresult_default_7_0_0
+ - search_api_solr.solr_field_type.text_edge_und_7_0_0
+ - search_api_solr.solr_field_type.text_edgestring_und_6_0_0
+ - search_api_solr.solr_field_type.text_en_7_0_0
+ - search_api_solr.solr_field_type.text_ngram_und_7_0_0
+ - search_api_solr.solr_field_type.text_ngramstring_und_6_0_0
+ - search_api_solr.solr_field_type.text_phonetic_en_7_0_0
+ - search_api_solr.solr_field_type.text_phonetic_und_7_0_0
+ - search_api_solr.solr_field_type.text_und_7_0_0
+ - search_api_solr.solr_request_dispatcher.request_dispatcher_httpcachingnever_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_autocomplete_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_extract_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_mlt_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_select_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_spell_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_suggest_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_tvrh_default_7_0_0
+ module:
+ - search_api_solr
+id: solr
+name: solr
+description: ''
+backend: search_api_solr
+backend_config:
+ retrieve_data: false
+ highlight_data: false
+ site_hash: false
+ server_prefix: ''
+ domain: generic
+ environment: default
+ connector: solr_cloud_basic_auth
+ connector_config:
+ scheme: http
+ host: solr
+ port: 8983
+ path: /
+ core: default
+ timeout: 5
+ index_timeout: 5
+ optimize_timeout: 10
+ finalize_timeout: 30
+ skip_schema_check: false
+ solr_version: ''
+ http_method: AUTO
+ commit_within: 1000
+ jmx: false
+ jts: false
+ solr_install_dir: ''
+ username: solr
+ password: SolrRocks
+ checkpoints_collection: ''
+ stats_cache: org.apache.solr.search.stats.LRUStatsCache
+ distrib: true
+ context: solr
+ optimize: false
+ fallback_multiple: false
+ disabled_field_types: { }
+ disabled_caches: { }
+ disabled_request_handlers:
+ - request_handler_elevate_default_7_0_0
+ - request_handler_replicationmaster_default_7_0_0
+ - request_handler_replicationslave_default_7_0_0
+ disabled_request_dispatchers:
+ - request_dispatcher_httpcaching_default_7_0_0
+ rows: 10
+ index_single_documents_fallback_count: 10
+ index_empty_text_fields: false
+ suppress_missing_languages: false
diff --git a/test/8/7.0/test.settings.php b/tests/10/test.settings.php
similarity index 75%
rename from test/8/7.0/test.settings.php
rename to tests/10/test.settings.php
index a3bcfdd565..a5bca0e1d7 100644
--- a/test/8/7.0/test.settings.php
+++ b/tests/10/test.settings.php
@@ -4,9 +4,9 @@
? 'sites/all/modules/contrib'
: 'sites/all/modules';
-$settings['redis.connection']['host'] = 'redis';
+$settings['redis.connection']['host'] = 'valkey';
$settings['redis.connection']['port'] = '6379';
-$settings['redis.connection']['password'] = '';
+$settings['redis.connection']['password'] = 'bad-password';
$settings['redis.connection']['base'] = 0;
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['cache']['default'] = 'cache.backend.redis';
@@ -15,3 +15,7 @@
$settings['cache']['bins']['config'] = 'cache.backend.chainedfast';
$settings['container_yamls'][] = $contrib_path . '/redis/example.services.yml';
+
+$settings['trusted_host_patterns'] = array(
+ '\\.localhost$', '\\.local$', '\\.loc$'
+);
diff --git a/tests/10/tests.sh b/tests/10/tests.sh
new file mode 100755
index 0000000000..3da8389e0c
--- /dev/null
+++ b/tests/10/tests.sh
@@ -0,0 +1,104 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ -n "${DEBUG}" ]]; then
+ set -x
+fi
+
+check_rq() {
+ echo "Checking requirement: ${1} must be ${2}"
+ drush rq --format=json | jq '.[] | select(.title=="'"${1}"'") | .value' | grep -q "${2}"
+ echo "OK"
+}
+
+check_status() {
+ echo "Checking status: ${1} must be ${2}"
+ drush status --format=yaml | grep -q "${1}: ${2}"
+ echo "OK"
+}
+
+DB_URL="${DB_DRIVER}://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}"
+
+make init -f /usr/local/bin/actions.mk
+
+composer require -n \
+ drupal/redis
+# \
+# drupal/purge \
+# drupal/varnish_purge
+
+#composer require -n \
+# drupal/search_api \
+# drupal/search_api_solr:~4
+
+cd ./web
+
+drush si -y --db-url="${DB_URL}"
+
+# Test Drupal status and requirements
+if [[ "${PHP_VERSION}" = 8.1* ]]; then
+ check_status "drush-version" "12.*"
+else
+ check_status "drush-version" "13.*"
+fi
+
+check_status "root" "${APP_ROOT}/${DOCROOT_SUBDIR}"
+check_status "site" "sites/default"
+check_status "files" "sites/default/files"
+check_status "temp" "/tmp"
+
+check_rq "Database system" "MariaDB"
+check_rq "Image toolkit" "gd"
+check_rq "PHP OPcode caching" "Enabled"
+check_rq "PHP" "${PHP_VERSION}"
+check_rq "File system" "Writable"
+check_rq "Configuration files" "Protected"
+
+drush en -y \
+ redis
+# \
+# purge \
+# purge_queuer_coretags \
+# purge_drush \
+# varnish_purger \
+# varnish_purge_tags
+
+#drush en -y search_api_solr_admin
+
+chmod 755 "${PWD}/sites/default/settings.php"
+echo "include '${PWD}/sites/default/test.settings.php';" >>"${PWD}/sites/default/settings.php"
+
+# Enable redis
+check_rq "Redis" "Connected"
+
+check_rq "Trusted Host Settings" "Enabled"
+
+# Import solr server
+#drush cim --source=/var/www/html/solr --partial -y
+#drush solr-upload-conf solr 1
+#drush sapi-sl | grep -q enabled
+
+## Test varnish cache and purge
+#drush ppadd varnish
+#drush cr
+
+## Workaround for varnish purger import https://www.drupal.org/node/2856221
+#PURGER_ID=$(drush ppls --format=json | jq -r "keys[0]")
+#
+#mkdir -p /var/www/html/varnish
+## We copy mounted file because we can't edit mounted file (resource busy error).
+#cp /var/www/html/varnish-purger.yml /var/www/html/varnish/purger.yml
+#sed -i "s/PLUGIN_ID/${PURGER_ID}/g" /var/www/html/varnish/purger.yml
+#mv /var/www/html/varnish/purger.yml "/var/www/html/varnish/varnish_purger.settings.${PURGER_ID}.yml"
+#drush -y cim --source=/var/www/html/varnish --partial
+#drush -y config-set system.performance cache.page.max_age 43200
+#
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: MISS"
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: HIT"
+#
+#drush cc render
+#drush pqw
+#
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: MISS"
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: HIT"
diff --git a/test/8/7.0/varnish-purger.yml b/tests/10/varnish-purger.yml
similarity index 100%
rename from test/8/7.0/varnish-purger.yml
rename to tests/10/varnish-purger.yml
diff --git a/tests/11/.env b/tests/11/.env
new file mode 100644
index 0000000000..306ab8e760
--- /dev/null
+++ b/tests/11/.env
@@ -0,0 +1,16 @@
+DB_NAME=drupal
+DB_USER=drupal
+DB_PASSWORD=drupal
+DB_ROOT_PASSWORD=password
+DB_HOST=mariadb
+DB_DRIVER=mysql
+
+MARIADB_TAG=11.4-3.30.5
+VALKEY_TAG=8-1.0.0
+VARNISH_TAG=6.0-4.19.1
+SOLR_TAG=9-5.1.6
+
+NGINX_VHOST_PRESET=drupal11
+NGINX_TAG=1.27-5.40.3
+DRUPAL_STABILITY_TAG=4.81.6
+ZOOKEEPER_TAG=3.8
\ No newline at end of file
diff --git a/tests/11/compose.yml b/tests/11/compose.yml
new file mode 100644
index 0000000000..69ff39cd43
--- /dev/null
+++ b/tests/11/compose.yml
@@ -0,0 +1,78 @@
+services:
+ mariadb:
+ image: wodby/mariadb:$MARIADB_TAG
+ environment:
+ MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
+ MYSQL_DATABASE: $DB_NAME
+ MYSQL_USER: $DB_USER
+ MYSQL_PASSWORD: $DB_PASSWORD
+
+ php:
+ image: "wodby/drupal:11-${PHP_VER}-${DRUPAL_STABILITY_TAG}"
+ environment:
+ # To skip auto init.
+ WODBY_APP_NAME: drupal
+ DEBUG: 1
+ DRUPAL_VERSION: 11
+ DB_HOST: $DB_HOST
+ DB_NAME: $DB_NAME
+ DB_USER: $DB_USER
+ DB_PASSWORD: $DB_PASSWORD
+ DB_DRIVER: $DB_DRIVER
+ PHP_SENDMAIL_PATH: '/bin/true'
+ COLUMNS: 80
+ PHP_FPM_USER: wodby
+ PHP_FPM_GROUP: wodby
+ COMPOSER_MEMORY_LIMIT: -1
+ PHP_ERROR_REPORTING: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
+ volumes:
+ - codebase:/var/www/html
+ - ./tests.sh:/usr/local/bin/tests.sh
+ - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
+ - ./varnish-purger.yml:/var/www/html/varnish-purger.yml
+ - ./search_api.server.solr.yml:/var/www/html/solr/search_api.server.solr.yml
+
+ nginx:
+ image: wodby/nginx:$NGINX_TAG
+ environment:
+ NGINX_STATIC_OPEN_FILE_CACHE: "off"
+ NGINX_BACKEND_HOST: php
+ NGINX_SERVER_ROOT: /var/www/html/web
+ NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
+ volumes:
+ - codebase:/var/www/html
+ depends_on:
+ - php
+
+ varnish:
+ image: wodby/varnish:$VARNISH_TAG
+ depends_on:
+ - nginx
+ environment:
+ VARNISH_SECRET: secret
+ VARNISH_BACKEND_HOST: nginx
+ VARNISH_BACKEND_PORT: 80
+ VARNISH_CONFIG_PRESET: drupal
+ VARNISH_PURGE_EXTERNAL_REQUEST_HEADER: X-Real-IP
+
+ valkey:
+ image: wodby/valkey:$VALKEY_TAG
+ environment:
+ VALKEY_PASSWORD: bad-password
+
+ solr:
+ image: wodby/solr:$SOLR_TAG
+ environment:
+ ZK_HOST: zookeeper:2181
+ depends_on:
+ - zookeeper
+
+ zookeeper:
+ image: zookeeper:$ZOOKEEPER_TAG
+ environment:
+ ZOO_MY_ID: 1
+ ZOO_SERVERS: server.1=zookeeper:2888:3888;2181
+ ZOO_4LW_COMMANDS_WHITELIST: mntr, conf, ruok
+
+volumes:
+ codebase:
diff --git a/tests/11/run.sh b/tests/11/run.sh
new file mode 100755
index 0000000000..c21bd03e79
--- /dev/null
+++ b/tests/11/run.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ -n "${DEBUG}" ]]; then
+ set -x
+fi
+
+docker compose up -d
+docker compose exec -T mariadb make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=5
+docker compose exec -T solr make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=3
+docker compose exec -T solr make init -f /usr/local/bin/actions.mk
+docker compose exec -T --user=0 php apk add --update jq
+docker compose exec -T --user=0 php chown -R wodby:wodby /var/www/html
+docker compose exec -T php tests.sh
+docker compose down
diff --git a/tests/11/search_api.server.solr.yml b/tests/11/search_api.server.solr.yml
new file mode 100644
index 0000000000..f735ed6552
--- /dev/null
+++ b/tests/11/search_api.server.solr.yml
@@ -0,0 +1,77 @@
+uuid: ddc2786c-c601-4e6c-a625-b8ce51768ea3
+langcode: en
+status: true
+dependencies:
+ config:
+ - search_api_solr.solr_cache.cache_document_default_7_0_0
+ - search_api_solr.solr_cache.cache_fieldvalue_default_7_0_0
+ - search_api_solr.solr_cache.cache_filter_default_7_0_0
+ - search_api_solr.solr_cache.cache_persegfilter_default_7_0_0
+ - search_api_solr.solr_cache.cache_queryresult_default_7_0_0
+ - search_api_solr.solr_field_type.text_edge_und_7_0_0
+ - search_api_solr.solr_field_type.text_edgestring_und_6_0_0
+ - search_api_solr.solr_field_type.text_en_7_0_0
+ - search_api_solr.solr_field_type.text_ngram_und_7_0_0
+ - search_api_solr.solr_field_type.text_ngramstring_und_6_0_0
+ - search_api_solr.solr_field_type.text_phonetic_en_7_0_0
+ - search_api_solr.solr_field_type.text_phonetic_und_7_0_0
+ - search_api_solr.solr_field_type.text_und_7_0_0
+ - search_api_solr.solr_request_dispatcher.request_dispatcher_httpcachingnever_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_autocomplete_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_extract_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_mlt_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_select_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_spell_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_suggest_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_tvrh_default_7_0_0
+ module:
+ - search_api_solr
+id: solr
+name: solr
+description: ''
+backend: search_api_solr
+backend_config:
+ retrieve_data: false
+ highlight_data: false
+ site_hash: false
+ server_prefix: ''
+ domain: generic
+ environment: default
+ connector: solr_cloud_basic_auth
+ connector_config:
+ scheme: http
+ host: solr
+ port: 8983
+ path: /
+ core: default
+ timeout: 5
+ index_timeout: 5
+ optimize_timeout: 10
+ finalize_timeout: 30
+ skip_schema_check: false
+ solr_version: ''
+ http_method: AUTO
+ commit_within: 1000
+ jmx: false
+ jts: false
+ solr_install_dir: ''
+ username: solr
+ password: SolrRocks
+ checkpoints_collection: ''
+ stats_cache: org.apache.solr.search.stats.LRUStatsCache
+ distrib: true
+ context: solr
+ optimize: false
+ fallback_multiple: false
+ disabled_field_types: { }
+ disabled_caches: { }
+ disabled_request_handlers:
+ - request_handler_elevate_default_7_0_0
+ - request_handler_replicationmaster_default_7_0_0
+ - request_handler_replicationslave_default_7_0_0
+ disabled_request_dispatchers:
+ - request_dispatcher_httpcaching_default_7_0_0
+ rows: 10
+ index_single_documents_fallback_count: 10
+ index_empty_text_fields: false
+ suppress_missing_languages: false
diff --git a/tests/11/test.settings.php b/tests/11/test.settings.php
new file mode 100644
index 0000000000..dca387e2cb
--- /dev/null
+++ b/tests/11/test.settings.php
@@ -0,0 +1,21 @@
+>"${PWD}/sites/default/settings.php"
+
+## Enable redis
+#check_rq "Redis" "Connected"
+
+check_rq "Trusted Host Settings" "Enabled"
+
+# Import solr server
+#drush cim --source=/var/www/html/solr --partial -y
+#drush solr-upload-conf solr 1
+#drush sapi-sl | grep -q enabled
+
+## Test varnish cache and purge
+#drush ppadd varnish
+#drush cr
+
+## Workaround for varnish purger import https://www.drupal.org/node/2856221
+#PURGER_ID=$(drush ppls --format=json | jq -r "keys[0]")
+#
+#mkdir -p /var/www/html/varnish
+## We copy mounted file because we can't edit mounted file (resource busy error).
+#cp /var/www/html/varnish-purger.yml /var/www/html/varnish/purger.yml
+#sed -i "s/PLUGIN_ID/${PURGER_ID}/g" /var/www/html/varnish/purger.yml
+#mv /var/www/html/varnish/purger.yml "/var/www/html/varnish/varnish_purger.settings.${PURGER_ID}.yml"
+#drush -y cim --source=/var/www/html/varnish --partial
+#drush -y config-set system.performance cache.page.max_age 43200
+#
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: MISS"
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: HIT"
+#
+#drush cc render
+#drush pqw
+#
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: MISS"
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: HIT"
diff --git a/test/8/7.1/varnish-purger.yml b/tests/11/varnish-purger.yml
similarity index 100%
rename from test/8/7.1/varnish-purger.yml
rename to tests/11/varnish-purger.yml
diff --git a/tests/cms/.env b/tests/cms/.env
new file mode 100644
index 0000000000..74c148108b
--- /dev/null
+++ b/tests/cms/.env
@@ -0,0 +1,16 @@
+DB_NAME=drupal
+DB_USER=drupal
+DB_PASSWORD=drupal
+DB_ROOT_PASSWORD=password
+DB_HOST=mariadb
+DB_DRIVER=mysql
+
+MARIADB_TAG=11.4-3.30.5
+VALKEY_TAG=8-1.0.0
+VARNISH_TAG=6.0-4.19.1
+SOLR_TAG=9-5.1.6
+
+NGINX_VHOST_PRESET=drupal11
+NGINX_TAG=1.27-5.40.3
+DRUPAL_CMS_STABILITY_TAG=0.1.0
+ZOOKEEPER_TAG=3.8
\ No newline at end of file
diff --git a/tests/cms/compose.yml b/tests/cms/compose.yml
new file mode 100644
index 0000000000..455b48685e
--- /dev/null
+++ b/tests/cms/compose.yml
@@ -0,0 +1,78 @@
+services:
+ mariadb:
+ image: wodby/mariadb:$MARIADB_TAG
+ environment:
+ MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
+ MYSQL_DATABASE: $DB_NAME
+ MYSQL_USER: $DB_USER
+ MYSQL_PASSWORD: $DB_PASSWORD
+
+ php:
+ image: "wodby/drupal-cms:1-${DRUPAL_CMS_STABILITY_TAG}"
+ environment:
+ # To skip auto init.
+ WODBY_APP_NAME: drupal
+ DEBUG: 1
+ DRUPAL_VERSION: 11
+ DB_HOST: $DB_HOST
+ DB_NAME: $DB_NAME
+ DB_USER: $DB_USER
+ DB_PASSWORD: $DB_PASSWORD
+ DB_DRIVER: $DB_DRIVER
+ PHP_SENDMAIL_PATH: '/bin/true'
+ COLUMNS: 80
+ PHP_FPM_USER: wodby
+ PHP_FPM_GROUP: wodby
+ COMPOSER_MEMORY_LIMIT: -1
+ PHP_ERROR_REPORTING: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
+ volumes:
+ - codebase:/var/www/html
+ - ./tests.sh:/usr/local/bin/tests.sh
+ - ./test.settings.php:/var/www/html/web/sites/default/test.settings.php
+ - ./varnish-purger.yml:/var/www/html/varnish-purger.yml
+ - ./search_api.server.solr.yml:/var/www/html/solr/search_api.server.solr.yml
+
+ nginx:
+ image: wodby/nginx:$NGINX_TAG
+ environment:
+ NGINX_STATIC_OPEN_FILE_CACHE: "off"
+ NGINX_BACKEND_HOST: php
+ NGINX_SERVER_ROOT: /var/www/html/web
+ NGINX_VHOST_PRESET: $NGINX_VHOST_PRESET
+ volumes:
+ - codebase:/var/www/html
+ depends_on:
+ - php
+
+ varnish:
+ image: wodby/varnish:$VARNISH_TAG
+ depends_on:
+ - nginx
+ environment:
+ VARNISH_SECRET: secret
+ VARNISH_BACKEND_HOST: nginx
+ VARNISH_BACKEND_PORT: 80
+ VARNISH_CONFIG_PRESET: drupal
+ VARNISH_PURGE_EXTERNAL_REQUEST_HEADER: X-Real-IP
+
+ valkey:
+ image: wodby/valkey:$VALKEY_TAG
+ environment:
+ VALKEY_PASSWORD: bad-password
+
+ solr:
+ image: wodby/solr:$SOLR_TAG
+ environment:
+ ZK_HOST: zookeeper:2181
+ depends_on:
+ - zookeeper
+
+ zookeeper:
+ image: zookeeper:$ZOOKEEPER_TAG
+ environment:
+ ZOO_MY_ID: 1
+ ZOO_SERVERS: server.1=zookeeper:2888:3888;2181
+ ZOO_4LW_COMMANDS_WHITELIST: mntr, conf, ruok
+
+volumes:
+ codebase:
diff --git a/tests/cms/run.sh b/tests/cms/run.sh
new file mode 100755
index 0000000000..c21bd03e79
--- /dev/null
+++ b/tests/cms/run.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ -n "${DEBUG}" ]]; then
+ set -x
+fi
+
+docker compose up -d
+docker compose exec -T mariadb make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=5
+docker compose exec -T solr make check-ready -f /usr/local/bin/actions.mk max_try=12 wait_seconds=3
+docker compose exec -T solr make init -f /usr/local/bin/actions.mk
+docker compose exec -T --user=0 php apk add --update jq
+docker compose exec -T --user=0 php chown -R wodby:wodby /var/www/html
+docker compose exec -T php tests.sh
+docker compose down
diff --git a/tests/cms/search_api.server.solr.yml b/tests/cms/search_api.server.solr.yml
new file mode 100644
index 0000000000..f735ed6552
--- /dev/null
+++ b/tests/cms/search_api.server.solr.yml
@@ -0,0 +1,77 @@
+uuid: ddc2786c-c601-4e6c-a625-b8ce51768ea3
+langcode: en
+status: true
+dependencies:
+ config:
+ - search_api_solr.solr_cache.cache_document_default_7_0_0
+ - search_api_solr.solr_cache.cache_fieldvalue_default_7_0_0
+ - search_api_solr.solr_cache.cache_filter_default_7_0_0
+ - search_api_solr.solr_cache.cache_persegfilter_default_7_0_0
+ - search_api_solr.solr_cache.cache_queryresult_default_7_0_0
+ - search_api_solr.solr_field_type.text_edge_und_7_0_0
+ - search_api_solr.solr_field_type.text_edgestring_und_6_0_0
+ - search_api_solr.solr_field_type.text_en_7_0_0
+ - search_api_solr.solr_field_type.text_ngram_und_7_0_0
+ - search_api_solr.solr_field_type.text_ngramstring_und_6_0_0
+ - search_api_solr.solr_field_type.text_phonetic_en_7_0_0
+ - search_api_solr.solr_field_type.text_phonetic_und_7_0_0
+ - search_api_solr.solr_field_type.text_und_7_0_0
+ - search_api_solr.solr_request_dispatcher.request_dispatcher_httpcachingnever_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_autocomplete_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_extract_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_mlt_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_select_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_spell_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_suggest_default_7_0_0
+ - search_api_solr.solr_request_handler.request_handler_tvrh_default_7_0_0
+ module:
+ - search_api_solr
+id: solr
+name: solr
+description: ''
+backend: search_api_solr
+backend_config:
+ retrieve_data: false
+ highlight_data: false
+ site_hash: false
+ server_prefix: ''
+ domain: generic
+ environment: default
+ connector: solr_cloud_basic_auth
+ connector_config:
+ scheme: http
+ host: solr
+ port: 8983
+ path: /
+ core: default
+ timeout: 5
+ index_timeout: 5
+ optimize_timeout: 10
+ finalize_timeout: 30
+ skip_schema_check: false
+ solr_version: ''
+ http_method: AUTO
+ commit_within: 1000
+ jmx: false
+ jts: false
+ solr_install_dir: ''
+ username: solr
+ password: SolrRocks
+ checkpoints_collection: ''
+ stats_cache: org.apache.solr.search.stats.LRUStatsCache
+ distrib: true
+ context: solr
+ optimize: false
+ fallback_multiple: false
+ disabled_field_types: { }
+ disabled_caches: { }
+ disabled_request_handlers:
+ - request_handler_elevate_default_7_0_0
+ - request_handler_replicationmaster_default_7_0_0
+ - request_handler_replicationslave_default_7_0_0
+ disabled_request_dispatchers:
+ - request_dispatcher_httpcaching_default_7_0_0
+ rows: 10
+ index_single_documents_fallback_count: 10
+ index_empty_text_fields: false
+ suppress_missing_languages: false
diff --git a/test/8/7.1/test.settings.php b/tests/cms/test.settings.php
similarity index 75%
rename from test/8/7.1/test.settings.php
rename to tests/cms/test.settings.php
index a3bcfdd565..a5bca0e1d7 100644
--- a/test/8/7.1/test.settings.php
+++ b/tests/cms/test.settings.php
@@ -4,9 +4,9 @@
? 'sites/all/modules/contrib'
: 'sites/all/modules';
-$settings['redis.connection']['host'] = 'redis';
+$settings['redis.connection']['host'] = 'valkey';
$settings['redis.connection']['port'] = '6379';
-$settings['redis.connection']['password'] = '';
+$settings['redis.connection']['password'] = 'bad-password';
$settings['redis.connection']['base'] = 0;
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['cache']['default'] = 'cache.backend.redis';
@@ -15,3 +15,7 @@
$settings['cache']['bins']['config'] = 'cache.backend.chainedfast';
$settings['container_yamls'][] = $contrib_path . '/redis/example.services.yml';
+
+$settings['trusted_host_patterns'] = array(
+ '\\.localhost$', '\\.local$', '\\.loc$'
+);
diff --git a/tests/cms/tests.sh b/tests/cms/tests.sh
new file mode 100755
index 0000000000..d9d44297d8
--- /dev/null
+++ b/tests/cms/tests.sh
@@ -0,0 +1,99 @@
+#!/usr/bin/env bash
+
+set -e
+
+if [[ -n "${DEBUG}" ]]; then
+ set -x
+fi
+
+check_rq() {
+ echo "Checking requirement: ${1} must be ${2}"
+ drush rq --format=json | jq '.[] | select(.title=="'"${1}"'") | .value' | grep -q "${2}"
+ echo "OK"
+}
+
+check_status() {
+ echo "Checking status: ${1} must be ${2}"
+ drush status --format=yaml | grep -q "${1}: ${2}"
+ echo "OK"
+}
+
+DB_URL="${DB_DRIVER}://${DB_USER}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}"
+
+make init -f /usr/local/bin/actions.mk
+
+composer require -n \
+ drupal/redis
+# \
+# drupal/purge \
+# drupal/varnish_purge
+
+#composer require -n \
+# drupal/search_api \
+# drupal/search_api_solr:~4
+
+cd ./web
+
+drush si -y --db-url="${DB_URL}"
+
+# Test Drupal status and requirements
+check_status "drush-version" "13.*"
+check_status "root" "${APP_ROOT}/${DOCROOT_SUBDIR}"
+check_status "site" "sites/default"
+check_status "files" "sites/default/files"
+check_status "temp" "/tmp"
+
+check_rq "Database system" "MariaDB"
+check_rq "Image toolkit" "gd"
+check_rq "PHP OPcode caching" "Enabled"
+check_rq "PHP" "${PHP_VERSION}"
+check_rq "File system" "Writable"
+check_rq "Configuration files" "Protected"
+
+drush en -y \
+ redis
+## \
+## purge \
+## purge_queuer_coretags \
+## purge_drush \
+## varnish_purger \
+## varnish_purge_tags
+
+#drush en -y search_api_solr_admin
+
+chmod 755 "${PWD}/sites/default/settings.php"
+echo "include '${PWD}/sites/default/test.settings.php';" >>"${PWD}/sites/default/settings.php"
+
+## Enable redis
+check_rq "Redis" "Connected"
+
+check_rq "Trusted Host Settings" "Enabled"
+
+# Import solr server
+#drush cim --source=/var/www/html/solr --partial -y
+#drush solr-upload-conf solr 1
+#drush sapi-sl | grep -q enabled
+
+## Test varnish cache and purge
+#drush ppadd varnish
+#drush cr
+
+## Workaround for varnish purger import https://www.drupal.org/node/2856221
+#PURGER_ID=$(drush ppls --format=json | jq -r "keys[0]")
+#
+#mkdir -p /var/www/html/varnish
+## We copy mounted file because we can't edit mounted file (resource busy error).
+#cp /var/www/html/varnish-purger.yml /var/www/html/varnish/purger.yml
+#sed -i "s/PLUGIN_ID/${PURGER_ID}/g" /var/www/html/varnish/purger.yml
+#mv /var/www/html/varnish/purger.yml "/var/www/html/varnish/varnish_purger.settings.${PURGER_ID}.yml"
+#drush -y cim --source=/var/www/html/varnish --partial
+#drush -y config-set system.performance cache.page.max_age 43200
+#
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: MISS"
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: HIT"
+#
+#drush cc render
+#drush pqw
+#
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: MISS"
+#curl -Is -H 'Host: drupal.localhost' varnish:6081 | grep -q "X-VC-Cache: HIT"
diff --git a/tests/cms/varnish-purger.yml b/tests/cms/varnish-purger.yml
new file mode 100644
index 0000000000..9f763d9ee5
--- /dev/null
+++ b/tests/cms/varnish-purger.yml
@@ -0,0 +1,25 @@
+uuid: 91faa2b9-fd7a-4419-8dae-fc5a91b782b6
+langcode: en
+status: true
+dependencies: { }
+id: PLUGIN_ID
+name: 'Varnish 4.1'
+invalidationtype: tag
+hostname: varnish
+port: 6081
+path: /
+request_method: BAN
+scheme: http
+verify: '1'
+headers:
+ -
+ field: Cache-Tags
+ value: '[invalidation:expression]'
+body: null
+body_content_type: null
+runtime_measurement: true
+timeout: !!float 1
+connect_timeout: !!float 1
+cooldown_time: !!float 0
+max_requests: 100
+http_errors: true
diff --git a/traefik.yml b/traefik.yml
index 1e4af501f6..6c563cc5d3 100644
--- a/traefik.yml
+++ b/traefik.yml
@@ -1,10 +1,7 @@
-version: '2'
-
services:
traefik:
- image: traefik
- restart: unless-stopped
- command: -c /dev/null --web --docker --logLevel=DEBUG
+ image: traefik:v2.0
+ command: --api.insecure=true --providers.docker
networks:
- project1
- project2
@@ -16,9 +13,9 @@ services:
networks:
project1:
- external:
- name: project1-dir_default
+ external: true
+ name: project1-dir_default
project2:
- external:
- name: project2-dir_default
+ external: true
+ name: project2-dir_default