SeedBox et MediaCenter sur Raspberry

Bonjour/bonsoir
Objectif MediaCenter+Client Torrent (avec protection=VPN(IP d'un dédié) le tout sur une RPi 3.
Pourquoi? Car les seedbox aujourd'hui c'est 100Mbs et c'est ma connection donc pourquoi me faire chier a payer 10€ pour une seedbox alors que le VPS ou est installé mon VPN me couter moins de 2€.
On notera aussi que l'alimentation d'une Pi3 est de l'ordre de 5€ par an.
Merci aussi à @xavier pour le script pour openvpn/transmission et tout ces conseils, il y a encore quelques semaines je ne savais pas ce qu'était transmission 😃

Bref commençons !
J'ai installé Raspbian sur ma Pi3 et activé le SSH.

Préparation du disque dur qui va accueillir mes fichiers

Brancher le disque à la RPi et le formaté en EXT4
On repère le disque: sudo fdisk -l
Le disque est repéré (exemple: /dev/sda2)
On créé sont format: sudo mkfs.ext4 /dev/sda2
Ensuite on créé le répertoire de montage: sudo mkdir /media/DDUSB
On monte le disque: sudo mount -t auto /dev/sda2 /media/DDUSB
On va créer un montage automatique au démarrage de de la RPi: sudo nano /etc/fstab
Et rajouter la ligne:

/dev/sda2 /media/DDUSB auto noatime 0 0

Pour sauvegarder le fichier « Ctrl + O », et pour le quitter « Ctrl + X »
Et un coup de chmod sur le Disk: sudo chmod -R 777 /media/DDUSB
Bon coté disque c’est prêt

Installation de Transmission

On maj la Pi et on installe transmission: sudo apt-get update && sudo apt-get install transmission-daemon
On stop transmission pour que la configuration soit prise: sudo service transmission-daemon stop
On ouvre le fichier de configuration:sudo nano /etc/transmission-daemon/settings.json
Remplacer

"download-dir": "/media/DDUSB",
"rpc-password": "psswdeJeanLouis",
"rpc-username": "JeanLouis",
"rpc-whitelist-enabled": false,

On relance Transmission: sudo service transmission-daemon start
On va sur une page web avec l'adresse: ip_raspberry:9091/transmission/web/
Voilà transmission c’est bon🙂

Installation de PlexMediaServer

On maj la Pi: sudo apt-get update sudo apt-get upgrade
On installe le pack de transport HTTPS afin que nous puissions accéder aux paquetages HTTPS: sudo apt-get install apt-transport-https
Ensuite, nous devons ajouter une clé crypt2 pour le dépot dev2day: wget -O - https://dev2day.de/pms/dev2day-pms.gpg.key | sudo apt-key add -
On met à jour la liste des paquets: sudo apt-get update
Maintenant on installe le plex media serveur sur la Pi: sudo apt-get install -t jessie plexmediaserver
On change l’utilisateur par défaut de plex: sudo nano /etc/default/plexmediaserver
On change l’utilisateur par « pi » par défaut sur les RPi

PLEX_MEDIA_SERVER_USER=pi

On reboot la RPi: sudo reboot
Pour vous connecter dans le navigateur, entrez simplement l'adresse IP suivie du port 32400 et /web/
Par exemple: 192.168.0.21:32400/web/
Une page login/mdp s'affiche, connectez vous et commencez la configuration du server.
Voilà pour PlexMediaServer

Transmission et Plex sont installé sur la RPi et fonctionne parfaitement il faut maintenant protéger mon IP.

Installation d'OpenVPN et configuration

On MAJ et on install OpenVPN: sudo apt-get update && sudo apt-get install openvpn
Maintenant on va lui demander de se lancer automatiquement avec votre fichier client.
On dira que votre fichier client.ovpn est sur votre bureau.
Copier le fichier dans le bon dossier: sudo cp client.ovpn /etc/openvpn
Important qu’il soit dans ce répertoire sinon il ne se lancera pas au démarrage
On tester le fichier: cd /etc/openvpn && sudo openvpn client.ovpn
On regarde notre IP si c’est bien celle du VPN (Ouvrir un autre Terminal): wget -qO- ipv4.icanhazip.com
Renommer en .ovpn en .conf: sudo mv client.ovpn client.conf
Lancement automatique au boot (client étant le nom de mon fichier):sudo systemctl enable openvpn@client.service
On reboot: sudo reboot
Et on regarde notre si notre IP est bien celle du VPN: sudo wget -qO- ipv4.icanhazip.com

OpenVPN se lance bien au démarrage du Pi mais transmission aussi donc il faut le desactiver:

On désactive l'auto lancement du transmission:
sudo systemctl disable transmission-daemon.service
sudo update-rc.d -f transmission-daemon remove

Ensuite tu crées le fichier script.sh: sudo touch script.sh
On ouvre le fichier: nano script.sh
Et on colle le script ci dessous

#!/bin/sh
#while true cree une bloucle sans fin 
while true
do
    sleep 5
    #ping ip du vpn serveur, si pas de reponse arret de transmission + restart du vpn
    TRANS=$(pgrep transmission)
    ping -q -c2 10.8.0.1 > /dev/null
    if [ $? -ne 0 ] || [ -z  "$TRANS" ]
    then
        /etc/init.d/transmission-daemon stop
        /etc/init.d/openvpn restart
        sleep 20
        #si le ping revient alors restart de transmission
        ping -q -c1 10.8.0.1 > /dev/null && /etc/init.d/transmission-daemon start		
    fi
done

Ensuite il faut rendre exécutable le script: sudo chmod 777 script.sh
Et on regarde en tapant:sudo ls -al
Si le fichier est bien -rwxrwxrwx
Maintenant pour lancer le script au démarrage on ouvre le fichier rc.local: nano /etc/rc.local
entre fi et exit0 tu ajoute la ligne:
/home/pi/tondossier/script.sh &

Donc quand le VPN est OFF il coupe transmission et garde ça route au VPN, et relance transmission uniquement si il parvient a se connecter au VPN.

EDIT : Petite passe orthographique + mise en page (@xataz)

Bonjour,

Merci pour le tuto.

Que donne Plex sur le Raspberry? Tu arrives à streamer sans saccades? Du 720p? Du 1080p?
J'avais déjà pensé à cette solution mais je me demandais si le CPU allait bloquer.

Alors on est en Local donc pas de transcodage, je télécharge que du 1080p et aucun freez.
Quand je télécharge a fond et je regarde un film sur ma TV et Plex via navigateur le CPU (4 coeur) ne dépasse même pas les 20%.

J'ai même test un 2160p sur plex, le CPU bouge pas par contre utilisable uniquement sur navigateur a mon souvenir.
Par contre n'est pas passer sur AppleTV, ni SamsungTV avec les client plex

    Salut, wxcvbn sympas le tutoriel.

    Pourrais-tu essayer d'aérer le tutoriel pour faciliter la lecture.

      Un petit complément pour ton tuto, vu que tu vas utiliser ton disque dur externe en permanence,
      c'est de copier tout le system sur le hdd et de garder uniquement la partition de boot sur la carte SD.
      Avantage : durée de vie de la sd, extension du system directement à la taille du hdd, le cache de kodi...
      Un tuto est dispos à cette adresse :
      https://easydomoticz.com/preserver-la-carte-sd-episode-ii-booter-sur-usb/
      je crois qu'il y a 1 ou 2 oubli, à adapter.

      Pour répondre à Salimeche :
      Pour la HD, c'est uniquement suivant ta bande passante, le raspberry comme dit plus haut dépasse rarement les 20% en charge.

        arakneed Alors ça c'est parfait je chercher le moyen de le faire et j'allais investir dans un PiWD.
        Ou y'a un paquet a installé pour évité l'écriture et effacement en permanence sur la SD. (il le fait a uniquement au reboot)

        Comme je débute j'y ai pas encore vraiment songé mais je vais voir ça de plus prêt 🙂

          10 jours plus tard

          Bonjour et merci pour ce tuto très bien détaillé. J'ai malheureusement un soucis à la fin concernant la mise en place du script Transmission/VPN.
          Lorsque de je désactive le lancement auto de Transmission j'ai l'erreur suivante :

          Synchronizing state for transmission-daemon.service with sysvinit using update-rc.d...
          Executing /usr/sbin/update-rc.d transmission-daemon defaults
          Executing /usr/sbin/update-rc.d transmission-daemon disable
          insserv: warning: current start runlevel(s) (empty) of script transmission-daemon' overrides LSB defaults (2 3 4 5).
          insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script
          transmission-daemon' overrides LSB defaults (0 1 6).

          Du coup le script tourne en boucle au boot.
          Ai-je loupé une étape?
          Merci d'avance.

          Salut;
          Bonjour;

          Pour l'installation de la rpi, je privilégie la raspbian netinstall, qui pour un usage serveur n'installe que le minimum (ssh), et non tout le tra-la-la, le graphique, etc..
          https://github.com/debian-pi/raspbian-ua-netinst/releases/latest
          Explications et PWD ici:
          https://github.com/debian-pi/raspbian-ua-netinst
          Comme pour l'image classique, il suffit de l'écrire sur la SD, lancer la rpi, laisser faire 10 à 30 mn selon la connexion, chercher ensuite sur son réseau local avec nmap par exemple l'ip de la pi, s'y connecter, paramétrer "/etc/network/interfaces" pour une ip fixe....

          Ensuite, pour l'installation du rootfs (système sur DD de 2 To chez moi), j'avais fait un petit script (datant d'au moins 2 ou 3 ans) qui permettait de configurer le cmdline.txt en boot par uuid avec l'avantage par rapport au boot via "sda, sdb,...), de ne pas être dépendant de l'ordre d'insertion des périphériques usb si plusieurs de connectés.

          Le script à lancer en root, qui va vous demander de préciser le disque dur détecté sur lequel installer le rootfs, et la taille à réserver pour cette partition (4 à 6 Go suffisent pour une raspbian netinstall; 8 à 10 max pour une raspbian classique), le reste du DD servant pour "/home"; naturellement le DD doit être vierge car comme formatage en ext4, toutes les données seront perdues:

          #!/bin/bash
          clear
          LC_ALL=fr_FR.UTF-8 &
          if [ $(id -u) -ne 0 ];then echo "Ce script doit être execute sous root ou lancé avec sudo";sleep 5;exit;fi
          de=$(lsblk | grep sd.*disk |awk '{print $1}')
          if [ "$de" = "" ];then echo "Aucun disque usb de détecté !!, rebranchez en un et relancer le script.";sleep 5;exit;fi
          while true;do
          echo "Disque(s) usb externes(s) présent(s): "$de
          read -p "Sur quel disque effectuer l'installation ? " sd
          if grep -q "$sd" <<<"$de";then if [ -e "/dev/$sd" ];then break;fi;fi
          done
          while [ "$rep" = "" ];do
          read -p "Choisir une taille entre 4 et 10 Go pour le système (nombre entier, pas de décimales ni d'unités) :" rep
          if ! [ "$rep" -ge 4 -a "$rep" -le 10 ];then rep="";fi
          done
          if [ $( mount | grep "/dev/mmcblk0p2" | wc -l )  == 1 ] ; then
          until [[ ${rep2} =~ ^[o,n,O,N]+$ ]];do
          clear
          echo "Votre installation va se faire sur $sd ..attention toutes les donnees de $sd seront supprimees..."
          echo "Voulez vous vraiment continuer ??? o/n O/N ..."
          read rep2
          done
          if [ "$rep2" == "o" ] || [ "$rep2" == "O" ]
          then
          rep=$(echo "$((rep * 2097152))");rep1=$((rep+1))
          apt-get update --fix-missing;apt-get upgrade -y;apt-get autoremove -y;apt-get autoclean -y;apt-get clean -y
          if ! [ -f /etc/locale.gen.old ];then cp /etc/locale.gen /etc/locale.gen.old;fi
          echo 'fr_FR ISO-8859-1
          fr_FR.UTF-8 UTF-8
          fr_FR@euro ISO-8859-15'>/etc/locale.gen
          locale-gen
          echo 'LANG=fr_FR.UTF-8
          LANGUAGE=fr_FR:fr' >/etc/default/locale
          echo 'LANG=fr_FR.utf8
          LANGUAGE=FR
          LC_CTYPE="fr_FR.utf8"
          LC_NUMERIC="fr_FR.utf8"
          LC_TIME="fr_FR.utf8"
          LC_COLLATE="fr_FR.utf8"
          LC_MONETARY="fr_FR.utf8"
          LC_MESSAGES="fr_FR.utf8"
          LC_PAPER="fr_FR.utf8"
          LC_NAME="fr_FR.utf8"
          LC_ADDRESS="fr_FR.utf8"
          LC_TELEPHONE="fr_FR.utf8"
          LC_MEASUREMENT="fr_FR.utf8"
          LC_IDENTIFICATION="fr_FR.utf8"
          LC_ALL=' >/etc/environment
          echo 'Europe/Paris'>/etc/timezone
          dpkg-reconfigure -f noninteractive tzdata
          if ! which gdisk >/dev/null;then apt-get install -y gdisk;fi
          if ! which parted >/dev/null;then apt-get install -y parted;fi
          if ! which rsync >/dev/null;then apt-get install -y rsync;fi
          parted -s /dev/${sd} mklabel gpt
          parted -s -a none /dev/${sd} mkpart primary 0 ${rep}s
          parted -s -a none /dev/${sd} mkpart primary ${rep1}s 100%
          clear
          echo "Formatage en ext4 des partitions..Patientez...peut etre assez long...voir tres long..selon la capacite du disque... et votre version de rpi";sleep 5
          mkfs.ext4 /dev/${sd}1 >/dev/null
          mkfs.ext4 /dev/${sd}2 >/dev/null
          echo "Formatage en ext4 termine..."
          PARTUUID=$(blkid -o export /dev/${sd}1 | grep PARTUUID)
          UUID1=$(blkid -o export /dev/${sd}1 | grep ^UUID)
          UUID2=$(blkid -o export /dev/${sd}2 | grep ^UUID)
          mkdir -p /mnt/mm1;mkdir -p /mnt/mm2;mkdir -p /mnt/sd1;mkdir -p /mnt/sd2
          mount /dev/mmcblk0p1 /mnt/mm1;mount /dev/mmcblk0p2 /mnt/mm2;mount /dev/${sd}1 /mnt/sd1;mount /dev/${sd}2 /mnt/sd2
          if [ $( mount | grep "/mnt/mm1" | wc -l )  == 1 ] ; then test=1; fi
          if [ $( mount | grep "/mnt/mm2" | wc -l )  == 1 ] ; then test=$((test+1)); fi
          if [ $( mount | grep "/mnt/sd1" | wc -l )  == 1 ] ; then test=$((test+1)); fi
          if [ $( mount | grep "/mnt/sd2" | wc -l )  == 1 ] ; then test=$((test+1)); fi
          if [ "$test" == "4" ]
          then
          clear
          echo "Copie de la partition systeme ROOTFS..soyez  patients..";sleep 5
          rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/home/*"} /* /mnt/sd1
          cp -f /mnt/sd1/etc/fstab /mnt/sd1/etc/fstab.sd;sed -i -e 's/.*mmcblk0p2.*$/#&/g' /mnt/sd1/etc/fstab
          echo $UUID1"		/			ext4        defaults           0    1" >>/mnt/sd1/etc/fstab
          echo $UUID2"		/home		ext4        defaults           0    2" >>/mnt/sd1/etc/fstab
          cp -f /mnt/sd1/etc/fstab /mnt/sd1/etc/fstab.hd
          if [ "$(ls -A /home)" ];then cp -Rfp /home/* /mnt/sd2;fi
          cp -f /mnt/mm1/cmdline.txt /mnt/mm1/cmdline.sd
          if [ -f /mnt/mm1/initrd.img* ];then sed -i "s/\/dev\/mmcblk0p2/$UUID1/g;" /mnt/mm1/cmdline.txt;else sed -i "s/\/dev\/mmcblk0p2/$PARTUUID/g;" /mnt/mm1/cmdline.txt;fi
          cp -f /mnt/mm1/cmdline.txt /mnt/mm1/cmdline.hd
          tune2fs -m 0 /dev/${sd}2
          echo 'nameserver 208.67.222.222
          nameserver 208.67.220.220
          nameserver 8.8.8.8'>/mnt/sd1/etc/resolv.conf;chattr +i /mnt/sd1/etc/resolv.conf
          echo ': ${LANG:=fr_FR.UTF-8}; export LANG
          : ${LANGUAGE:=fr_FR:fr}; export LANGUAGE'>>/mnt/sd1/etc/profile
          echo ': ${LANG:=fr_FR.UTF-8}; export LANG
          : ${LANGUAGE:=fr_FR:fr}; export LANGUAGE'>>/mnt/sd1/etc/bash.bashrc
          if ! [ -f /mnt/sd1/var/swap ];then fallocate -l 1024m /mnt/sd1/var/swap;chmod 600 /mnt/sd1/var/swap;mkswap /mnt/sd1/var/swap;echo "vm.swappiness=20" >>/mnt/sd1/etc/sysctl.conf; echo "/var/swap	none	swap	sw	0	0" >>/mnt/sd1/etc/fstab;fi
          cat <<'EOF' >/mnt/sd1/usr/local/bin/bootsd.sh
          #!/bin/bash
          if [ $(id -u) -ne 0 ];then echo "Ce script doit être execute sous root ou lance avec sudo";sleep 5;exit;fi
          mount /dev/mmcblk0p1 /mnt
          cat /mnt/cmdline.sd >/mnt/cmdline.txt
          umount /mnt
          echo "Redemarrage...";sleep 5
          reboot
          EOF
          cat <<'EOF' >/mnt/mm2/usr/local/bin/boothd.sh
          #!/bin/bash
          if [ $(id -u) -ne 0 ];then echo "Ce script doit être execute sous root ou lance avec sudo";sleep 5;exit;fi
          mount /dev/mmcblk0p1 /mnt
          cat /mnt/cmdline.hd >/mnt/cmdline.txt
          umount /mnt
          echo "Redemarrage...";sleep 5
          reboot
          EOF
          chmod +x /mnt/mm2/usr/local/bin/boothd.sh;chmod +x /mnt/sd1/usr/local/bin/bootsd.sh;rm -f /mnt/sd1/usr/local/bin/installpi.sh
          umount -l /mnt/mm1;umount -l /mnt/mm2;umount -l /mnt/sd1;umount -l /mnt/sd2
          find /mnt/* -type d -empty -delete
          echo "Installation terminee....reboot de la machine...";sleep 5;reboot
          fi;fi
          else
          echo "Cette installation ne peut se faire qu'a partir de la carte SD ...";sleep 5
          fi
          exit
          

          Laisser faire, une fois fini, la rpi reboot en utilisant le rootfs du DD.
          Si vous désirez revenir au rootfs sur la sd, saisir:

          bootsd.sh

          dans la console
          Pour revenir au roofs sur le DD à partir de la sd:

          boothd.sh

          Si, ça peut servir...

          Salut
          @Iocca
          c'est juste un warning (avertissement)

          et pour le script c’est normale qui tourne en boucle car il surveille la connections du vpn.

          Hello,

          Pourrais-tu détailler cette partie:

          #ping ip du vpn serveur, si pas de reponse arret de transmission + restart du vpn
          TRANS=$(pgrep transmission)
          ping -q -c2 10.8.0.1 > /dev/null
          if [ $? -ne 0 ] || [ -z "$TRANS" ]

          A quoi correspond cette IP 10.8.0.1? Où la récupère t-on?
          Je comprends que TRANS récupère la valeur du process de transmission mais je ne pige pas la dernière ligne.

          merci!!

            Salut tomavip
            L'IP est celle du serveur VPN, en effet OpenVPN crée un sous-réseau virtuel en 10.8.0.x (par défaut) dans lequel ses clients sont assignés.

            tomavip
            Salut;
            Un petit screen devrait suffire:

            Moi je ping sur l'adresse attribuée par le serveur et non celle du serveur, mais ça ne change rien...
            Sinon le client torrent je le bind sur l'ip attribuée par le serveur vpn:

            "bind-address-ipv4": "10.8.0.3",

            Plus de vpn -> plus de connexion automatiquement du client torrent/ à un bind sur "0.0.0.0"....hadopi..

            Par contre nécessite de faire lancer un script au lancement du vpn; et je n'utilise le vpn que pour le client torrent pas pour le reste.
            Dans le fichier conf d'openvpn:

            #redirect-gateway def1 #Je commente cette ligne pour ne pas utiliser le vpn pour tout
            route-nopull #pour ne pas utiliser le vpn pour toutes les applications
            script-security 2
            up up.sh 
            down down.sh

            dans le fichier client du vpn
            Puis up.sh (a adapter en fonction du résultat d'ifconfig : du screen + haut)

            #!/bin/bash
            if [[ $5 == 255* ]];then set $1 $2 $3 $4 $4 $6;fi
            ip rule add from "$4" table VPN
            ip route add table VPN default via "$5"
            ip route add table VPN "$5" via "$4" dev "$1"
            systemctl restart transmission-daemon.service
            /etc/openvpn/checkopenvpn & #lancement du test avec ping du type "script.sh" du tuto de @wxcvbn
            

            *$4 = ip inet transmise par le vpn sur le screen
            $5 = ip destination ...........................
            $1 = tunx interface réseau du vpn (souvent tun0)
            Comme dans le screen + haut $4 = $5; mais ce n'est pas toujours le cas, celà dépend de la config du serveur, seul ifconfig peut le dire...mais cette ligne "if [[ $5 == 255 ]];then set $1 $2 $3 $4 $4 $6;fi" remet tout en ordre....

            Le down.sh:

            #!/bin/bash
            killall checkopenvpn
            ip rule delete from "$4" table VPN
            ip route flush table VPN
            exit
            

            Création table VPN:

            echo '1 VPN' >>/etc/iproute2/rt_tables

            Tâche cron:

            0-59 * * * *  if ! ( /bin/pidof openvpn > /dev/null );then /bin/systemctl start openvpn.service;fi

            Merci à tous les 2! Je regarde tout ça en détail asap !

            un mois plus tard

            Bonjour,

            J'ai bien suivi le tuto et tout fonctionne très bien. Excepter, pour la partie de Openvpn.
            Quand je fais un ifconfig, ds la partie tun0.
            Je n'est pas une adresse IP, OpenVPN crée en sous-réseau virtuel de type 10.8.0.x
            À la place, c'est l'adresse ip du serveur vpn que je me connect.

            Donc, le script ne fonctionne pas pour moi.
            Je dois changer l'adresse ip ds le script à toute les fois que je change de serveur (région ds le monde).

            Je me demande si j'ai loupé quelque chose ou si vous avez des suggestions.
            Merci.

            un an plus tard

            Bonjour , je suis complet noob et me sens pas à l aise avec le code ... Existe t il une image qui permette d avoir kodi et une seedbox et juste ça ? ( un peu comme recalbox a kodi et une partie émulateur ) .
            Comme ca rien à installer 🙂 #verynoob

            Merci d avance

            Répondre…