Installer Traefik avec Docker
Guide d'installation de Traefik.
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.
Si vous voulez gagner du temps, utilisez un template cloud-init.
Enfin, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.
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.
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).
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.
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.
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.
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.
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 :