Installer Traefik avec Docker

Guide d'installation de Traefik.

Installer Traefik avec Docker
traefik docker

Au sommaire :

  • 1-Qu'est-ce que Traefik ?
  • 2-Qu'est-ce qu'un reverse proxy ?
  • 3-Prérequis
  • 4-Acheter un nom de domaine
  • 5-Configuration initiale de Traefik
  • 6-Ouvrir les ports du routeur
  • 7-Les adresse IP publiques partagés et dynamique
  • 8-Déploiement de Traefik
  • 9-Exposer une application

1-Qu'est-ce que Traefik ?

Traefik est un reverse proxy et load balancer maintenu par la société française Traefik Labs et conçu par Emile Vauge en 2015.

Écrit en langage Go, il se différencie très vite de ses concurrents comme Apache et NGINX (qui sont à la base des serveurs web avec des fonctions de reverse proxy) en permettant de router (depuis la version 2) du HTTP/HTTPS mais aussi du TCP.

C'est plus qu'un simple reverse proxy, c'est un véritable routeur open-source.

Compatible avec de très nombreux provider et taillé pour les conteneurs, il écoute en permanence le sock de Docker pour détecter le moindre changement de modification de votre stack, génère automatiquement les certificats SSL pour vos applications et permet d'utiliser des middleware.

Dans l'univers des conteneurs, il est devenu un incontournable.

2-Qu'est-ce qu'un reverse proxy ?

Le rôle du reverse proxy est d'être en amont (front) de vos applications web et de réceptionner les requêtes provenant de l'internet public.

Comme le proxy est le point de passage obligé des utilisateurs d'une structure pour accéder à internet, le reverse proxy est le point de passage obligé pour les utilisateurs "de l'extérieur" pour accéder aux applications web d'une structure.

Sans reverse proxy, vous serez dans l'obligation d'ouvrir pour chacune de vos applications un port de votre routeur pour quelle soit accessible de l'extérieur donc imaginez au lieu de simplement taper l'adresse de votre serveur, vous devriez en plus taper son numéro de port pour pouvoir y accéder.

Pire, si vous n'avez pas de nom de domaine et que vous exposez le port de l'application sur l'internet public, l'utilisateur devra taper l'adresse IP publique suivi du numéro de port.

Multipliez ça par le nombre d'applications en production et vous avez droit à un joli bordel.

Plus le nombre de ports est ouvert, plus il y a de chance qu'ils soient scannés par les attaquants et plus il y a de possibilités d'attaques de l'extérieur.

Imaginez votre routeur comme une immense muraille et les ports ouverts comme des trous où les envahisseurs peuvent s’infiltrer.

C'est un euphémisme que de dire que ce n'est pas sécurisé car vous dévoilez des informations extrêmement sensibles qui peuvent êtres utilisé par un attaquant et que ce n'est pas pas du tout intuitif. Bref!!! C'est pas très convivial tout ça.

Avec un reverse proxy, ce dernier écoutera seulement sur les ports 80 et 443 qui sont les ports web par défaut et qui ne nécessitent pas d'indiqué un numéro de port, simplement de taper "http" ou "https" avant d'indiqué l'adresse de l'application que vous souhaitez accéder.

Donc lorsqu'un utilisateur de l'extérieur souhaitera accéder à votre application, si vous avez effectuer une redirection des ports sur votre box internet, le reverse proxy va rediriger la requête vers l'application et vous n'aurez pas à ouvrir un port à chacune de vos applications, ni à dévoiler votre adresse IP publique.

3-Prérequis

Il vous faudra une machine virtuelle sous Ubuntu Server 22.04 LTS.

Voici le guide pour ceux qui veulent repartir de zéro.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Si vous voulez gagner du temps, utilisez un template cloud-init.

Guide d’installation de Proxmox VE
Guide d’installation de Proxmox VE

Enfin, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.

Installer Docker
Guide d’installation de Docker.

Pour ceux qui n'ont jamais déployer d'applications web sur l'internet public, ce sera un grand moment d'émotion. Ça va grisant, palpitant, vous allez vous sentir pousser des ailes, mettre des triplés contre le PSG, contre Chelsea, mettre une Panenka à Ederson et GOAL!!!!!!!!!!

