Configuration de Traefik en reverse proxy pour gérer 2 serveurs Yunohost derriére une seule IP

Comme certains, j’héberge mon instance yunohost à la maison derrière une box . Le nom de domaine est défini chez OVH. J’en ai même 2. Un nom de domaine de production que nous appellerons yunohost.xyz et un nom de domaine de test que nous nommerons yunohost.net. Chaque nom de domaine à une instance yunohost dédiée sur un serveur physique dédié.

Pour pouvoir utiliser les 2 instances yunohost en même temps, il faut un reverse proxy pour diriger le trafic vers le bon serveur.

En frontal, des 2 serveurs Yunohost, j’ai donc installé un raspberry pi qui héberge le reverse proxy Traefik :

           OVH
      		|
    		|
       LiveBox Orange
      		|
    		|
   pi1 - Traefik - 192.168.1.10
  			|
  			|
       --------------------
       |                  |
       |                  |
yunohost.xyz          yunohost.net 
192.168.1.11            192.168.1.12

Je partage le premier jet de ma configuration Traefik car je n’ai pas trouvé la documentation du produit très claire sur le sujet. J’ai donc passé un peu de temps avec chatgpt pour trouver la bonne configuration et utliser le fameux “serversTransport”.

C’est un premier jet, il y a sans nul doute des choses à améliorer.

1 - Installation de Traefik :

- Récupérer le fichier tar.gz correspondant à la dernière version de Traefik sur github : Releases · traefik/traefik · GitHub

- Décompresser le tar.gz récupéré et le copier sur /usr :

tar xvf traefik_v3.7.8_linux_arm64.tar.gz 
sudo mv traefik /usr/local/bin/

- Créer les répertoires suivants :

# Créer les répertoires de configuration
sudo mkdir -p /etc/traefik/conf.d
sudo mkdir -p /var/log/traefik

# Créer un utilisateur dédié (sécurité)
sudo useradd -r -s /sbin/nologin traefik

# Attribuer les permissions
sudo chown -R traefik:traefik /etc/traefik
sudo chown -R traefik:traefik /var/log/traefik
sudo chown -R traefik:traefik /usr/local/bin

- Créer le fichier de configuration principal /etc/traefik/traefik.yml

# Configuration statique de Traefik

# Points d'entrée réseau
entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

# Dashboard et API (attention : sécuriser en production !)
api:
  dashboard: true
  insecure: true  # À désactiver en production

# Providers de configuration dynamique
providers:
  file:
    directory: /etc/traefik/conf.d
    watch: true

# Logging
log:
  level: INFO
  filePath: /var/log/traefik/traefik.log

accessLog:
  filePath: /var/log/traefik/access.log

- Créer le service traefik /etc/systemd/system/traefik.service:

[Unit]
Description=Traefik Reverse Proxy
Documentation=https://doc.traefik.io/traefik/
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
User=traefik
Group=traefik
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik/traefik.yaml
ExecReload=/bin/kill -USR1 $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

# Sécurité
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/log/traefik /etc/traefik
PrivateTmp=true

# Capability pour les ports < 1024
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

- Démarrer le service traefik et vérifier son bon fonctionnement :

# Recharger systemd
sudo systemctl daemon-reload

# Activer le démarrage automatique
sudo systemctl enable traefik

# Démarrer le service
sudo systemctl start traefik

# Vérifier le statut
sudo systemctl status traefik

- Accéder au dasboard de Traefik : http://192.168.1.10:8080/dashboard

2 - Configurer Traefik pour 2 serveurs Yunohost

- Dans /etc/traefik/conf.d, créer le fichier yunohostxyz.yml pour le domaine yunohost.xyz. Il faudra y spécifier l’ensemble des sous-domaines du domaine utilisé :

