Plex

Ubuntu 18.04 LTS – Installation de Plex avec Nginx, Docker et SSL/TLS

Plex est une solution centralisant l’ensemble de vos médias (films, séries, musiques, photos) et les diffusant sur n’importe quel appareil disposant d’une connexion internet.

Plex, basé sur XBMC, repose sur une architecture en deux parties. D’un côté, l’application serveur contient l’ensemble de vos médias, facilite leurs importations, et complète les données relatives à chaque élément, en effectuant une recherche et en intégrant les informations à partir de bases de données en ligne (TMDb, MoviePosterDB, etc.). L’application convertit vos médias à la volée dans un format compatible avec le lecteur.

De l’autre côté, l’application lecteur (votre navigateur, l’application mobile dédiée, votre SMART TV, etc.) vous permet de visualiser vos médias, modifier la qualité d’une vidéo en fonction de votre connexion internet, ou encore ajouter des sous-titres.

De plus, Plex s’intègre parfaitement avec les principaux services de cloud (Dropbox, Google Drive et Microsoft OneDrive) pour synchroniser vos médias.

Plex sera accessible depuis l’extérieur via Nginx utilisé comme reverse proxy et sera sécurisé grâce à un certificat SSL/TLS délivré par Let’s Encrypt.

1 – Prérequis

  • Vous devez disposer d’Ubuntu 18.04 LTS.
  • Votre utilisateur doit avoir accès à sudo.
  • Les paquets curl et software-properties-common doivent être installés sur votre système. Dans le doute, tapez la commande suivante :
    $ sudo apt-get install -y curl software-properties-common

Si vous ne possédez pas de serveur dédié ou de nom de domaine, je vous conseille les VPS de 1&1. Les serveurs sont rapides (basés en France), fiables et surtout très abordables. Les formules Cloud S ou Cloud M sont amplement suffisantes.

2 – Installation de Docker & Docker Compose

  • Ajoutez la clé GPG du dépôt officiel de Docker à votre système :
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    OK
  • Ajoutez Docker à vos dépôts APT :
    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • Mettez à jour la liste des fichiers disponibles dans vos dépôts APT :
    $ sudo apt-get update
  • Installez Docker CE :
    $ sudo apt-get install -y docker-ce
  • Vérifiez que Docker est correctement installé avec la commande sudo systemctl status docker :
    $ sudo systemctl status docker
    ● docker.service - Docker Application Container Engine
       Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
       Active: active (running) since *** ****-**-** **:**:**CEST; 42s ago
         Docs: https://docs.docker.com
     Main PID: 13232 (dockerd)
  • Téléchargez Docker Compose avec la commande suivante en modifiant la version si besoin avec la dernière release du repository officiel de Docker :
    $ sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  • Ajoutez les droits d’exécution sur le binaire de Docker Compose :
    $ sudo chmod +x /usr/local/bin/docker-compose
  • Vérifiez l’installation de Docker Compose avec la commande docker-compose -v :
    $ docker-compose -v
    docker-compose version 1.21.2, build a133471

3 – Droits Unix

Il est recommandé, pour des raisons de sécurité, de créer un utilisateur dédié à la gestion du volume Docker Plex et de ne pas le lancer sous votre super-utilisateur.

  • Créez un utilisateur plex :
    $ sudo adduser plex
  • Ajoutez-le au groupe docker :
    $ sudo adduser plex docker