Plus sérieusement, on va tous profiter de ce transfert de connaissances. Pour ma part, ça me permis d'améliorer ma configuration perfectible tandis que pour vous, ça va vous donner l'opportunité de déployer vos applications sur l'internet public, d'apprendre à être responsable de votre infrastructure et de vous échapper du pouvoir des GAFAM.

Comme dirait Oncle Ben.

Le tutoriel a été validé à 100% dans mon HomeLab.

Maintenant, mettons nous au boulot!!!!

4-Acheter un nom de domaine

Tout d'abord, commencez par acheter un nom de domaine.

Pour ma part, j'ai opter pour OVH. C'est français, pas cher (1,99 euros) et ils disposent d'une API si on souhaite effectuer le challenge DNS.

Cliquez sur le lien suivant pour acheter un nom de domaine en .ovh.

Nom de domaine .ovh
Achetez votre nom de domaine en .ovh chez OVHcloud. Recherchez et Enregistrez un domaine .ovh pas cher et disponible avec un hébergement web gratuit 10Mo.

Je ne pense pas que ça mérite un tutoriel. Passez juste à la caisse et une fois que vous avez votre nom de domaine, revenons à la machine virtuelle.

5-Configuration initiale de Traefik

Dans le dossier "appdata", commencez par créer un dossier nommé "traefik".

mkdir traefik

Puis avec la commande "docker network", créez le réseau "web" qui sera le réseau dédié à Traefik.

docker network create web

En tapant "docker network ls", vous devriez trouver le réseau nouvellement créé.

Ce réseau sera connecté en "bridge", c'est à dire qu'il utilisera la carte réseau de la machine virtuelle via un pont.

Ensuite, créez un dossier "letsencrypt" et à l'intérieur, créez le fichier acme.json qui va contenir vos certificats SSL puis appliquer des droits dessus.

mkdir letsencrypt
touch acme.json

Appliquez des droits en lecture/écriture pour l'utilisateur. Avec ces droits, il sera inaccessible pour les membres d'un groupe ou les personnes extérieures.

chmod 600 acme.json

Ensuite dans le dossier "traefik", il va falloir créer deux fichiers de configuration qui seront chargé par Traefik au démarrage :

  • Un fichier statique
  • Un fichier dynamique

Vous pouvez le rédiger sous 3 formes :

  • Format YAML
  • Format TOML
  • Commandes CLI

Ayant opté au départ pour le format TOML, j'ai décider de basculer ma configuration au format YAML pour une question d’homogénéité et de lisibilité.

Je vous déconseille les commandes CLI, ça va alourdir votre fichier de déploiement et le rendre illisible.

Commençons par le fichier statique.

Fichier de configuration statique

Allez dans le dossier de Traefik (home/<username>/appdata/traefik) et créez le fichier "traefik.yml".

touch traefik.yml
nano traefik.yml

Activez le dashboard de Traefik.

api:
  dashboard: true

Ensuite, indiquez le chemin des logs et le niveau de journalisation. Dans "level", mettez sur DEBUG au début puis supprimez la ligne pour afficher seulement les messages d'erreurs (ERROR est la configuration par défaut).

log:
  filePath: "/logs/traefik.log"
  level: DEBUG

Indiquez le chemin des logs d’accès et le nombre de lignes à afficher.

accessLog:
  filePath: "/logs/access.log"
  bufferingSize: 100

On entre dans la partie la plus importante de la configuration.

Nous allons indiqué à Traefik d'écouter les ports :

  • 80 (HTTP) qui sera nommé "web"
  • 443 (HTTPS) qui sera nommé "websecure"

Nous allons également faire en sorte de rediriger toutes les requêtes du port 80 vers le port 443 pour bénéficier du HTTPS et des certificats SSL. Ça fera un label en moins à ajouter pour nos conteneurs.

Enfin, indiquez que c'est Let's Encrypt qui va générer les certificats SSL.

entryPoints:
  web:
    address: ':80'
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ':443'
    http:
      tls:
        certResolver: letsencrypt

