Docker : mise en place d’un WordPress derrière un reverse proxy Nginx et Let’s Encrypt

Comme je disais dans mon article sur le pourquoi du comment de ce blog, le but est de se faire la main sur Docker. Je cherchais (et j’ai trouvé plutôt rapidement) une image configurée pour faire du reverse proxy Nginx.

Reverse Proxy Nginx

L’image qui ressort partout sur le Web pour cette fonction : jwilder/nginx-proxy

Elle est top puisque couplée à une autre image du même auteur (nginx-gen), elle surveille la création de nouveau container. Elle est alors capable de régénérer les fichiers de configuration de Nginx à la volée pour ensuite le redémarrer.

Le but étant de pouvoir router chaque domaine et sous-domaine vers un container en particulier :

Plusieurs sous-domaine sur une même IP et Nginx route vers le bon container | Merci Florian Lopes pour l'illustration | Reverse proxy Nginx
Plusieurs sous-domaines sur une même IP et Nginx route vers le bon container | Merci Florian Lopes pour l’illustration (et pour le début de piste)

Let’s Encrypt

Bon c’est un bon début, mais il faut ajouter à ça du SSL ! Bah oui en 2017 ça devient obligatoire et Google nous y force (mais ce n’est pas plus mal) !

Il existe bien entendu une image qui se marie avec la précédente : JrCs/docker-letsencrypt-nginx-proxy-companion

Docker Compose

Bon du coup on va utiliser Docker-compose, et ça tombe bien, un gars à mis son docker-compose.yml sur GitHub ! Magique !

Il regroupe 3 images : Nginx, jwilder/docker-gen et jrcs/letsencrypt-nginx-proxy-companion. Toute l’explication se trouve ici.

Une seule chose à deviner sinon ça ne marchera pas pour la suite, il faut renseigner le réseau sur lequel on veut que cette pile (stack) « se mette ». On ajoute donc à la fin du docker-compose.yml :

docker-compose.yml
networks:
default:
external:
name: nginx-proxy

Ensuite on créer ce réseau nginx-proxy et on peut enfin lancer notre container :

docker network create nginx-proxy
docker-compose up -d

 

En théorie une fois le container lancé, en accédant à notre domaine on devrait tomber sur une belle erreur 503 de Nginx, c’est bon signe ça veut dire qu’il fonctionne. 😀

WordPress

Pour WordPress je me suis contenté de suivre la suite du tuto proposé par evertramosevertramos/wordpress-docker-letsencrypt

Docker + Nginx + Let's Encrypt + WordPress

Son docker-compose lance deux containers, un premier avec MariaDB comme BDD à la place de MySQL, et un second avec l’image WordPress officielle qui est reconstruite avec quelques ajouts. La encore pour que cette stack se connecte au bon réseau il faudra ajouter à la fin de ce fichier docker-compose.yml :

docker-compose.yml
networks:
default:
external:
name: nginx-proxy

On peut voir que différents volumes sont créés permettant de rendre persistant le répertoire de WordPress et la base de données. A ce sujet, je ferais un autre article avec mes scripts permettant de sauvegarder BDD + WordPress.

A noter qu’au premier accès à l’url du WordPress fraîchement installé, il y avait un souci de redirection HTTP vers HTTPS au niveau de certains fichiers CSS et JS (mais pas PHP). J’ai du reboot mon serveur OVH et redémarrer les deux stacks sans rien changer d’autre pour régler ce problème.

Enfin, j’ai un problème que je n’ai toujours pas résolu :

Dans mon panel OVH au niveau des zones DNS, j’ai une redirection de www.blog.domaine.tld vers blog.domaine.tld et ensuite un enregistrement de type A de blog.domaine.tld vers l’IP de mon serveur. Là, le fichier .htaccess s’occupe de rediriger vers le HTTPS. Par contre si je tape dans la barre d’adresse https://www.blog.domaine.tld je me retrouve sur une erreur de certificat (NET::ERR_CERT_COMMON_NAME_INVALID)…

Problème résolu : Il suffisait d’attendre un peu la résolution DNS (blog.domaine.tld et www.blog.domaine.tld pointant tous les deux sur l’IP de mon serveur), puis au moment de déclarer le container WordPress, de déclarer les deux domaines :

docker-compose.yml
VIRTUAL_HOST: blog.raphaelchochon.io,www.blog.raphaelchochon.io
VIRTUAL_PROTO: https
VIRTUAL_PORT: 443
LETSENCRYPT_HOST: blog.raphaelchochon.io,www.blog.raphaelchochon.io

Et enfin insérer une redirection 301 dans le .htaccess :

.htaccess
# BEGIN Ajout perso
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# END Ajout perso

 

EDIT 12/2017 : Ce blog n’est plus sous Docker, et je ne suis pas allé plus loin non plus concernant les sites Météo06…