Chocoblog

Chocoblog

Billets sur l'informatique, les logiciels libres et retours d'utilisation sont au programme avec la possibilité de publier des billets de copains.

PeerTube, plateforme de vidéo web décentralisée en P2P

Pour ceux qui veulent directement voir le projet :

https://lutim.cpy.re/9HOUfGK8

Motivations

Aujourd'hui, si on veut utiliser une alternative libre pour stocker ses fichiers, on peut utiliser Owncloud, Seafile, Cozy Cloud etc. Dans le cas où on aimerait partager des images, on peut se servir de Lutim. Si on souhaite rejoindre un réseau social, on peut s'inscrire sur Diaspora ou Mastodon. Et ainsi de suite.
Ces alternatives libres ou open-source nous permettent d'installer les logiciels sur nos propres machines. On a ainsi le contrôle sur nos données et on peut combattre l'effet "silo" des grandes entreprises américaines. Cette décentralisation est très importante pour empêcher la captation en masse des données des utilisateurs et permet de combattre activement la censure. Tristan Nitot en parle très bien sur son blog.

Dans le cas où l'on veut stocker et partager quelques vidéos, on peut utiliser MediaGoblin. En revanche, pour trouver un équivalent à YouTube, Vimeo ou Dailymotion afin de stocker une grande quantité de vidéos potentiellement à succès, ça devient un peu plus compliqué. En effet, on se confronte à deux problèmes principaux :

  • Stockage : on ne peut pas laisser la possibilité aux utilisateurs de stocker 1 000 000 de vidéos sur des plateformes comme MediaGoblin sans avoir besoin d'un énorme espace disque.
  • Bande passante : si une vidéo devient virale et est vue par 10 000 personnes en simultané, on a d'importants besoins en bande passante.

Ces deux problèmes peuvent se résoudre en augmentant la capacité et le nombre de serveurs qui hébergent ces vidéos. Autrement dit, il faut de l'argent. Ce n'est clairement pas viable lorsqu'on parle d'alternative libre. Une seule personne ou organisme ne peut encaisser tous les coûts de stockage et de bande passante de centaines d'utilisateurs.

Les alternatives libres aux grandes plateformes de vidéos ne peuvent donc pas exister ? Et bien si, mais il faut ruser et surtout collaborer.

Stockage

Une vidéo pèse lourd : plusieurs dizaines voire centaines de mégaoctets. En revanche, le poids des métadonnées de cette vidéo (nom, description, catégorie etc) est très faible.

Si deux serveurs communiquent entre eux, le serveur 1 peut dire au serveur 2 qu'il a une vidéo de chaton sans que le serveur 2 ne soit obligé de la stocker. Il devra simplement dire aux navigateurs web de ses utilisateurs que la vidéo se trouve sur le serveur 1.

En généralisant ce système avec 1000 serveurs ayant 100 vidéos sur chacun d'eux, on se retrouve avec un total de 100 000 vidéos réparties sur un ensemble de machines qui communiquent entre elles. Si un jour Framasoft décide d'ajouter un nœud, elle permet à ses utilisateurs d'accéder à 100 000 vidéos sans avoir besoin de les stocker. Chaque administrateur d'un serveur collabore et paye un petit peu de stockage pour créer un grand réseau de vidéos.

Bande passante

On a depuis 2002 un fabuleux protocole permettant de facilement transférer des fichiers à faible coût : BitTorrent. Avec ce protocole chaque utilisateur qui télécharge de la donnée l'envoie ensuite aux autres utilisateurs. C'est quelque chose de fantastique mais utilisable seulement via des applications lourdes sur des ports TCP ou UDP particuliers permettant la connexion directe (pair à pair ou P2P) avec d'autres clients. Il est donc incompatible avec les navigateurs web.

Mais avec l'arrivée de WebRTC, les navigateurs ont maintenant un moyen de se connecter entre eux en pair à pair. Feross Aboukhadijeh a complètement réimplémenté le protocole BitTorrent à l'aide de WebRTC pour en faire une simple librairie JavaScript : WebTorrent. On peut donc utiliser BitTorrent directement dans les navigateurs web supportant cette technologie.

Imaginez donc que lorsque vous regardez une vidéo dans votre navigateur, vous envoyiez vous-même cette vidéo à d'autres utilisateurs. Imaginez maintenant 1000 utilisateurs s'échangeant entre eux cette même vidéo qu'ils regardent tous en même temps. Le serveur n'aurait plus besoin d'envoyer une même vidéo à 1000 personnes différentes grâce à ce système. Ce ne serait pas magnifique ?

