Déploiement WordPress : Docker, Nginx, Apache et SSL

Simplifiez le déploiement de votre site WordPress avec notre guide facile à suivre. Utilisez Docker Compose, Nginx, Apache et SSL pour un processus d’installation transparent.

Nous créerons également des volumes pour que les modifications ou mises à jour soient conservées lorsque le conteneur redémarre.

Cette configuration a été testée sur Google Cloud avec une instance exécutant Ubuntu 22.04 OS. Vous pouvez également mettre en place cette configuration sur n’importe quel service cloud comme AWS, Azure, DigitalOcean, ou sur des serveurs dédiés ou VPS.

Prérequis

  1. Installer Docker sur Ubuntu 22.04
  2. Installer Docker Compose sur Ubuntu 22.04.

Veuillez vous assurer d’avoir effectué toutes les étapes mentionnées ci-dessus.

  • Domaine dirigé vers l’adresse IP de votre serveur.
  • Docker installé et configuré.
  • Docker Compose installé et configuré.

Une fois tous les prérequis effectués, vous pouvez procéder à la configuration et au paramétrage de WordPress.

Créer le répertoire du projet

Connectez-vous en SSH à votre serveur et commencez par créer un nouveau répertoire de projet nommé wp-project. Vous pouvez également le nommer comme vous le souhaitez.

 
mkdir wp-project

Créer le fichier Docker Compose YML

Maintenant, naviguez à l’intérieur du répertoire du projet et créez un nouveau fichier docker-compose.yml avec la configuration suivante.

 
cd wp-project

Créez un nouveau fichier docker-compose.yml.

 
nano docker-compose.yml

Copiez tout le contenu ci-dessous et collez-le dans le fichier.

Configurer Docker Compose

Assurez-vous de remplacer les variables d’environnement mentionnées ci-dessous.

 

docker-compose.ymlversion: "3.9"
services:
    wordpress:
        container_name: wordpress
        image: wordpress:php8.2-apache
        restart: always
        stdin_open: true
        tty: true
        environment:
            WORDPRESS_DB_HOST: mariadb
            WORDPRESS_DB_USER: db_user
            WORDPRESS_DB_PASSWORD: db_user_pass
            WORDPRESS_DB_NAME: db_name
        volumes:
            - wordpress_data:/var/www/html
    mariadb:
        container_name: mariadb
        image: mariadb
        restart: always
        environment:
            MYSQL_DATABASE: db_name
            MYSQL_USER: db_user
            MYSQL_PASSWORD: db_user_pass
            MYSQL_RANDOM_ROOT_PASSWORD: 'root_pass'
        volumes:
            - db_data:/var/lib/mysql
    nginx:
        container_name: nginx
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./certbot/conf:/etc/nginx/ssl
            - ./certbot/data:/var/www/html
    certbot:
        container_name: certbot
        image: certbot/certbot:latest
        command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email -d domain.com -d www.domain.com
        volumes:
            - ./certbot/conf:/etc/letsencrypt
            - ./certbot/logs:/var/log/letsencrypt
            - ./certbot/data:/var/www/html
volumes:
    db_data:
    wordpress_data:

Appuyez sur CTRL-X suivi de Y et ENTER pour enregistrer et quitter le fichier.

Configuration Docker Compose : Explication

Voici les détails de configuration :

  • Version: Composer une version de fichier compatible avec le Docker Engine. Vous pouvez vérifier la compatibilité ici.
  • Services: Ici, nous avons quatre services nommés WordPress, MariaDB, nginx, et certbot.
  • Image: Nous utilisons la dernière version de WordPress avec PHP 8.2, Apache, Mariadb, Nginx, et Certbot images disponibles sur le Docker hub.
  • Volumes:
    • wordpress_data: Nous avons configuré ce répertoire pour qu’il soit synchronisé avec le répertoire que nous souhaitons utiliser comme racine web à l’intérieur du conteneur.
    • conf: Ici, nous placerons le fichier de configuration Nginx pour qu’il soit synchronisé avec le dossier conf.d Nginx par défaut à l’intérieur du conteneur.
    • cedtbot/conf: C’est ici que nous recevrons le certificat SSL, et cela sera synchronisé avec le dossier que nous voulons à l’intérieur du conteneur.
    • ports: Configurer le conteneur pour qu’il écoute les ports listés.
    • command: La commande utilisée pour recevoir le certificat SSL.
  • Environnement: Ici, nous listons tous les variables d’environnement disponibles pour l’image WordPress.
    • WORDPRESS_DB_HOST: Ici, nous utilisons le nom de service du conteneur MariaDB.
    • WORDPRESS_DB_USER: Identique à celui que nous avons configuré dans le service mariadb.
    • WORDPRESS_DB_PASSWORD: Identique à celui que nous avons configuré dans le service mariadb.
    • WORDPRESS_DB_NAME: Identique à celui que nous avons configuré dans le service mariadb.