Pour générer les certificats SSL, vous avez le choix entre deux serveurs de certifications :

  • acme-staging-v02 pour la pré-production
  • acme-v02 pour la production

acme-staging-v02 est à utiliser en premier si votre configuration comporte des erreurs car il comporte moins de limite dans la génération de certificats :

  • La limite de certificats par domaine enregistré est de 30 000 par semaine.
  • La limite de duplicata de certificat est de 30 000 par semaine.
  • La limite d'échec de validation est de 60 par heure.
  • La limite de comptes par adresse IP est de 50 comptes par période de 3 heures par IP.
  • Pour ACME v2, la limite des nouvelles demandes est de 1 500 nouvelles demandes par période de 3 heures par compte.

Autant dire que vous avez une sacré marge.

Dés lors que votre configuration est optimale, cochez acme-staging-v02 et décochez acme-v02 pour générer de vrais certificats SSL.

Pour en savoir plus, je vous laisse ce lien (c'est bon pour la culture générale).

Environnement de pré-production
Nous recommandons vivement de procéder à des tests dans notre environnement de pré-production avant d&rsquo;utiliser notre environnement de production. Cela vous permettra de faire les choses correctement avant d&rsquo;émettre des certificats de confiance et de réduire le risque de vous heurter à de…

Ensuite, indiquez votre adresse mail et le fichier "acme.json" qui contiendra les certificats SSL puis choisissez (ou exécutez, au choix haha) un type de challenge parmi 3 existants :

  • Challenge HTTP-01 : fonctionnant sur le port 80, c'est le plus simple et le plus utilisé actuellement. Let's Encrypt va donner un jeton à votre client acme et placer le fichier (jeton + empreinte de votre compte) sur votre serveur web à l'adresse http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>.
  • TLS-ALPN-01 : similaire au challenge HTTP mais basé sur le port 443 (HTTPS). À noter qu'il n'est pas supporté par Apache, Nginx ou Certbot donc privilégiez le challenge HTTP.
  • Challenge DNS-01 : plus complexe, il vérifie si vous êtes réellement le propriétaire du nom de domaine en interrogeant l'API de votre DNS et permet de générer des certificats "wildcard" (un certificat pour votre nom de domaine et vos sous-domaines). À noter que pour des raisons de sécurité, cette méthode est peu utilisé en entreprise car elle nécessite de donné des droits à Traefik pour créer ou supprimer les entrées DNS et de stocker les informations de l'API sur le serveur web.

Paradoxalement, alors que j'avais une expérience proche du néant, j'utilise le challenge DNS depuis 2020 en lieu et place du challenge HTTP qui est beaucoup plus simple.

Donc pour ce tutoriel, nous utiliseront le challenge HTTP que je vient de mettre en place pour l'occasion et qui fonctionne à merveille.

Ce challenge nécessite d'avoir le port 80 ouvert donc je ne saurait trop vous conseiller de fermer ce port d'écoute dés lors que vous avez générer les certificats de l'ensemble de vos applications pour limiter la surface d'attaque.

Pour plus d'informations.

Types de Challenges
Lorsque vous obtenez un certificat de Let&rsquo;s Encrypt, nos serveurs valident que vous contrôlez les noms de domaine dans ce certificat en utilisant des &ldquo;challenges&rdquo;, comme défini par la norme ACME. La plupart du temps, cette validation est traitée automatiquement par votre client ACM…

On indique simplement "httpchallenge" et comme point d'entrée "web" (le port d'écoute 80).

certificatesResolvers:
  letsencrypt:
    acme:
      caServer: 'https://acme-staging-v02.api.letsencrypt.org/directory'
#      caServer: 'https://acme-v02.api.letsencrypt.org/directory'
      email: <votreaddressemail>
      storage: acme.json
      httpchallenge:
        entrypoint: web

Nous allons permettre à Traefik d'écouter sur le sock de Docker en temps réel pour qu'il puisse détecter toutes les modifications touchant aux conteneurs sur le réseau "traefik" (réseau dédié aux conteneurs exposés au web, on verra ça plus bas).