PeerTube

Architecture

PeerTube est né à partir de ces deux idées : décentralisation et P2P. Il s'agit d'un projet composé d'un serveur NodeJS (codé via TypeScript) en API REST et d'un client en TypeScript/Angular qui consomme cette API.

Plusieurs serveurs communiquant entre eux forment un "réseau (d'amis)". Chaque machine construit un index de toutes les vidéos du réseau dans lequel il est. En effet, lorsqu'un utilisateur uploade une vidéo sur un serveur, ce dernier envoie à tous les autres serveurs du réseau les informations de la vidéo uploadée (nom, auteur, lien magnet pour voir la vidéo en P2P...).

https://lutim.cpy.re/6Qut3ure.png

Si un utilisateur veut voir une vidéo, le serveur sur lequel il se trouve lui renvoie le lien magnet (lien BitTorrent identifiant un fichier) lui permettant de la regarder même si elle est située sur un autre serveur :

https://lutim.cpy.re/NvRAcv6U.png

Si plusieurs utilisateurs regardent la même vidéo, les données sont échangées en P2P. En effet, l'utilisateur télécharge la vidéo via WebTorrent qui récupère les données des autres pairs (autres utilisateurs qui regardent la vidéo) et du serveur. Le serveur seed la vidéo via WebSeed (c'est à dire via le protocole HTTP). Cela permet de toujours avoir possibilité de consulter une vidéo même si cette dernière n'est regardée par personne. Le serveur implémente un tracker afin que chaque pair du réseau sache chez qui il peut télécharger la donnée qui l'intéresse.

https://lutim.cpy.re/pqKm3Q5S.png

Un réseau se compose comme un groupe d'amis. Si un troisième serveur veut rentrer dans le réseau, il lui suffit de trouver un point d'entrée (le serveur 1 ou le serveur 2) qui va lui communiquer la liste de tous les autres serveurs (amis) du réseau. Et ainsi de suite.

https://lutim.cpy.re/wWVuczBz.png

De cette façon, on peut imaginer plusieurs réseaux de serveurs selon les besoins et envies de chacun :

https://lutim.cpy.re/AMo3uP0D.png

Si vous voulez avoir de plus amples informations, je vous recommande vivement d'aller voir le README du GitHub : https://github.com/Chocobozzz/PeerTube ainsi que le fichier expliquant l'architecture de manière plus détaillée : https://github.com/Chocobozzz/PeerTube/blob/master/ARCHITECTURE.md

Fonctionnalités

À l'heure ou j'écris ces lignes, il est possible :

  • Pour un serveur de rejoindre un réseau ("faire ami")
  • De quitter un réseau
  • D'uploader des vidéos qui seront envoyées aux serveurs amis
  • De supprimer une vidéo (ce qui sera répercuté chez les serveurs amis)
  • De lister et faire des recherches sur l'ensemble des vidéos d'un réseau
  • De regarder une vidéo en HTML5 via WebTorrent (donc en P2P) directement dans le navigateur web
  • D'avoir un réseau auto-suffisant, c'est à dire qu'il expulse au bout d'un certain moment les serveurs morts (qui ne répondent plus)
  • D'ajouter ou supprimer des utilisateurs
  • De s'inscrire en tant que nouvel utilisateur (si le serveur le permet)
  • De signaler une vidéo aux administrateurs (même si la vidéo est sur un autre serveur)
  • De blacklister une vidéo
  • De transcoder automatiquement une vidéo à l'upload dans un format optimisé pour le web (si le serveur le permet)
  • D'aimer/ne pas aimer une vidéo (si on est connecté)
  • De comptabiliser le nombre de vues/likes/dislikes d'une vidéo par rapport à l'ensemble du réseau
  • De partager la vidéo via une balise embed (iframe)

Il reste beaucoup de travail notamment pour ajouter les playlists, les abonnements, générer différentes définitions d'une même vidéo, améliorer la robustesse etc. Mais comme on dit : "la route est longue mais la voie est libre" :)

Tester ce n'est pas toujours douter :)

Vous pouvez avoir accès à plusieurs serveurs de démonstration :

Si vous êtes intéressés, n'hésitez pas à laisser un commentaire ou à contribuer directement sur GitHub.

PS : Je serai aux RMLL 2017 à Saint-Etienne, si jamais vous voulez discuter ou boire une bière n'hésitez pas ;)