http:
  serversTransports:
    yunohostTransport:
      insecureSkipVerify: true
  routers:
    yunohost-http:
      rule: Host(`yunohost.xyz`) || Host(`www.yunohost.xyz`) || Host(`glance.yunohost.xyz`) || Host(`glances.yunohost.xyz`) || Host(`joplin.yunohost.xyz`) || Host(`linkwarden.yunohost.xyz`) || Host(`translate.yunohost.xyz`)
      entryPoints:
        - web
      middlewares:
        - redirect-https
      service: yunohost
    yunohost-https:
      rule: Host(`yunohost.xyz`) || Host(`www.yunohost.xyz`) || Host(`glance.yunohost.xyz`) || Host(`glances.yunohost.xyz`) || Host(`joplin.yunohost.xyz`) || Host(`linkwarden.yunohost.xyz`) || Host(`translate.yunohost.xyz`)
      entryPoints:
        - websecure
      tls: {}
      service: yunohost
  middlewares:
    redirect-https:
      redirectScheme:
        scheme: https
  services:
    yunohost:
      loadBalancer:
        passHostHeader: true
		serversTransport: yunohostTransport
        servers:
          - url: https://192.168.1.11:443

- Dans /etc/traefik/conf.d, créer le fichier yunohostnet.yml pour le domaine yunohost.net :

http:
  serversTransports:
    yunohostnetTransport:
      insecureSkipVerify: true
  routers:
    yunohostnet-http:
      rule: Host(`yunohost.net`) || Host(`www.yunohost.net`) || Host(`glances.yunohost.net`)
      entryPoints:
        - web
      middlewares:
        - redirect-https
      service: yunohostnet
    yunohostnet-https:
      rule: Host(`yunohost.net`) || Host(`www.yunohost.net`) || Host(`glances.yunohost.net`)
      entryPoints:
        - websecure
      tls: {}
      service: yunohostnet
  middlewares:
    redirect-https:
      redirectScheme:
        scheme: https
  services:
    yunohostnet:
      loadBalancer:
        passHostHeader: true
        serversTransport: yunohostnetTransport
        servers:
          - url: https://192.168.1.12:443 

- Copier les clés et certificats des domaines et sous-domaines présents sous “/etc/yunohost/certs” des serveurs yunohost vers le serveur Traefik dans “/etc/traefik/certs” :

# Sur le serveur yunohost copier et renommer chaque certificat et clé
cp /etc/yunohost/certs/yunohost.xyz/crt.pem /u01/shared/tmp/yunohostxyz.cert
cp /etc/yunohost/certs/yunohost.xyz/key.pem /u01/shared/tmp/yunohostxyz.key

# Sur le serveur Traefik, récupérer l’ensemble des clés et certicats :
cp /u01/shared/tmp/yunohostxyz.cert /etc/traefik/certs/yunohostxyz.cert
cp /u01/shared/tmp/yunohostxyz.cert /etc/traefik/certs/yunohostxyz.cert

- Spécifier dans le fichier /etc/traefik/conf.d/tls.yml, l’ensemble des fichiers copiés:

tls:
  certificates:
    - certFile: /etc/traefik/certs/yunohostxyz.cert
      keyFile: /etc/traefik/certs/yunohostxyz.key
    - certFile: /etc/traefik/certs/glance-yunohostxyz.cert
      keyFile: /etc/traefik/certs/glance-yunohostxyz.key
    - certFile: /etc/traefik/certs/glances-yunohostxyz.cert
      keyFile: /etc/traefik/certs/glances-yunohostxyz.key
    - certFile: /etc/traefik/certs/joplin-yunohostxyz.cert
      keyFile: /etc/traefik/certs/joplin-yunohostxyz.key
    - certFile: /etc/traefik/certs/linkwarden-yunohostxyz.cert
      keyFile: /etc/traefik/certs/linkwarden-yunohostxyz.key
    - certFile: /etc/traefik/certs/translate-yunohostxyz.cert
      keyFile: /etc/traefik/certs/translate-yunohostxyz.key
    - certFile: /etc/traefik/certs/yunohostnet.cert
      keyFile: /etc/traefik/certs/yunohostnet.key
    - certFile: /etc/traefik/certs/glances-yunohostnet.cert
      keyFile: /etc/traefik/certs/glances-yunohostnet.key

Et voilà c’est prêt. Les fichiers dans conf.d sont dynamiques donc normalement pas besoin de redémarrer traefik pour la prise en compte des derniers fichiers de configuration. Mais il reste un dernier point : Rediriger sur votre box le trafic http et https entrant vers le serveur Traefik.