À noter que si l'option "exposeByDefault" et sur "true", vous n'avez pas besoin d'ajouter le label "traefik.enable.true" à vos conteneurs car ils seront tous exposés par défaut mais je vous conseille de ne pas y toucher et d'utiliser le label pour exposer manuellement les conteneurs.

providers:
  docker:
    endpoint: unix:///var/run/docker.sock
    exposedByDefault: false
    watch: true
    network: web

À la fin, cela devrait ressembler à ça.

api:
  dashboard: true

log:
  filePath: "/logs/traefik.log"
  level: DEBUG

accessLog:
  filePath: "/logs/access.log"
  bufferingSize: 100

entryPoints:
  web:
    address: ':80'
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ':443'
    http:
      tls:
        certResolver: letsencrypt
     
certificatesResolvers:
  letsencrypt:
    acme:
      caServer: 'https://acme-staging-v02.api.letsencrypt.org/directory'
#      caServer: 'https://acme-v02.api.letsencrypt.org/directory'
      email: <votreadressemail>
      storage: acme.json
      httpchallenge:
        entrypoint: web

serversTransport:
  insecureSkipVerify: true

providers:
  docker:
    endpoint: unix:///var/run/docker.sock
    exposedByDefault: false
    watch: true
    network: web

Maintenant qu'on a finaliser la configuration initiale, passons à l'étape suivante.

Fichier de configuration dynamique

On va mettre en place une authentification basique pour que le dashboard de Traefik ne soit pas accessible par n'importe qui.

Allez sur ce site puis indiquez un identifiant et un mot de passe. Le site va hashé et salé le mot de passe pour mieux le sécuriser.

Create password credentials for htaccess and htpasswd files - HTPasswd Generator | Web 2.0 Generators
Create password credentials for htaccess and htpasswd files

Ensuite, allez créer un dossier "shared" dans le dossier de Traefik.

mkdir shared

Puis créez un fichier nommé ".htpasswd", copiez les identifiants que vous venez de générer et enregistrez le tout.

username:mystrongpassword

Ensuite, créez un fichier "dynamic.yml" dans le dossier de Traefik

nano dynamic.yml

Et ajoutez les lignes suivantes. On va créer un middleware nommé "basicAuth" où l'on va indiquer les identifiants que l'ont vient de générer et le chemin du fichier ".htpassd".

Plus bas, on va indiqué dans la section dashboard le nom de domaine que l'on va utiliser, l'API de Traefik et le middleware que l'on va utiliser pour l'authentification.

http:
  middlewares:
    middlewares-basic-auth:
      basicAuth:
        users:
          - "user:hashed_password"
        usersFile: "/shared/.htpasswd"
        realm: "Traefik 2 Basic Auth"

  routers:
    dashboard:
      rule: Host(`traefik.<votredomaine>.ovh`)
      service: api@internal
      middlewares:
        - middlewares-basic-auth

Vous enregistrez le tout. Avant de déployer Traefik, il vous faudra :

  • Ouvrir les ports 80 et 443 de votre box internet
  • Vérifiez si vous avez une adresse IP statique ou dynamique

6-Ouvrir les ports du routeur

Il va falloir ouvrir les ports d'écoute 80 et 443 de votre box internet. Ce cas étant très peu expliqué dans la plupart des tutoriels, je vais vous prendre par la main et vous guider pour configurer la Freebox et la Livebox, les box internet les plus utilisés en France.

Freebox

Dans les paramètres de votre Freebox, allez dans "Connexion à internet", cliquez sur "Gestion des ports" et "Ajouter une redirection" pour ouvrir les ports 80 et 443 puis rediriger les requêtes vers l'adresse IP de la machine virtuelle.

Port 80

  • IP Destination : l'adresse IP de votre machine virtuelle
  • IP source : Toutes
  • Protocole : TCP
  • Port de début, de fin et de destination : 80
  • Commentaire : mettez ce que vous voulez

Port 443

  • IP Destination : l'adresse IP de votre machine virtuelle
  • IP source : Toutes
  • Protocole : TCP
  • Port de début, de fin et de destination : 443
  • Commentaire : mettez ce que vous voulez

Livebox

