Installer Plex avec Docker
Au sommaire :
- 1-Qu'est-ce que Plex ?
- 2-Prérequis
- 3-Déploiement
- 4-Configuration
- 5-Exposer son instance avec Traefik
1-Qu'est-ce que Plex ?
Plex est un serveur multimédia propriétaire qui va vous permettre d'organiser vos différents contenus (musiques, films, séries) à travers une interface web et de pouvoir y accéder à travers différents terminaux.
Plex propose également une offre nommé "Plex Pass" qui vous permet pour 119 euros (abonnement à vie) le transcodage matériel, séries et films gratuits (catalogue d'anciens contenus), l'IPTV et de multiples autres options.
C'est ce que j'utilisais juste avant de basculer vers Jellyfin.
Je l'utilise encore dans certains cas comme par exemple chez mes parents qui ont une Smart TV non Android et qui dispose de l'application Plex. Dans ce genre de cas, j'active mon instance Plex à distance (à travers un VPN en SSH via l'application de mon Iphone) et ça m'évite de devoir brancher un appareil pour regarder mes contenus.
Malgré la concurrence de Jellyfin, Plex reste quand même un choix pertinent si vous souhaitez disposer de votre propre serveur multimédia car il propose certaines options via le "Plex Pass" non disponibles sur Jellyfin. À vous de faire votre comparatif.
2-Prérequis
Pour déployer Plex, vous devez disposer d'une machine virtuelle fonctionnant sous Ubuntu Server.
Création de la machine virtuelle :
Virtualisation avec Proxmox VE : Si vous partez de zéro, suivez mon guide détaillé pour virtualiser Ubuntu sur Proxmox VE avec des réglages optimisés.
Automatisation avec Cloud-Init : Pour gagner du temps lors de la configuration, utilisez un template Cloud-Init. Cela permet d'automatiser et de simplifier l'initialisation de vos machines virtuelles. Retrouvez les instructions dans ce guide.
Installation des outils nécessaires :
Docker et Docker Compose : Une fois la machine virtuelle prête, installez Docker et Docker Compose, indispensables pour gérer et orchestrer vos conteneurs. Ce guide vous accompagnera dans l'installation.
Exposition de l'application :
Proxy inverse avec Traefik : Pour exposer vos applications sur Internet de manière sécurisée, configurez un proxy inverse. Traefik est une solution recommandée. Suivez ce guide pour l'installation.
3-Déploiement
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.
networks:
# Docker Bridge Network
default:
driver: bridge
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
network_mode: host
environment:
PUID: ${PUID}
PGID: ${PGID}
TZ: ${TZ}
VERSION=docker
PLEX_CLAIM= #optional
volumes:
- ${APPDATA}/plex:/config
- ${MEDIAS}/movies:/data/movies
- ${MEDIAS}/tvshows:/data/tvshows
- ${MEDIAS}/music:/data/music
restart: unless-stopped
Pour les options communes :
- version : version du fichier compose : https://docs.docker.com/compose/compose-file/compose-file-v3/
- network : en bridge (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)
- network_mode : host pour indiquer qu'on souhaite utiliser le réseau du serveur hôte (celui de votre machine virtuelle en l’occurrence)
- environment : il y a les variables de base (PUID, PGID, TZ) qui correspondent à l'utilisateur, le groupe et le fuseau horaire ainsi que deux variables spécifiques. VERSION indique à Plex que la mise à jour de l'application passera par Docker (pour éviter la mise à jour à l'intérieur du conteneur). Quant à PLEX_CLAIM, il sert à authentifier votre instance auprès de Plex (nous verrons ça plus bas)
- volumes : variable ${APPDATA) (/home/user_name/appdata) suivi du nom de l'application (/app_name) et enfin ${MEDIA} (/mnt/movies, /mnt/tvshows et /mnt/music) qui de préférence seront sur un partage NFS et contiendront donc vos films, séries et musiques
- restart : unless-stopped par défaut. Le daemon de Docker redémarrera automatiquement le conteneur sauf si vous l'arretez, il faudra le démarrer manuellement
Créez le dossier "media" puis les dossiers "tvseries" et "movies" à l'intérieur de ce dernier, sinon c'est le conteneur qui va le créer avec les accès root:root, ce qui va vous empêcher de transférer vos contenus si vous vous connecté avec un compte standard.
Téléchargez l'image et déployez le conteneur.
docker compose pull && docker compose create
Puis démarrez le conteneur.
docker start plex
4-Configuration
Avant de déployer le conteneur :
Allez sur le site https://www.plex.tv/ pour créer un compte utilisateur.
Ensuite, allez sur le site https://www.plex.tv/claim/ pour obtenir un token et ajoutez ce dernier à votre configuration docker-compose (attention!!! il ne dure que 4 minutes donc faites vite).
Indiquez l'adresse IP de votre serveur hôte suivi de :32400/web (ex : http://192.168.0.54:32400/web).
Cliquez sur "Connexion"
Cliquez sur "Je suis d'accord".
Cliquez sur "J'ai Compris".
Cliquez sur la croix si vous êtes pas intéressé par le "Plex Pass" pour le moment.
Ensuite dans "Nom", choisissez un nom pour votre instance Plex. Si vous souhaitez accéder à votre instance sans avoir à configurer une ouverture de port et votre reverse proxy, laissez coché l'option 'M'autoriser à accéder à mes médias en dehors de ma maison".
Dans "Médiathèque", cliquez sur "Ajouter Une Bibliothèque"
Dans cet exemple, je vais sélectionner mes dossiers "Movies" et "Music".
J'indique pour le scan de mes films qu'il soit effectué en français.
Cliquez sur "Parcourir Et Choisir Un Dossier Multimédia".
Ayant déjà créé les dossiers à l'avance avec les bons droits appliqués (via chmod et chown), Plex peut lire les dossier "movies" et "music" correctement et y accéder.
Cliquez sur l'onglet "Terminer" et sur l'icone "Terminé".
Une fois la configuration terminé, vous allez pouvoir accéder à vos contenus sur la gauche.
5-Exposer son instance avec Traefik
Plex propose d'accéder à votre instance via un serveur relais. L'avantage c'est qu'il y a aucun port à ouvrir sur votre box internet et pas de configuration à effectué du côté de votre reverse proxy.
Bémol, la bande passante est limitée à :
- 1 mbps/s si vous n'avez pas le Plex Pass
- 2 mbps/s si vous avez le Plex Pass
Donc si en plus vous faites appel au transcodage, c'est clairement pas intéressant mais pour ceux qui sont pas doués en informatique, c'est un plus non négligeable.
L'autre solution, c'est d'accéder directement à votre serveur via un nom de domaine et en configurant votre reverse proxy.
Pour exposer votre instance sur l'internet public, suivez mon guide sur le reverse proxy Traefik.
À la fin, vous devriez avoir la même configuration que moi.
networks:
# default network
default:
driver: bridge
# Traefik network
web:
name: web
driver: bridge
services:
traefik:
container_name: traefik
image: traefik:v2
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.<domain_name>.ovh`)
- traefik.http.routers.traefik-dash.service=api@internal
- "traefik.http.routers.traefik.middlewares=middlewares-basic-auth@file"
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
network_mode: host
environment:
PUID: ${PUID}
PGID: ${PGID}
TZ: ${TZ}
VERSION=docker
PLEX_CLAIM= #optional
volumes:
- ${APPDATA}/plex:/config
- ${MEDIAS}/movies:/data/movies
- ${MEDIAS}/tvshows:/data/tvshows
- ${MEDIAS}/music:/data/music
labels:
- traefik.enable=true
- traefik.http.routers.plex.entrypoints=websecure
- traefik.http.routers.plex.rule=Host(`plex.<domain_name>`)
- traefik.http.routers.plex.service=plex-svc
- traefik.http.services.plex-svc.loadbalancer.server.port=32400
- traefik.http.routers.plex.tls.certresolver=letsencrypt