4 – Création du volume Plex

  • Connectez-vous sous l’utilisateur plex et déplacez-vous dans le répertoire personnel de cet utilisateur :
    $ su plex
    $ cd
  • Créez le fichier /home/plex/docker-compose.yml et modifiez les lignes en surbrillance en fonction de votre configuration :
    plex:
      image: linuxserver/plex:latest
      container_name: plex
      restart: always
      net: host
      ports:
        - 32400:32400
      environment:
        - VERSION=latest
        - PUID=1001
        - PGID=1001
        - TZ=Europe/Paris
      volumes:
        - /home/plex/config:/config
        - /home/plex/movies:/data/movies
        - /home/plex/tvshows:/data/tvshows
    • PUID et GUID : ces deux variables représentent respectivement l’identifiant et le groupe de votre utilisateur plex. Ces valeurs peuvent être différentes d’un système à l’autre. Tapez la commande suivante pour obtenir le PUID (=uid) et GUID (=gid) de votre utilisateur plex :
      $ id plex
      uid=1001(plex) gid=1001(plex) groups=1001(plex),999(docker)
    • /home/plex/config:/config : chemin absolu des répertoires partagés entre votre système et le container docker. La première partie /home/plex/config (avant le séparateur « : ») représente le chemin où le fichier de configuration sera stocké sur votre système. La deuxième partie /config représente le chemin du fichier de configuration à l’intérieur du container docker. Cette dernière ne doit pas être modifiée.
    • /home/plex/[movies|tvshows|music|…]:/data/[movies|tvshows|music|…] : même principe mais pour l’emplacement de vos médias. Vous pouvez en ajouter autant que vous souhaitez.

    Il est important que l’utilisateur plex ait les droits de lecture et d’écriture dans les répertoires de votre système que vous spécifiez.

  • Démarrez le container plex :
    $ docker-compose up -d
  • Listez vos containers avec la commande $ docker ps -a :
    $ docker ps -a
    CONTAINER ID        IMAGE                        COMMAND             CREATED             STATUS              PORTS                    NAMES
    cea2005870b3        linuxserver/plex:latest      "/init"             42 seconds ago      Up 42 seconds                                plex
    

    Si vous êtes en local, vous pouvez désormais accéder à Plex via http://localhost:32400.

5 – Reverse proxy avec Nginx

Si vous souhaitez accéder à Plex de l’extérieur via une URL de type http://plex.mondomaine.com/ alors un reverse proxy est nécessaire. Le reverse proxy remplit le rôle de passerelle entre l’extérieur (Internet) et le réseau local de votre serveur.

N’oubliez pas de modifier les règles DNS dans l’interface administrateur du fournisseur de votre nom de domaine pour pointer vers l’IP de votre serveur.