Pour les possesseurs de Livebox, allez dans Réseau puis NAT/PAT puis créez deux règles NAT (Network Address Translation) pour ouvrir les ports 80 et 443 et rediriger les requêtes vers l'adresse IP de la machine virtuelle.

Port 443

  • Application/Service : Secure Web Server_HTTPS_
  • Port interne : 443
  • Port externe : 443
  • Protocole : TCP
  • Equipement : le nom donné par la Livebox à votre machine virtuelle
  • IP externe : laissez sur "Toutes"

Cliquez sur "Créer".

Port 80

  • Application/Service : Web Server_HTTP_
  • Port interne : 80
  • Port externe : 80
  • Protocole : TCP
  • Equipement : le nom donné par la Livebox à votre machine virtuelle
  • IP externe : laissez sur "Toutes"

Cliquez sur "Créer".

7-Les adresse IP publiques partagés et dynamique

Sur votre Freebox, si le port de début est en rouge et que l'icone "sauvegarder" est grisé, c'est que vous n'avez pas d'adresse IP FullStack (IP publique statique).

Votre adresse IP pubique est en fait partagé avec d'autres abonnés.

Dans ce cas, faites la demande sur votre compte client car il vous est impossible dans l'état actuel des choses d'ouvrir certains ports.

Chez Orange, l'adresse adresse IP chez Orange est dynamique, ce qui peux poser des problèmes si vous souhaitez héberger vos propres applications à domicile.

Mais pas de panique, OVH propose un DNS dynamique et Orange à également prévu une option pour ce genre de cas dans les paramètres de sa Livebox.

Paramétrer un DNS dynamique pour son nom de domaine
Apprenez à paramétrer un enregistrement DNS dynamique (DynHost) pour votre nom de domaine OVHcloud

Tout d'abord, allez sur votre compte OVH, authentifiez-vous, cliquez sur DynHost puis sur "Ajouter un DynHost".

Commencez par créer un identifiant pour pouvoir l'utiliser sur votre Livebox et synchroniser votre adresse IP publique dynamique.

Puis, créez un sous nom de domaine avec le nom que vous voulez, ajoutez votre adresse IP publique actuelle et cliquez sur "Valider".

Dés que c'est terminer, retournez sur votre Livebox et allez dans Réseau puis DynDNS.

  • Service : choisissez "OVH-dynhost
  • Nom d'hôte/de domaine : le nom de domaine
  • Email utilisateur/mot de passe : l'adresse mail et le mot de passe que vous avez renseigné chez OVH

Puis cliquez sur "Enregistrer".

Il faudra répéter cette opération à chaque fois que vous souhaitez ajouter un nouveau nom de domaine.

Votre Livebox sera synchronisé à votre compte OVH donc dés que votre adresse IP publique changera, cela se répercutera chez OVH pour que vous ne puissiez pas perdre l’accès à vos applications web.

8-Déploiement de Traefik

Commencez par créer un dossier "docker" à la racine du dossier utilisateur"

mkdir -p ~/docker

Créez un fichier nommé "compose.yml"

touch ~/docker/compose.yml

Ouvrez le fichier "compose.yml" et copiez cette configuration.

version: "3.9"

networks:
  web:

