Quelques notes sur Traefik v3
Je me suis mis en tête d'auto héberger quelques applications et de les rendre accessibles de l'extérieur... et j'ai voulu expérimenter l'utilisation d'un reverse proxy - l'idée étant, par exemple, de ne pas me préoccuper des certificats SSL. J'ai choisi Traefik 3, suite à plusieurs lectures et recommandations enthousiastes.
J'ai des applications PHP sous Symfony et Laravel, et des applications Node. J'utilise Docker en mode rootless, ce qui m'empêche par défaut d'exposer des ports inférieurs à 1024. Je n'ai pas eu spécialement envie de modifier /etc/sysctl.conf ^^
J'utilise le binaire de Traefik et j'ai choisi SystemD pour le démarrer / l'arrêter.
Je suis arrivé à avoir le fichier de conf Traefik suivant (dans /etc/traefik/traefik.yml)
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
traefik:
address: ":8080"
providers:
file:
filename: /etc/traefik/dynamic.yml
docker:
endpoint: "unix:///run/user/1001/docker.sock"
certificatesResolvers:
myresolver:
acme:
email: myemail@myemail.com
storage: /etc/traefik/acme/acme.json
httpChallenge:
entryPoint: web
Le fichier dynamic.yml contient
http:
routers:
appli_php:
rule: "Host(`mon_nom_de_domaine_php`)"
service: mon_appli_php
entryPoints:
- websecure
tls:
certResolver: myresolver
appli_node:
rule: "Host(`mon_nom_de_domaine_node`)"
entryPoints:
- websecure
tls:
certResolver: myresolver
service: mon_appli_node
services:
mon_appli_php:
loadBalancer:
servers:
- url: "http://localhost:8345" # notez le port - on le retrouve dans la configuration Apache2
mon_appli_node:
loadBalancer:
servers:
- url: "http://127.0.0.1:3000" # notez le port - on le retrouve dans la configuration de l'appli Node
Concernant l'appli PHP, j'utilise Apache2 pour pouvoir servir des ressources statiques - le fichier du virtualhost donne ceci
<VirtualHost *:8345>
ServerName localhost
ServerAdmin webmaster@test.com
<FilesMatch \.php$>
SetHandler proxy:fcgi://127.0.0.1:9082i # configurer PHP-FPM pour utiliser ce port
</FilesMatch>
DocumentRoot /path_vers_dossier_public_de_l_application
<Directory /path_vers_dossier_public_de_l_application>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/mon_appli_php.error.log
CustomLog ${APACHE_LOG_DIR}/mon_appli_php.access.log combined
</VirtualHost>
Pour la config de PHP-FPM, j'ai modifié le fichier www.conf du dossier pool.d dans /etc/php/versionPHP/
listen = 127.0.0.1:9082
Je n'ai pas utilisé Docker parce que j'avais déjà une configuration PHP complète mais j'aurais pu... et c'est ce que j'ai fait pour NodeJS
Mon appli Node a un frontend sous Nuxt et un backend en Express.
J'ai donc un Dockerfile pour Nuxt et un autre pour Express. Je passe les détails, mais le Dockerfile du backend permet d'exposer le port 3001 tandis que celui du frontend expose le port 3000 (que l'on retrouve dans Traefik). Ces 2 Dockerfile sont "reliés" via un compose.yaml à la racine du projet (en dehors des 2 dossiers frontend et backend). Il a la forme suivante :
services:
frontend:
build:
context: ./frontend
ports:
- "3000:3000"
labels:
- "traefik.enable=true"
networks:
- network_appli_node
backend:
build:
context: ./backend
environment:
- PORT=3001
ports:
- "3001:3001"
networks:
- network_appli_node
networks:
network_appli_node:
driver: bridge
.