Configurer Nginx

Selon la configuration du docker-compose.yml, nous devons créer le fichier default.conf à l’intérieur du répertoire nginx/conf.

Créez le répertoire à côté de votre fichier docker-compose.yml pour contenir le fichier de configuration.

 
mkdir -p nginx/conf

Créez un fichier nommé default.conf.

 
nano nginx/conf/default.conf

Placez les configurations suivantes ; ici, nous utilisons une configuration de proxy inverse vers le conteneur WordPress exécutant Apache.

 

nginx/conf/default.conf server {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain.com;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
        allow all; 
        root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }
} 

Appuyez sur CTRL-X suivi de Y et ENTER pour enregistrer et quitter le fichier.

Maintenant que vous avez votre configuration docker-compose et votre configuration Nginx.

Déployer WordPress avec Docker Compose

Démarrez les conteneurs en utilisant la commande suivante ; vous recevrez les certificats SSL une fois que les conteneurs seront démarrés.

 
docker-compose up -d

Une fois que tous les conteneurs sont démarrés, vous verrez deux dossiers supplémentaires, certbot et WordPress, créés à côté de votre fichier docker-compose.yml.

Le répertoire wordpress contient tout le code source de votre site WordPress.

Le répertoire certbot contient tous les fichiers liés à vos certificats SSL.

Pour voir les conteneurs, vous pouvez exécuter la commande suivante.

 
docker-compose ps

Configurer le certificat SSL Let’s Encrypt avec Nginx

Comme vous avez reçu le certificat SSL Let’s Encrypt, vous pouvez configurer HTTPS et mettre en place une redirection vers HTTPS.

Modifiez le default.conf et apportez les modifications suivantes.

 
nano nginx/conf/default.conf

 

nginx/conf/default.confserver {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain;

    return 301 https://www.domain.com$request_uri;
}

 server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    return 301 https://www.domain.com$request_uri; 
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name www.domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all; 
         root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }
} 

Appuyez sur CTRL-X suivi de Y et ENTER pour enregistrer et quitter le fichier.

Maintenant, vous pouvez redémarrer le service Nginx pour charger les nouvelles configurations.

 
docker-compose restart nginx

Maintenant, vous pouvez vérifier votre nom de domaine à partir de votre navigateur. Vous serez redirigé vers HTTPS, et vous verrez la page d’installation WordPress pour terminer l’installation.

Dépannage

Voici quelques conseils pour SSH vers les conteneurs ; consultez les journaux d’erreurs.

SSH vers le conteneur Docker

Pour SSH dans le conteneur wordpress, vous pouvez utiliser la commande ci-dessous.

 
docker-compose exec wordpress /bin/bash

Pour vous connecter en SSH au conteneur nginx, vous pouvez utiliser la commande ci-dessous.

 
docker-compose exec nginx /bin/bash

Vérifier les journaux des conteneurs

Vous pouvez utiliser la commande ci-dessous pour vérifier les journaux des conteneurs à l’aide de docker-compose

 
docker-compose logs -f

Redémarrer les conteneurs

Vous pouvez redémarrer les conteneurs en utilisant facilement la commande restart.

 
docker-compose restart container_name

Remplacer container_name par le nom de votre conteneur (wordpress, nginx, certbot)

Arrêter tous les conteneurs Docker

Vous pouvez arrêter tous les conteneurs Docker à l’aide de la commande ci-dessous.

docker-compose down

Supprimer tous les conteneurs et les volumes

Vous pouvez utiliser docker-compose pour supprimer tous les conteneurs et leurs volumes avec la commande ci-dessous.

 
docker compose rm -fv

Supprimer tous les conteneurs Docker

Supprimez tous les conteneurs à l’aide de la commande suivante.

 
docker rm -f $(docker ps -a -q)

Supprimer tous les volumes

Vous pouvez également supprimer tous les volumes à l’aide de la commande ci-dessous.

 
docker volume rm $(docker volume ls -q)

Démarrer tous les conteneurs

Avec une seule commande Docker compose, vous pouvez démarrer tous les conteneurs.

 
docker-compose up -d

Conclusion

Vous avez maintenant appris à installer et configurer WordPress avec Nginx, Apache, PHP 8.2, MariaDB et Let’s Encrypt avec Docker et Docker Compose sur Ubuntu 22.04.

Merci de votre temps.

Source:
https://dzone.com/articles/wordpress-deployment-docker-nginx-apache-ssl