services:

  traefik:
    container_name: traefik
    image: traefik:latest
    restart: always
    network:
      web:
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ${APPDATA}/traefik/logs:/logs
      - ${APPDATA}/traefik/traefik.yml:/traefik.yml
      - ${APPDATA}/traefik/dynamic.yml:/dynamic.yml
      - ${APPDATA}/traefik/letsencrypt/acme.json:/acme.json
    labels:
      - traefik.enable=true
      - traefik.http.routers.traefik-dash.entrypoints=websecure
      - traefik.http.routers.traefik-dash.rule=Host(`traefik.<votredomaine>.ovh`)
      - traefik.http.routers.traefik-dash.service=api@internal
      - "traefik.http.routers.traefik.middlewares=middlewares-basic-auth@file"
  • version : version du fichier compose : https://docs.docker.com/compose/compose-file/compose-file-v3/
  • network : indiquez uniquement le réseau "web" dédié à Traefik (l'adresse IP sera celle de la machine virtuelle ou du conteneur LXC).
  • services : c'est là qu'il faudra ajouter les configurations de vos conteneurs
  • image : nom du registry suivi du nom de l'application (lscr.io/linuxserver/app_name)
  • container_name : le nom du conteneur, sinon Docker en choisira un de manière aléatoire (mieux vaut le nommer vous même)
  • volumes : on indique le sock de Docker pour que Traefik puisse écouter en permanence (en lecteure seule), puis 3 chemins avec la variable ${APPDATA) (/home/user_name/appdata) où vous allez indiqué le chemin des logs, du fichier statique, du fichier dynamique et du fichier acme qui contiendra tout vos certificats SSL
  • ports : 80 (HTTP) et 443 (HTTPS). Aucune autre application n'utilisera ces ports à part Traefik
  • restart : unless-stopped par défaut. Le daemon de Docker redémarrera automatiquement le conteneur sauf si vous l’arrêtez, il faudra le démarrer manuellement

Ensuite, regardons de plus prés la partie des labels propre à Traefik.

Commencez par activer Traefik pour pouvoir lui ajouter des services et des routeurs.

- traefik.enable=true

Ensuite, vous allez créé plusieurs routeurs.

Indiquez que le dashboard de Traefik doit passer par le point d'entrée "websecure" soit le HTTPS, obligatoire pour obtenir le précieux certificat SSL et avoir des échanges sécurisés.

- traefik.http.routers.traefik-dash.entrypoints=websecure

Puis créez une règle (rule) en indiquant le nom de domaine lié à l'application pour qu'on puisse y accéder à travers ce dernier.

- traefik.http.routers.traefik-dash.rule=Host(`traefik.<votredomaine>.ovh`)

Indiquez qu'il doit communiqué avec l'API.

- traefik.http.routers.traefik-dash.service=api@internal

Enfin, ajoutez le middleware "basic-auth".

- "traefik.http.routers.traefik.middlewares=middlewares-basic-auth@file"

Téléchargez le conteneur et déployez le avec la commande suivante.

docker compose pull && docker compose create && docker start traefik

Accédez au nom de domaine lié à Traefik et vous devriez avoir ce joli popup qui vous demande de vous authentifiez.

Félicitation!!!!!!! Vous avez réussit à configurer Traefik de main de maître.

9-Exposer une application

Pour ce guide, j'ai mis à jour le tutoriel sur Jellyfin pour que vous puissiez rendre accessible votre instance sur l'internet public avec Traefik.

(Docker) Jellyfin, le serveur multimédia libre
Au sommaire : * Qu’est-ce que Jellyfin ? * Prérequis * Déploiement * Configuration * Transcodage GPU (Intel) * Intégration à Kodi via JellyCon 1-Qu’est-ce que Jellyfin ? Sorti le 30 novembre 2018, Jellyfin est un serveur multimédia libre sous licence GPLv2, basé sur la dernière version ope…

Mais pour rendre accessible votre instance, vous allez devoir ajouter 3 nouveaux éléments à votre manifeste YAML.

Créer un nouveau réseau

Déjà vu plus haut, il faut indiqué sur quel réseau vous souhaitez rendre accessible votre application.

Pour faire au plus simple, le réseau "web" est suffisant pour exposer votre application sur l'internet public et y accéder en local (en indiquant les ports à ouvrir).

Une autre solution serait d'isolé le réseau "web" avec un sous réseau (192.168.90.0/24 par exemple) pour que les applications soient inaccessibles en local et uniquement sur l'internet public et de créer un deuxième réseau (local, internal par exemple) pour accéder à vos applications à travers le réseau local

version: "3.9"

networks:
  web:

Les labels Traefik

C'est la partie la plus intéressante et que vous allez devoir bien connaitre car sans ça, vous ne pourrez pas exposer vos applications avec Traefik.

Pour que Traefik puisse interagir avec Jellyfin, activez Traefik pour pouvoir lui ajouter des services et des routeurs.

- traefik.enable=true

Ensuite, vous allez créé plusieurs routeurs.

Indiquez que Jellyfin doit passer par le point d'entrée "websecure" soit le HTTPS, obligatoire pour obtenir le précieux certificat SSL et avoir des échanges sécurisés.

- traefik.http.routers.jellyfin.entrypoints=websecure

Puis créez une règle (rule) en indiquant le nom de domaine lié à l'application pour qu'on puisse y accéder à travers ce dernier.

- traefik.http.routers.jellyfin.rule=Host(`jellyfin.<votredomaine>.ovh`)

Créez un service (je le nomme jellyfin-svc).

- traefik.http.routers.jellyfin.service=jellyfin-svc

Indiquez à ce service qu'il doit utiliser le port 8096 de l'application.

- traefik.http.services.jellyfin-svc.loadbalancer.server.port=8096

Enfin, indiquez comme serveur de certification Let's Encrypt.

- traefik.http.routers.jellyfin.tls.certresolver=letsencrypt

À la base, la configuration standard de Jellyfin se présente ainsi.

version: "3.9"

networks:
  default:

services:

  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      PUID: ${PUID}
      PGID: ${PGID}
      TZ: ${TZ}
#      JELLYFIN_PublishedServerUrl: 192.168.0.5 #optional
    volumes:
      - ${APPDATA}/jellyfin:/config
      - ${APPDATA}/transcode:/ram_transcode
      - ${MEDIAS}/tvseries:/data/tvshows
      - ${MEDIAS}/movies:/data/movies
    ports:
      - 8096:8096
      - 8920:8920 #optional
      - 7359:7359/udp #optional
      - 1900:1900/udp #optional

À la fin, ça devrait ressembler à ça (regardez le guide pour plus de détails).

Note : si vous voulez seulement exposer votre application sur l'internet public, cochez la sections "ports" pour interdire l’accès en local.

version: "3.9"

networks:
  web:

services:

  jellyfin:
    image: lscr.io/linuxserver/jellyfin:latest
    container_name: jellyfin
    environment:
      PUID: ${PUID}
      PGID: ${PGID}
      TZ: ${TZ}
    volumes:
      - ${APPDATA}/jellyfin:/config
      - ${APPDATA}/transcode:/ram_transcode
      - ${MEDIA}/tvseries:/data/tvshows
      - ${MEDIA}/movies:/data/movies
    network:
      web:
    ports:
      - 8096:8096
      - 8920:8920 #optional
      - 7359:7359/udp #optional
      - 1900:1900/udp #optional
    labels:
      - traefik.enable=true
      - traefik.http.routers.jellyfin.entrypoints=websecure
      - traefik.http.routers.jellyfin.rule=Host(`jellyfin.<votredomaine>.ovh`)
      - traefik.http.routers.jellyfin.service=jellyfin-svc
      - traefik.http.services.jellyfin-svc.loadbalancer.server.port=8096
      - traefik.http.routers.jellyfin.tls.certresolver=letsencrypt

Recréez votre conteneur et démarrez-le.

docker compose create && docker start jellyfin

Tapez l'adresse de votre instance, vous devriez obtenir votre précieux certificat SSL.

Source :

Ultimate Traefik Docker Compose Guide [2022] with LetsEncrypt | SHB
This step-by-step Traefik Docker Compose tutorial will help take your Docker server to the next level with simplified SSL privacy and security.
Traefik 2 - Configuration du TLS (Rang A+ sur SSLLabs)
La sécurité est l’affaire de tous. En tant qu’architecte sécurité, je suis quelqu’un d’assez sensible à ces sujets.…
Traefik - A modern reverse proxy
J’aime l’informatique ! De fait, je commence à accumuler quelques appareils chez moi : un NAS Synology, un Intel NUC (qui fait office de serveur), parfois quelques Raspberry Pi… En plus de ça, j’adore bidouiller et tester des services que je peux self-hosted (via Docker le plus souvent). Jusqu’à mai…
Utiliser traefik comme reverse proxy
Besoin d’exposer facilement des sites et applications web sur Internet avec un certificat SSL valide ? C’est ici :)
Traefik CLI Flags Documentation - Traefik
Reference the CLI flags for static configuration in Traefik Proxy. Read the technical documentation.