https://github.com/damalis/full-stack-apache2-drupal-for-everyone-with-docker-compose
If You want to build a website with Drupal at short time; install full stack apache2 Drupal with Docker Compose. Plus, manage docker containers with Portainer.
https://github.com/damalis/full-stack-apache2-drupal-for-everyone-with-docker-compose
apache2 certbot drupal framework letsencrypt mariadb mysql php php-fpm phpmyadmin portainer-ce redis ssl varnish
Last synced: 24 days ago
JSON representation
If You want to build a website with Drupal at short time; install full stack apache2 Drupal with Docker Compose. Plus, manage docker containers with Portainer.
- Host: GitHub
- URL: https://github.com/damalis/full-stack-apache2-drupal-for-everyone-with-docker-compose
- Owner: damalis
- Created: 2022-09-22T08:54:08.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2024-07-07T07:29:40.000Z (over 1 year ago)
- Last Synced: 2025-01-22T01:22:34.333Z (10 months ago)
- Topics: apache2, certbot, drupal, framework, letsencrypt, mariadb, mysql, php, php-fpm, phpmyadmin, portainer-ce, redis, ssl, varnish
- Language: Shell
- Homepage:
- Size: 131 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
README
# [full stack apache2 Drupal for everyone with docker compose](https://github.com/damalis/full-stack-apache2-drupal-for-everyone-with-docker-compose)
If You want to build a website with Drupal at short time;
#### Full stack Apache2 Drupal:
Plus, manage docker containers with Portainer.
#### Supported CPU architectures:
arm64/aarch64, x86-64
#### Supported Linux Package Manage Systems:
apk, dnf, yum, apt/apt-get, zypper, pacman
#### Supported Linux Operation Systems:
##### Note: Fedora 37, 39 and alpine linux x86-64 compatible, could not try sles IBM Z s390x, rhel IBM Z s390x and raspberrypi.
#### With this project you can quickly run the following:
- [Drupal](https://hub.docker.com/_/drupal) - [php-fpm](https://hub.docker.com/_/php)
- [webserver (apache2/httpd)](https://hub.docker.com/_/httpd)
- [certbot (letsencrypt)](https://hub.docker.com/r/certbot/certbot)
- [phpMyAdmin](https://hub.docker.com/r/phpmyadmin/phpmyadmin/)
- [Mariadb](https://hub.docker.com/_/mariadb) [Mysql](https://hub.docker.com/_/mysql)
- [redis](https://hub.docker.com/_/redis)
- [varnish](https://hub.docker.com/_/varnish)
- [backup](https://hub.docker.com/r/offen/docker-volume-backup)
#### For certbot (letsencrypt) certificate:
- [Set DNS configuration of your domain name](https://support.google.com/a/answer/48090?hl=en)
#### IPv4/IPv6 Firewall
Create rules to open ports to the internet, or to a specific IPv4 address or range.
- http: 80
- https: 443
- portainer: 9001
- phpmyadmin: 9090
#### Contents:
- [Auto Configuration and Installation](#automatic)
- [Manual Configuration and Installation](#manual)
- [Requirements](#requirements)
- [Configuration](#configuration)
- [Installation](#installation)
- [Portainer Installation](#portainer)
- [Usage](#usage)
- [Website](#website)
- [Webserver](#webserver)
- [Database](#database)
- [Redis](#redis)
- [Varnish](#varnish)
- [phpMyAdmin](#phpmyadmin)
- [backup](#backup)
### Automatic
#### Exec install shell script for auto installation and configuration
download with
```
git clone https://github.com/damalis/full-stack-apache2-drupal-for-everyone-with-docker-compose.git
```
Open a terminal and `cd` to the folder in which `docker-compose.yml` is saved and run:
```
cd full-stack-apache2-drupal-for-everyone-with-docker-compose
chmod +x install.sh
./install.sh
```
### Manual
#### Requirements
Make sure you have the latest versions of **Docker** and **Docker Compose** installed on your machine.
- [How install docker](https://docs.docker.com/engine/install/)
- [How install docker compose](https://docs.docker.com/compose/install/)
Clone this repository or copy the files from this repository into a new folder.
Make sure to [add your user to the `docker` group](https://docs.docker.com/install/linux/linux-postinstall/#manage-docker-as-a-non-root-user).
#### Configuration
download with
```
git clone https://github.com/damalis/full-stack-apache2-drupal-for-everyone-with-docker-compose.git
```
Open a terminal and `cd` to the folder in which `docker-compose.yml` is saved and run:
```
cd full-stack-apache2-drupal-for-everyone-with-docker-compose
```
Copy the example environment into `.env`
```
cp env.example .env
```
Edit the `.env` file to change values of
|```LOCAL_TIMEZONE```|```DOMAIN_NAME```|```DIRECTORY_PATH```|```LETSENCRYPT_EMAIL```|
|```DB_USER```|```DB_PASSWORD```|```DB_NAME```|```MYSQL_ROOT_PASSWORD```|```DATABASE_IMAGE_NAME```|
|```DATABASE_CONT_NAME```|```DATABASE_PACKAGE_MANAGER```|```DATABASE_ADMIN_COMMANDLINE```|```PMA_CONTROLUSER```|```PMA_CONTROLPASS```|
|```PMA_HTPASSWD_USERNAME```|```PMA_HTPASSWD_PASSWORD```|```VARNISH_VERSION```|```SSL_SNIPPET```|
Variable
Value
LOCAL_TIMEZONE
to see local timezones
DIRECTORY_PATH
pwd at command line
DATABASE_IMAGE_NAME
mariadb or mysql
DATABASE_CONT_NAME
mariadb, mysql or custom name
DATABASE_PACKAGE_MANAGER
mariadb
apt-get update && apt-get install -y gettext-base
mysql
microdnf install -y gettext
DATABASE_ADMIN_COMMANDLINE
mariadb
mariadb-admin
mysql
mysqladmin
VARNISH_VERSION
centos version 9+ and fedora
latest
the others
stable
SSL_SNIPPET
localhost
echo 'Generated Self-signed SSL Certificate at localhost'
remotehost
certbot certonly --webroot --webroot-path /tmp/acme-challenge --rsa-key-size 4096 --non-interactive --agree-tos --no-eff-email --force-renewal --email ${LETSENCRYPT_EMAIL} -d ${DOMAIN_NAME} -d www.${DOMAIN_NAME}
and
```
cp ./webserver/extra/httpd-ssl.conf.template ./webserver/extra/httpd-ssl.conf
```
change example.com to your domain name in ```./webserver/extra/httpd-ssl.conf``` file.
```
cp ./phpmyadmin/apache2/sites-available/default-ssl.sample.conf ./phpmyadmin/apache2/sites-available/default-ssl.conf
```
change example.com to your domain name in ```./phpmyadmin/apache2/sites-available/default-ssl.conf``` file.
```
cp ./database/phpmyadmin/sql/create_tables.sql.template.example ./database/phpmyadmin/sql/create_tables.sql.template
```
change pma_controluser and db_authentication_password in ```./database/phpmyadmin/sql/create_tables.sql.template``` file.
#### Installation
Firstly: will create external volume
```
docker volume create --driver local --opt type=none --opt device=${PWD}/certbot --opt o=bind certbot-etc
```
Localhost ssl: Generate Self-signed SSL Certificate with guide [mkcert repository](https://github.com/FiloSottile/mkcert).
```
docker compose up -d
```
then reloading for webserver ssl configuration
```
docker container restart webserver
```
The containers are now built and running. You should be able to access the Drupal installation with the configured IP in the browser address. `https://example.com`.
For convenience you may add a new entry into your hosts file.
### Portainer
```
docker compose -f portainer-docker-compose.yml -p portainer up -d
```
manage docker with [Portainer](https://www.portainer.io/) is the definitive container management tool for Docker, Docker Swarm with it's highly intuitive GUI and API.
You can also visit `https://example.com:9001` to access portainer after starting the containers.
### Usage
#### You could manage docker containers without command line with portainer.
#### Here’s a quick reference of commonly used Docker Compose commands
```
docker ps -a # Lists all containers managed by the compose file
```
```
docker compose start # Starts previously stopped containers
```
```
docker compose stop # Stops all running containers
```
```
docker compose down # Stops and removes containers, networks, etc.
```
```
docker compose down -v # Add --volumes to remove volumes explicitly
```
```
docker rm -f $(docker ps -a -q) # Removes portainer and the other containers
```
```
docker volume rm $(docker volume ls -q) # Removes all volumes
```
```
docker network prune # Remove all unused networks
```
```
docker system prune # Removes unused data (containers, networks, images, and optionally volumes)
```
```
docker system prune -a # Removes all unused images, not just dangling ones
```
```
docker rmi $(docker image ls -q) # Removes portainer and the other images
```
```
docker container logs container_name_or_id # Shows logs from all services
```
#### Project from existing source
Copy all files into a new directory:
```
docker compose up -d # Starts services in detached mode (in the background)
```
#### Docker run reference
[https://docs.docker.com/reference/cli/docker/compose/](https://docs.docker.com/reference/cli/docker/compose/)
#### Website
You should see the "Drupal installation" page in your browser. If not, please check if your PHP installation satisfies Drupal's requirements.
```
https://example.com
```
add or remove code in the ./php-fpm/php/conf.d/security.ini file for custom php.ini configurations
[https://www.php.net/manual/en/configuration.file.php](https://www.php.net/manual/en/configuration.file.php)
You should make changes custom host configurations ```./php-fpm/php-fpm.d/z-www.conf``` then must restart service, FPM uses php.ini syntax for its configuration file - php-fpm.conf, and pool configuration files.
[https://www.php.net/manual/en/install.fpm.configuration.php](https://www.php.net/manual/en/install.fpm.configuration.php)
```
docker container restart drupal
```
add and/or remove drupal site folders and files with any ftp client program in ```./drupal``` folder.
You can also visit `https://example.com` to access website after starting the containers.
#### Webserver
add or remove code in the ```./webserver/extra/httpd-ssl.conf``` file for custom apache2/httpd configurations
[https://httpd.apache.org/docs/2.4/](https://httpd.apache.org/docs/2.4/)
#### Database
ADVANCED OPTIONS -> |```Host: database```|```Username: root```|```Password: root password```|
[https://mariadb.com/kb/en/configuring-mariadb-with-option-files/](https://mariadb.com/kb/en/configuring-mariadb-with-option-files/)
[https://dev.mysql.com/doc/](https://dev.mysql.com/doc/)
#### Redis
at page https://example.com/en/admin/modules, filter: redis and check then install.
if there isn't these lines, Edit Drupal settings file: ```./drupal/sites/default/settings.php``` and add these lines at the bottom of the file:
```
$settings['redis.connection']['interface'] = 'PhpRedis';
// Host ip address.
$settings['redis.connection']['host'] = 'redis';
$settings['cache']['default'] = 'cache.backend.redis';
// Redis port.
$settings['redis.connection']['port'] = '6379';
$settings['redis.connection']['base'] = 12;
// Password of redis updated in php.ini file.
// $settings['redis.connection']['password'] = "password";
$settings['cache']['bins']['bootstrap'] = 'cache.backend.chainedfast';
$settings['cache']['bins']['discovery'] = 'cache.backend.chainedfast';
$settings['cache']['bins']['config'] = 'cache.backend.chainedfast';
```
Create ```./drupal/sites/default/files/services.yml``` inisde default folder and add the below code in it.
```
services:
# Cache tag checksum backend. Used by redis and most other cache backend
# to deal with cache tag invalidations.
cache_tags.invalidator.checksum:
class: Drupal\redis\Cache\RedisCacheTagsChecksum
arguments: ['@redis.factory']
tags:
- { name: cache_tags_invalidator }
# Replaces the default lock backend with a redis implementation.
lock:
class: Drupal\Core\Lock\LockBackendInterface
factory: ['@redis.lock.factory', get]
# Replaces the default persistent lock backend with a redis implementation.
lock.persistent:
class: Drupal\Core\Lock\LockBackendInterface
factory: ['@redis.lock.factory', get]
arguments: [true]
# Replaces the default flood backend with a redis implementation.
flood:
class: Drupal\Core\Flood\FloodInterface
factory: ['@redis.flood.factory', get]
```
#### Varnish
at page https://example.com/en/admin/modules, filter: purge and check then install.
Varnish Server Hostname: |```varnish```|
Varnish Server Port: |```8080```|
Scheme: |```http```|
[This link is to complete configure Varnish](https://www.varnish-software.com/developers/tutorials/configuring-varnish-drupal/#4-configure-caching-and-purging-in-drupal)
All necessary changes to sites/default and sites/default/settings.php have been made, so you should remove write permissions to them now in order to avoid security risks.
```
sudo chmod 655 ./drupal/sites/default/settings.php
```
#### phpMyAdmin
You can add your own custom config.inc.php settings (such as Configuration Storage setup) by creating a file named config.user.inc.php with the various user defined settings in it, and then linking it into the container using:
```
./phpmyadmin/config.user.inc.php
```
You can also visit `https://example.com:9090` to access phpMyAdmin after starting the containers.
The first authorize screen(htpasswd;username or password) and phpmyadmin login screen the username and the password is the same as supplied in the `.env` file.
#### backup
This will back up the all files and folders in database/dump sql and html volumes, once per day, and write it to ```./backups``` with a filename like backup-2023-01-01T10-18-00.tar.gz
##### can run on a custom cron schedule
```BACKUP_CRON_EXPRESSION: '20 01 * * *'``` the UTC timezone.