Notre choix se portera sur le serveur HTTP Nginx pour une question de performances. Nginx est reconnu pour ses hautes performances, sa stabilité, son ensemble de fonctionnalités, sa configuration simple ainsi que sa faible consommation en ressources.

  • Repassez sous votre super-utilisateur :
    $ exit
  • Installez le paquet nginx :
    $ sudo apt-get -y install nginx
  • Modifiez les directives suivantes du fichier de configuration Nginx /etc/nginx/nginx.conf :
    user www-data;
    worker_processes 8;
    pid /run/nginx.pid;
    include /etc/nginx/modules-enabled/*.conf;
    
    events {
        worker_connections 768;
        # multi_accept on;                                                                                                                                                                                                                   
    }
    
    http {
    
        ##                                                                                                                                                                                                                                   
        # Basic Settings                                                                                                                                                                                                                     
        ##                                                                                                                                                                                                                                   
    
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;                                                                                                                                                                                                                 
    
        # server_names_hash_bucket_size 64;                                                                                                                                                                                                  
        # server_name_in_redirect off;                                                                                                                                                                                                       
    
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
    ...
    • worker_processes 8; : l’un des paramètres à ajuster immédiatement est le worker_processes. Pour profiter pleinement de la puissance de votre serveur, il est recommandé de mettre autant de worker_processes que de cœurs disponibles sur votre serveur. Pour connaître le nombre de cœurs sur votre serveur, il suffit de lancer la commande :
      $ grep processor /proc/cpuinfo | wc -l
      8
    • server_tokens off; : pour des raisons de sécurité, il est recommandé de désactiver l’envoi d’informations telles que le numéro de version de votre Nginx. Pour cela, décommentez cette directive dans le bloc http.
  • Créez le virtual host /etc/nginx/sites-available/plex et modifiez la ligne en surbrillance en fonction de votre configuration :
    upstream plex_backend {
        server               localhost:32400;
        keepalive            32;
    }
    
    map $http_upgrade $connection_upgrade {
        default              upgrade;
        ''                   close;
    }
    
    server {
        listen               80;
        server_name          plex.mondomaine.com;
    
        #Some players don't reopen a socket and playback stops totally instead of resuming after an extended pause (e.g. Chrome)
        send_timeout         100m;
    
        #Faster resolving, improves stapling time. Timeout and nameservers may need to be adjusted for your location Google's have been used here.
        resolver             8.8.4.4 8.8.8.8 valid=300s;
        resolver_timeout     10s;
    
        #Plex has A LOT of javascript, xml and html. This helps a lot, but if it causes playback issues with devices turn it off. (Haven't encountered any yet)
        gzip                 on;
        gzip_vary            on;
        gzip_min_length      1000;
        gzip_proxied         any;
        gzip_types           text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml;
        gzip_disable         "MSIE [1-6].";
    
        #Nginx default client_max_body_size is 1MB, which breaks Camera Upload feature from the phones.
        #Increasing the limit fixes the issue. Anyhow, if 4K videos are expected to be uploaded, the size might need to be increased even more
        client_max_body_size 100M;
    
        #Forward real ip and host to Plex
        proxy_set_header     Host $host;
        proxy_set_header     X-Real-IP $remote_addr;
        proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header     X-Forwarded-Proto $scheme;
        # Plex headers
        proxy_set_header     X-Plex-Client-Identifier $http_x_plex_client_identifier;
        proxy_set_header     X-Plex-Device $http_x_plex_device;
        proxy_set_header     X-Plex-Device-Name $http_x_plex_device_name;
        proxy_set_header     X-Plex-Platform $http_x_plex_platform;
        proxy_set_header     X-Plex-Platform-Version $http_x_plex_platform_version;
        proxy_set_header     X-Plex-Product $http_x_plex_product;
        proxy_set_header     X-Plex-Token $http_x_plex_token;
        proxy_set_header     X-Plex-Version $http_x_plex_version;
        proxy_set_header     X-Plex-Nocache $http_x_plex_nocache;
        proxy_set_header     X-Plex-Provides $http_x_plex_provides;
        proxy_set_header     X-Plex-Device-Vendor $http_x_plex_device_vendor;
        proxy_set_header     X-Plex-Model $http_x_plex_model;
    
        proxy_set_header     Host $server_addr;
        proxy_set_header     Referer $server_addr;
        proxy_set_header     Origin $server_addr;
    
        #Websockets
        proxy_http_version   1.1;
        proxy_set_header     Upgrade $http_upgrade;
        proxy_set_header     Connection "upgrade";
    
        #Buffering off send to the client as soon as the data is received from Plex.
        proxy_redirect       off;
        proxy_buffering      off;
    
        location / {
            proxy_pass       http://plex_backend;
        }
    }
  • Activez le virtual host :
    $ sudo ln -s /etc/nginx/sites-available/plex /etc/nginx/sites-enabled/plex
  • Rechargez la configuration Nginx :
    $ sudo systemctl reload nginx.service

    Plex est désormais accessible via http://plex.mondomaine.com.

6 – Sécuriser Plex avec SSL/TLS

Let’s Encrypt est une autorité de certification libre, automatisée et ouverte. Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. En mai 2018, Let’s Encrypt avait délivré plus de 70 millions de certificats.

6.1 – Installation

Installez les paquets software-properties-common et certbot :

$ sudo apt-get install -y software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install -y certbot

6.2 – Génération des certificats

Let’s Encrypt permet de générer de différentes façons plus ou moins automatisées un certificat. La méthode standalone permet de générer simplement un certificat. En revanche, celle-ci demande d’arrêter le serveur Nginx et ceci est valable à chaque renouvellement dudit certificat. Il existe aussi des plugins apache et nginx entièrement automatisés. Ces plugins mettent à jour automatiquement la configuration des virtual hosts mais le plugin nginx est encore expérimental. Dans cet article, nous recommandons d’utiliser le plugin webroot qui permet de générer et renouveler son certificat sans interrompre le serveur Nginx.

Le plugin webroot crée un fichier temporaire .well-known/acme-challenge dans un dossier spécifique accessible à Nginx, celui-ci permettra aux serveurs de Let’s Encrypt d’appeler ce fichier temporaire et ainsi de valider votre certificat.

  • Créez le répertoire destiné au fichier temporaire de Let’s Encrypt :
    $ sudo mkdir -p /var/www/letsencrypt
  • Créez le fichier /etc/nginx/snippets/letsencrypt avec les lignes suivantes pour rediriger Let’s Encrypt vers le dossier local précédemment créé :
    location ^~ /.well-known/acme-challenge/ {
        default_type "text/plain";
        root         /var/www/letsencrypt;
    }
    
  • Importez le fichier précédemment créé dans votre virtual host :
    upstream plex_backend {
        server               localhost:32400;
        keepalive            32;
    }
    
    map $http_upgrade $connection_upgrade {
        default              upgrade;
        ''                   close;
    }
    
    server {
        listen               80;
        server_name          plex.mondomaine.com;
    
        #Some players don't reopen a socket and playback stops totally instead of resuming after an extended pause (e.g. Chrome)
        send_timeout         100m;
    
        #Faster resolving, improves stapling time. Timeout and nameservers may need to be adjusted for your location Google's have been used here.
        resolver             8.8.4.4 8.8.8.8 valid=300s;
        resolver_timeout     10s;
    
        #Plex has A LOT of javascript, xml and html. This helps a lot, but if it causes playback issues with devices turn it off. (Haven't encountered any yet)
        gzip                 on;
        gzip_vary            on;
        gzip_min_length      1000;
        gzip_proxied         any;
        gzip_types           text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml;
        gzip_disable         "MSIE [1-6].";
    
        #Nginx default client_max_body_size is 1MB, which breaks Camera Upload feature from the phones.
        #Increasing the limit fixes the issue. Anyhow, if 4K videos are expected to be uploaded, the size might need to be increased even more
        client_max_body_size 100M;
    
        #Forward real ip and host to Plex
        proxy_set_header     Host $host;
        proxy_set_header     X-Real-IP $remote_addr;
        proxy_set_header     X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header     X-Forwarded-Proto $scheme;
        # Plex headers
        proxy_set_header     X-Plex-Client-Identifier $http_x_plex_client_identifier;
        proxy_set_header     X-Plex-Device $http_x_plex_device;
        proxy_set_header     X-Plex-Device-Name $http_x_plex_device_name;
        proxy_set_header     X-Plex-Platform $http_x_plex_platform;
        proxy_set_header     X-Plex-Platform-Version $http_x_plex_platform_version;
        proxy_set_header     X-Plex-Product $http_x_plex_product;
        proxy_set_header     X-Plex-Token $http_x_plex_token;
        proxy_set_header     X-Plex-Version $http_x_plex_version;
        proxy_set_header     X-Plex-Nocache $http_x_plex_nocache;
        proxy_set_header     X-Plex-Provides $http_x_plex_provides;
        proxy_set_header     X-Plex-Device-Vendor $http_x_plex_device_vendor;
        proxy_set_header     X-Plex-Model $http_x_plex_model;
    
        proxy_set_header     Host $server_addr;
        proxy_set_header     Referer $server_addr;
        proxy_set_header     Origin $server_addr;
    
        #Websockets
        proxy_http_version   1.1;
        proxy_set_header     Upgrade $http_upgrade;
        proxy_set_header     Connection "upgrade";
    
        #Buffering off send to the client as soon as the data is received from Plex.
        proxy_redirect       off;
        proxy_buffering      off;
    
        location / {
            proxy_pass       http://plex_backend;
        }
    
        include              /etc/nginx/snippets/letsencrypt;
    }
  • Recharchez votre configuration Nginx :
    $ sudo systemctl reload nginx.service
  • Générez votre certificat en remplaçant email@mondomaine.com et plex.mondomaine.com par vos informations personnelles :
    $ sudo certbot certonly --webroot -w /var/www/letsencrypt --agree-tos --no-eff-email --email email@mondomaine.com -d plex.mondomaine.com --rsa-key-size 4096
    Saving debug log to /var/log/letsencrypt/letsencrypt.log
    Obtaining a new certificate
    Performing the following challenges:
    http-01 challenge for plex.mondomaine.com
    Using the webroot path /var/www/letsencrypt for all unmatched domains.
    Waiting for verification...
    Cleaning up challenges
    
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/plex.mondomaine.com/fullchain.pem. Your cert
       will expire on 20XX-XX-XX. To obtain a new or tweaked version of
       this certificate in the future, simply run certbot again. To
       non-interactively renew *all* of your certificates, run "certbot
       renew"
     - If you like Certbot, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le
    

    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/plex.mondomaine.com :

    • cert.pem : le certificat de votre domaine plex.mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • SSL/TLS utilise un système de chiffrement asymétrique (comme RSA ou Diffie-Hellman) afin de sécuriser les échanges de vos flux. Par défaut, Nginx utilise une clé de 1048 bits. En augmentant la longueur de la clé à 4096 bits, vous augmenterez ainsi la sécurité de votre protocole SSL/TLS. Générez une nouvelle clé Diffie-Hellman (DH) de 4096 bits et attribuez-lui un minimum de permissions :
    $ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
    $ sudo chmod 600 /etc/ssl/certs/dhparam.pem

6.3 – Renouvellement automatique du certificat

Les certificats délivrés par Let’s Encrypt sont valides 90 jours. L’outil certbot fournit une option renew permettant de renouveler l’ensemble des certificats présents sur votre serveur si et seulement si ceux-ci expirent dans moins de 30 jours.

Nous allons créer une règle crontab où le script de renouvellement sera planifié pour exécution tous les lundis à 23h42. Les traces liées à l’exécution du script seront enregistrées dans un fichier /var/log/le-renew.log.

  • Éditez la crontab :
    sudo crontab -e
  • Ajoutez la ligne suivante :
    42 23 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
  • Sauvegardez et quittez.

6.4 – Vhost

  • Modifiez votre virtual host et les lignes en surbrillance en fonction de votre configuration :
    upstream plex_backend {
        server                    localhost:32400;
        keepalive                 32;
    }
    
    map $http_upgrade $connection_upgrade {
        default                   upgrade;
        ''                        close;
    }
    
    server {
        listen                    80;
        server_name               plex.mondomaine.com;
        return                    301 https://$server_name$request_uri;
    }
    
    server {
        listen                    443 ssl;
        server_name               plex.mondomaine.com;
    
        #Some players don't reopen a socket and playback stops totally instead of resuming after an extended pause (e.g. Chrome)
        send_timeout              100m;
    
        #Faster resolving, improves stapling time. Timeout and nameservers may need to be adjusted for your location Google's have been used here.
        resolver                  8.8.4.4 8.8.8.8 valid=300s;
        resolver_timeout          10s;
    
        ssl_certificate           /etc/letsencrypt/live/plex.mondomaine.com/fullchain.pem;
        ssl_certificate_key       /etc/letsencrypt/live/plex.mondomaine.com/privkey.pem;
        ssl_trusted_certificate   /etc/letsencrypt/live/plex.mondomaine.com/chain.pem;
    
        ssl_dhparam               /etc/ssl/certs/dhparam.pem;
    
        ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        #Intentionally not hardened for security for player support and encryption video streams has a lot of overhead with something like AES-256-GCM-SHA384.
        ssl_ciphers               'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:
    kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-EC
    DSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA
    :AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!
    EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    
        ssl_stapling              on;
        ssl_stapling_verify       on;
    
        #Plex has A LOT of javascript, xml and html. This helps a lot, but if it causes playback issues with devices turn it off. (Haven't encountered any yet)
        gzip                      on;
        gzip_vary                 on;
        gzip_min_length           1000;
        gzip_proxied              any;
        gzip_types                text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml;
        gzip_disable              "MSIE [1-6].";
    
        #Nginx default client_max_body_size is 1MB, which breaks Camera Upload feature from the phones.
        #Increasing the limit fixes the issue. Anyhow, if 4K videos are expected to be uploaded, the size might need to be increased even more
        client_max_body_size      100M;
    
        #Forward real ip and host to Plex
        proxy_set_header          Host $host;
        proxy_set_header          X-Real-IP $remote_addr;
        proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header          X-Forwarded-Proto $scheme;
        # Plex headers
        proxy_set_header          X-Plex-Client-Identifier $http_x_plex_client_identifier;
        proxy_set_header          X-Plex-Device $http_x_plex_device;
        proxy_set_header          X-Plex-Device-Name $http_x_plex_device_name;
        proxy_set_header          X-Plex-Platform $http_x_plex_platform;
        proxy_set_header          X-Plex-Platform-Version $http_x_plex_platform_version;
        proxy_set_header          X-Plex-Product $http_x_plex_product;
        proxy_set_header          X-Plex-Token $http_x_plex_token;
        proxy_set_header          X-Plex-Version $http_x_plex_version;
        proxy_set_header          X-Plex-Nocache $http_x_plex_nocache;
        proxy_set_header          X-Plex-Provides $http_x_plex_provides;
        proxy_set_header          X-Plex-Device-Vendor $http_x_plex_device_vendor;
        proxy_set_header          X-Plex-Model $http_x_plex_model;
    
        proxy_set_header          Host $server_addr;
        proxy_set_header          Referer $server_addr;
        proxy_set_header          Origin $server_addr;
    
        #Websockets
        proxy_http_version        1.1;
        proxy_set_header          Upgrade $http_upgrade;
        proxy_set_header          Connection "upgrade";
    
        #Buffering off send to the client as soon as the data is received from Plex.
        proxy_redirect            off;
        proxy_buffering           off;
    
        location / {
            proxy_pass            http://plex_backend;
        }
    
        include                   /etc/nginx/snippets/letsencrypt;
    }
  • Rechargez votre configuration Nginx :
    $ sudo systemctl reload nginx.service

    Plex est désormais accessible via https://plex.mondomaine.com.

7 – HTTP2

Je vous conseille vivement d’activer le nouveau protocole HTTP2 qui augmentera la sécurité et la rapidité de votre Plex.

HTTP2 permet notamment :

  • la compression des headers des requêtes et des réponses réduisant la bande passante lorsque les headers (comme les cookies) sont similaires.
  • le multiplexage des requêtes au serveur consistant à faire passer de multiples informations via un seul tuyau de transmission. Ainsi, on économise les multiples connexions entre le client et le serveur. Les requêtes, quant à elles, sont effectuées simultanément par le navigateur. Les requêtes ne se suivent donc plus les unes derrière les autres (HTTP1) et les plus prioritaires (CSS par exemple) ne sont plus bloquées par les moins prioritaires (images par exemple).
  • le push des ressources du serveur au navigateur. Désormais, le serveur pourra envoyer l’ensemble des ressources référencées dans une même page (CSS, JS…), avant même que le navigateur n’ait analysé celle-ci.

L’activation du protocole HTTP2 est très simple et consiste en l’ajout de la directive http2 dans votre virtual host (/etc/nginx/sites-available/plex) :

upstream plex_backend {
    server                    localhost:32400;
    keepalive                 32;
}

map $http_upgrade $connection_upgrade {
    default                   upgrade;
    ''                        close;
}

server {
    listen                    80;
    server_name               plex.mondomaine.com;
    return                    301 https://$server_name$request_uri;
}

server {
    listen                    443 ssl http2;
    server_name               plex.mondomaine.com;

    [...]

}

Une fois la modification effectuée, n’oubliez pas de recharger votre configuration Nginx :

$ sudo systemctl reload nginx.service

8 – Sous-titres

Plex dispose d’un plugin intégré OpenSubtitles.org qui a pour fonction de récupérer les sous-titres sur une unique source : le site du même nom. Ce plugin fonctionne plutôt mal, il récupère (quand il les trouve) la plupart du temps des sous-titres non adaptés et non synchronisés à votre média.

Sub-Zero est bien plus performant car il recherche les sous-titres à partir de 8 sources différentes et télécharge le sous-titre ayant le score le plus élevé et ainsi obtenir le sous-titre adéquat. Ce score est déterminé en fonction des éléments que compose le nom de votre media (Film.2018.720p.BluRay-TEAM).

    • Installez Unzip :
      $ sudo apt-get install -y unzip
    • Connectez-vous sous l’utilisateur plex et déplacez-vous dans le répertoire personnel de cet utilisateur :
      $ su plex
      $ cd
    • Arrêtez le container plex :
      $ docker-compose stop plex
    • Copiez le lien de l’archive zip (bundle) de la dernière release sur le GitHub de Sub-Zero : https://github.com/pannal/Sub-Zero.bundle/releases/latest
    • Placez-vous dans le répertoire de plugins de Plex :
      $ cd "config/Library/Application Support/Plex Media Server/Plug-ins"
    • Téléchargez Sub-Zero en replaçant le lien copié précédemment :
      $ wget https://github.com/pannal/Sub-Zero.bundle/releases/download/X.X.XX.XXXX/Sub-Zero.bundle-X.X.XX.XXX.zip
    • Décompressez l’archive :
      $ unzip Sub-Zero.bundle-X.X.XX.XXX.zip
    • Supprimez l’archive :
      $ sudo rm Sub-Zero.bundle-X.X.XX.XXX.zip
    • Démarrez Plex :
      $ docker-compose start plex
    • Activez et placez Sub-Zero par ordre de préférence dans Plex dans Settings → Server → Agents → Movies → Plex Movie (l’agent Local Media Assets étant les informations contenues localement dans un média) :


blank

  • Réiterez l’étape précédente dans :
    • Settings → Server → Agents → Movies → The Movie Database
    • Settings → Server → Agents → Shows → TheTVDB
    • Settings → Server → Agents → Shows → The Movie Database.

9 – Problèmes rencontrés

Si le serveur n’est pas trouvé et que vous obtenez le message « Recherche de serveurs… », il est nécessaire d’ajouter une première fois le serveur en local.

  • Réalisez un tunnel SSH en remplaçant user par votre utilisateur et IP_SERVER par l’IP de votre serveur dédié :
    $ ssh user@IP_SERVER -L 32400:localhost:32400
  • Rendez-vous dans votre navigateur à l’URL suivante http://localhost:32400/web et ajoutez le serveur via l’interface web de Plex.


Ubuntu 18.04 Server LTSDocker 18.06.0-ce
Docker Compose 1.21.2
Nginx 1.14.0
Plex 1.13.4.5251-2e6e8f841

2 réponses
  1. Junaito
    Junaito dit :

    Bonjour,

    Merci pour ce howto hyper complet.
    J’ai récemment décidé de mon serveur vers nginx et docker, et j’ai aisément réussi à faire tourner un serveur plex sans me casser la tête grace à celui-ci 🙂
    Je n’ai qu’un seul soucis, que je ne m’explique pas, à savoir que mon serveur est en accès limité depuis l’extérieur.
    Avez-vous rencontré ce problème de votre côté ?

    Bonne journée 🙂

    Répondre
  2. Deus
    Deus dit :

    Meilleur tuto que j’ai pu voir.

    Tout a marché, du premier coup (et je pensais pas) (sauf : ssl_ciphers ou j’ai tout mis sur une ligne sinon cela reprenait l’indentation de l’exemple et ça marchait pas.)

    ‘ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA’;

    Répondre

Laisser un commentaire

Participez-vous à la discussion?
N'hésitez pas à contribuer!

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *