Dans cet article, on va voir comment faire un reverse proxy qui détecte l’ajout d’un site, génère un certificat SSL SAN pour les noms associés sans aucune action de notre part :)
Docker-compose
Pour avoir un exemple plus parlant, on partira sur un site WordPress, créé avec docker-compose.
Træfɪk
L’outil magique qui nous servira de reverse proxy.
Structure
.
|-- acme
| `-- acme.json
|-- compose
| `-- soins-naturels.net
| |-- data
| | |-- mysql
| | `-- wp-content
| `-- docker-compose.yml
`-- docker-compose.yml
Acme
C’est le doux nom pour Let’s Encrypt, vous aurez la liste de vos domaines ainsi que les clés associées dans le fichier json.
Compose
Contient tous les sites, le docker-compose ainsi que les données du site : la base de donnée ainsi que les fichiers.
docker-compose.yml
La configuration du reverse proxy.
Configuration
Network
On va créer un network pour avoir chaque configuration dans son propre dossier et ne pas tout mélanger.
docker network create web
Træfɪk
./docker-compose.yml
version: "2"
services:
traefik:
image: traefik:v1.1.2-alpine
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /dev/null:/traefik.toml
- ./ssl:/etc/traefik/ssl
- ./acme:/etc/traefik/acme
command: --web -c /dev/null --docker --logLevel=INFO --docker.watch --acme --acme.OnHostRule=true --acme.storage=/etc/traefik/acme/acme.json [email protected] --acme.entryPoint=https --entryPoints='Name:http Address::80' --entryPoints='Name:https Address::443 TLS' --defaultentrypoints=http,https --acme.domains="unstickers.com"
restart: always
environment:
- "affinity:container!=traefik*"
networks:
- web
networks:
web:
external:
name: web
Træfɪk est mappé avec les ports 80/443 de l’host.
Il est lancé en mode docker avec rechargement automatique de la configuration à chaque changement d’état des containeurs.
On active la génération des certificats SSLs et la génération se fera directement depuis la configuration des clients. L’email associé pour les relances est le miens.
WordPress
./compose/soins-naturels.net/docker-compose.yml
version: "2"
services:
soinsnaturels:
image: wordpress
expose:
- 80
- 443
volumes:
- ./data/wp-content/:/var/www/html/wp-content
labels:
- "traefik.port=80"
- "traefik.backend=soinsnaturels"
- "traefik.frontend.rule=Host:soins-naturels.net,www.soins-naturels.net,dev.soins-naturels.net"
- "traefik.docker.network=web"
environment:
- WORDPRESS_DB_PASSWORD=*******
- WORDPRESS_DB_HOST=*******
networks:
- web
- internal
links:
- mysql
depends_on:
- mysql
restart: always
mysql:
image: mysql:5.7
volumes:
- ./data/mysql/:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=*******
- MYSQL_DATABASE=*******
networks:
- internal
restart: always
networks:
web:
external:
name: web
internal:
driver: bridge
On expose les ports 80 et 443 du container.
traefik.port=80 Træfɪk route le trafic sur le port 80.
traefik.backend=soinsnaturels Træfɪk utilise le backend soinsnaturels, on prendra soin d’avoir un backend unique pour chaque site.
traefik.frontend.rule=Host:soins-naturels.net,www.soins-naturels.net,dev.soins-naturels.net On déclare les noms de domaines qu’on utilisera. Un certificat SSL SAN sera généré contenant tous ces domaines.
traefik.docker.network=web Træfɪk utilise le network web pour communiquer avec ce container.
Merci
Des articles qui m’ont bien aidé à mettre en place cette configuration :