Comment creer un serveur plex media server avec un stockage infini (amazon)
Ce tutoriel décrit les étapes nécessaires pour créer un server distant (ou local) Plex, accompagné d'un stockage Amazon cloud storage illimité (jusqu’à 100to en réalité) tout en chiffrant l'intégralité des fichiers.
Pré-requis
- Disposer des droits d'administration.
- Disposer d'une connexion à Internet configurée et activée.
- un serveur/vps disposant de FUSE (j'utilise hetnzer online et ovh kimsufi), attention a OpenVZ pour les vps, vérifié bien la disponibilité de fuse.
- un accès SSH
- un compte amazon cloud storage
La Préparation
Tout d'abord, il vous faudra installer Plex, rendez vous sur la page de téléchargement, copié le lien pour Ubuntu et wget. Dans mon exemple, c'est la version 1.3.3 de plex.
Plex
cd ~ wget https://downloads.plex.tv/plex-media-server/1.3.3.3148-b38628e/plexmediaserver_1.3.3.3148-b38628e_amd64.deb sudo dpkg -i plexmediaserver_1.*
Pour plus de simplicité, c'est l'utilisateur plex qui sera utilisé, ça simplifie la gestion des droits.
sudo su passwd plex adduser plex sudo
Additionnellement, vous pouvez désactiver l'accès SSH de Plex.
nano /etc/ssh/sshd_config
et en ajoutant a la fin :
DenyUsers plex
et on redémarre ssh :
service ssh restart
Les dossiers
Une fois reconnecté avec l'utilisateur plex (su plex), on va créer les dossiers nécessaires, une documentation détaille est disponible ici.
su plex sudo mkdir /home/plex/ sudo chown plex /home/plex/ mkdir /home/plex/.local-sorted/ mkdir /home/plex/local-sorted/ mkdir /home/plex/.acd-sorted/ mkdir /home/plex/acd-sorted/ mkdir /home/plex/sorted/ mkdir /home/plex/logs/
Les paquets
ensuite on install l'ensemble des paquets necessaires :
sudo apt-get install encfs unionfs-fuse python-fuse python3-setuptools python3-appdirs python3-dateutil python3-requests python3-sqlalchemy git sudo easy_install3 -U pip
Acd_cli
Une fois tout ceci terminé, on réalise l'installation d'ACD_CLI qui est une interface en ligne de commande qui permet de monter des disques cloud comme des dossiers locaux.
sudo pip3 install git+https://github.com/yadayada/acd_cli.git
On vérifie ensuite qui tout fonctionne bien :
acd_cli sync
Cette etape va vous demander d'avoir un fichier oauth_data qui permet a acd_cli de s'identifier avec amazon.
La premiere etape s'arrète au moment ou il faut ce connecter sur https://tensile-runway-92512.appspot.com/, faite le avec votre navigateur local, téléchargez le oauth_data, ouvrez le avec un lecteur local. Copiez les données et connectez vous sur un second terminal ssh et créé avec nano :
nano /var/lib/plexmediaserver/.cache/acd_cli/oauth_data
collez les données du fichier précédemment téléchargé, enregistrez et retourné a votre précédent ssh. Continuez de suivre les instructions d'acd_cli.
Une fois terminé, on peut s'attaquer au vif du sujet : le montage des dossiers, le cryptage et la synchronisation.
Le vif du sujet
Le principe est simple :
- /local-sorted, qui est le fichier local non crypté ou vous déposerez vos médias.
- sa version crypté avec encfs /.local-sorted qui est le dossier qui sera upload sur amazon
- /.acd-sorted qui est le point de montage du dossier cloud, qui est monté crypté.
- /acd-sorted qui est le dossier distant décrypté.
- /sorted, le dossier qui via unionfs, permet de "fusionner" local-sorted et acd-sorted, ce sera le dossier utilisé par Plex.
Nous allons maintenant générer la clé de cryptage avec encfs, il est *impératif* qu'une fois ces étapes terminées, que vous conserviez une sauvegarde de la clé de cryptage.
Pour monter encfs, on lance simplement
encfs /home/plex/.local-sorted /home/plex/local-sorted
Encfs va vous demander les réglages de cryptages, ceux par défauts sont correctes et une mot de passe, qu'il faudra lui aussi conserver précieusement.
Une fois terminé, tout fichier placé dans */local-sorted*, apparaîtra crypté dans */.local-sorted*.
Nous allons ensuite déplacer la clé de cryptage :
fusermount -u /home/plex/local-sorted mv /home/plex/.local-sorted/.encfs6.xml /home/plex/encfs.xml
Dorénavant, pour monter un système de fichier encfs, il sera nécessaire de stipuler la présence d'un fichier de configuration.
ENCFS6_CONFIG='/home/plex/encfs.xml' encfs /home/plex/.local-sorted /home/plex/local-sorted
Testons si ça fonctionne :
ls /home/plex/.local-sorted/ # Normalement vide touch /home/plex/local-sorted/test ls /home/plex/.local-sorted/ # A fichier avec un nom sans aucun sens devrait apparaître.
Le montage d'Amazon Cloud Drive
acd_cli mount /home/plex/.acd-sorted/
/home/plex/.acd-sorted/ affiche désormais les fichiers du dossier / d'amazon cloud drive de manière crypté.
On monte désormais avec EncFS :
ENCFS6_CONFIG='/home/plex/encfs.xml' encfs /home/plex/.acd-sorted /home/plex/acd-sorted
Les fichiers sur amazon cloud storage apparaissent de manière decrypté dans le dossier /acd-sorted
Upload
Pour Upload, il y a deux manière, la manière la plus simple étant d'utilisé acd_cli upload suivit d'un acd_cli sync ou rclone et un crypte python pour remonter automatiquement le point de montage.
acd_cli upload
acd_cli upload /home/plex/.local-sorted/* / acd_cli sync
cela fonctionne mais pour le moment je trouve acd_cli upload inconsistant (avec pas mal d'erreurs) et acd_cli instable ( crash du point de montage fréquent)
Rclone
C'est la solution que j'utilise. le principe est le suivant :
un script bash que j'execute dans un screen avec la commande suivant :
rclone move -v /home/plex/.local-sorted acd:/
le script :
nano /home/plex/.loopreclone.sh
on y colle le code suivant :
#!/bin/bash for i in {1..10} do rclone move -v /home/plex/.local-sorted acd:/ mail -s "Upload $i $(date) " //votre email// <<< 'Update !' done
ensuite on rend le scripte exécutable :
chdmod +x /home/plex/.looprclone.sh
On l’exécute ensuite dans un screen, l'upload va ce réaliser 10 fois en envoyant un email a chaque fin de boucle (pour avoir une idée de la progression), c'est très pratique pour un upload tres volumineux dans un dossier qui ce renouvelle régulièrement quand on télécharge ses médias perso.
Pour rafraîchir la liste des fichiers il faut executer :
acd_cli sync
mais cela a tendant a faire crasher le point de montage, une solution plus stable et automatique est disponible dans la dernière partie du tuto.
UnionFS-FUSE
on execute simplement :
unionfs-fuse -o cow /home/plex/local-sorted=RW:/home/plex/acd-sorted=RO /home/plex/sorted/
Cela fusionne les deux dossiers non crypté en 1 seul dossier /sorted. qu'on utilisera pour plex. Cela a pour avantage de permettre a plex d'ajouter un fichier rapidement lorsqu'il est ajouté sur le server dans /local-sorted et lorsque celui si est upload sur amazon, décrypté et remonté localement dans */acd-sorted, de ne pas y voir de différence puisqu'il sera monté de manière identique dans /sorted.
Conclusion
Voila, vous avez l'essentiel pour réaliser votre propre Plex infini. C'est évidemment a utiliser avec des médias dont vous avez légalement acquis la propriété ou vos films perso.
Je vous invite a terminer le tuto par la lecture des problèmes connus, il y en a quelque un, notamment celui causé par acd_cli sync, qui fait planté le point de montage et qui devient inaccessible.
Problèmes connus et leurs solutions
Crash du montage apres une syncro
Le principale défaut est comme expliqué plus haut, acd_cli sync, qui a tendance a faire planté le point de montage, ce qui empêche de simplement placer un acd_cli dans un crontab.
On va donc utiliser deux scripts. le premier, très simple, va executer un acd_cli sync suivit immédiatement par un script python qui va verifié si le montage a planté et le remonté le cas échéant.
nano /home/plex/sync.sh
on y colle :
#!/bin/bash /usr/local/bin/acd_cli -d sync python3 /home/plex/.automount.py
et on le rend executable par un chmod +x.
on crée ensuite le .automount.py avec le code suivant, j'ai modifié le script mais la source est ici:
import os import subprocess import logging logging.basicConfig(filename='acdmount.log', level=logging.INFO, format='%(asctime)s %(levelname)s %(message)$ logging.info('ACD mount checker started') DEVNULL = open(os.devnull, 'wb') #pb = Pushbullet('pushbullet-api-key-here') #logging.info("running ACD sync") #subprocess.call(["/usr/local/bin/acd_cli", "sync"], stdin=None, stdout=DEVNULL) exists = os.path.exists("/home/plex/.acd-sorted/") if exists is not True: logging.warning("ACD mount is down") # push = pb.push_note("ACD mount down", "attempting restart") # logging.info("attempting umount") # subprocess.call(["/usr/local/bin/acd_cli", "umount"], stdin=None, stdout=DEVNULL) logging.info("attempting umount fuser") subprocess.call(["/bin/fusermount", "-uz", "/home/plex/.acd-sorted"], stdin=None, stdout=DEVNULL) # logging.info("running ACD sync") # subprocess.call(["acd_cli", "sync"], stdin=None, stdout=DEVNULL) logging.info("attempting ACD mount") subprocess.call(["/usr/local/bin/acd_cli", "mount", "/home/plex/.acd-sorted/"], stdin=None, stdout=DEVNUL$ # print ("ACDmount done") # if os.path.exists("/home/plex/.acd-sorted/"): # push = pb.push_note("ACD mount back up", "restart successful") # logging.info("ACD mount restart succeeded") #else: # print 'all good'
On va ensuite exécuter ce scripte tout les 6 minutes via cron, un délais entre chaque sync est au minimum de 5 minutes.
Remontage apres un reboot
on va créer un script qui permet de remonter tout ceci via cron apres un reboot.
On crée d'abord un fichier .encfspass qui ne contiendra que le mot de pass de encfs.
nano /home/plex/.encfspass
ensuite un script .mount.sh contenant le code suivant qu'on rendre exécutable via chmod +x
!/bin/sh /bin/fusermount -uz /home/plex/acd-sorted /bin/fusermount -uz /home/plex/.acd-sorted /bin/fusermount -uz /home/plex/local-sorted /bin/fusermount -uz /home/plex/.local-sorted /bin/fusermount -uz /home/plex/sorted acd_cli sync acd_cli mount -ro /home/plex/.acd-sorted ENCFS6_CONFIG='/home/plex/encfs.xml' encfs --extpass="cat /home/plex/.encfspass" /home/plex/.acd-sorted /home/plex/acd-sorted ENCFS6_CONFIG='/home/plex/encfs.xml' encfs --extpass="cat /home/plex/.encfspass" /home/plex/.local-sorted /home/plex/local-sorted unionfs-fuse -o cow /home/plex/local-sorted=RW:/home/plex/acd-sorted=RO /home/plex/sorted/ exit
et on ajoute a cron :
@reboot /home/plex/.mount.sh > /home/plex/logs/mount.log 2>&1
Voir aussi
les sources :
Automated Media centre makeshitf.ninja https://github.com/yadayada/acd_cli
Contributeurs principaux : Ethanfel.