summary: "J'ai passé une bonne heure à chercher comment faire sans trouver de documentation clé en main. Du coup, j'ai fait un petit billet pour vous livrer les quelques commandes magiques 🎉."
intro: Récemment, j'ai du transmettre à une personne une archive d'une centaine de Go, dont le téléchargement derrière un `nginx` finissait toujours par échouer. J'ai alors décidé de créer un torrent et de le partager depuis mon serveur, et j'ai été étonné du peu de documentation clé en main sur le sujet. Voilà ma petite contribution ; je suis preneur·se si vous trouvez quelque chose d'autre 😉.
imgExplanation: En image d'illustration, un extrait de la délicieuse [pub anti-piratage](https://en.wikipedia.org/wiki/You_Wouldn%27t_Steal_a_Car) maintes fois détournée.
**Mis à jour le 29 juillet 2024 avec des corrections adaptées pour un usage personnel.**
{{<warn>}}Dans ce qui suit, le fichier partagé n'est pas strictement privé (même s'il est hautement improbable que quelqu'un qui ne détient pas le fichier Torrent puisse l'obtenir) !{{</warn>}}
On va utiliser [Transmission](https://wiki.archlinux.org/title/Transmission), un client [BitTorrent](https://fr.wikipedia.org/wiki/BitTorrent) libre très utilisé, qui a l'avantage de proposer une CLI simple d'utilisation et de pouvoir gérer la création de torrents.
{{<info>}}Pour rappel, BitTorrent c'est un protocole de partage de fichiers en pair-à-pair. Pas de serveur central, juste des gens avec un ordinateur (pas forcément un serveur) comme vous et moi. C'est intrinsèquement résilient, car si 10 personnes ont une copie du fichier, peu importe si une ou deux s'éteint. La censure ne fonctionne pas dans un tel réseau.{{</info>}}
On passe `rpc-authentication-required` à `false`. L'authentification RPC est souvent utilisée pour contrôler Transmission à distance. Ici, on se facilite les commandes.
{{<info>}}Pas d'inquiétude, une whitelist par défaut limite l'authentification à `localhost`, donc si vous avez l'entière maîtrise sur votre serveur, je n'y vois pas d'inconvénient majeur. Après, je ne suis pas læ plus strict·e niveau sécurité 😇.{{</info>}}
Le port `51413` est le port TCP par défaut de Transmission. Il existe plusieurs mécanismes pour échanger des fichiers via BitTorrent, et ici on utilisera le plus simple : Transmission annoncera qu'on peut contacter notre serveur sur ce port.
{{<warn>}}Si vous avez un pare-feu restrictif, c'est le moment d'ouvrir le port `51413`.{{</warn>}}
Les « trackers » sont des genre d'annuaires où s'enregistrent les pairs possédant tout ou partie des fichiers d'un torrent. Ces pairs sont appelés **seeders**, ils partagent. Les autres, qui veulent récupérer des fichiers, sont des **leechers**. Grâce aux trackers, les leechers récupèrent la liste des seeders 🌱. On peut être les deux à la fois d'ailleurs : récupérer un morceau de fichier tout en en partageant un autre.
Une fois cette liste récupérée, la transmission se fait en pair-à-pair ↔️.
{{<info>}}Pour les plus curieux·se d'entre vous, il existe aussi une méthode entièrement décentralisée qui repose sur les [tables de hachage distribuée](https://igm.univ-mlv.fr/~dr/XPOSE2013/bittorrent/ext.html).{{</info>}}
Il existe des trackers publics et privés. Les trackers publics sont maintenus parfois par des associations, parfois par des individus, parfois on sait pas trop, mais ils sont loin d'être stables : ils peuvent être suspendus ou surchargés. L'idéal est donc d'associer plusieurs trackers publics à un torrent pour être sûr·e qu'au moins un des trackers soit accessible lors du leech. Ça évite aussi le côté « centralisation », pas vraiment compatible avec la philosophie torrent.
{{<warn>}}Edit 29/07/2024 : parfois il est difficile de trouver des trackers qui fonctionnent et ça peut prendre la tête longtemps... Une solution dans ce cas est de lancer [opentracker](https://erdgeist.org/arts/software/opentracker/) le temps du partage, en [whitelistant](https://blog.microjoe.org/2017/tracker-bittorrent-opentracker.html) le hash du torrent à partager pour éviter qu'il ne devienne un tracker public. L'URL `http://<IP>:6969/announce` sera celle à renseigner pour le tracker, tandis que la même URL avec `/stats` au lieu de `/announce` permettra de voir si le torrent est bien annoncé.{{</warn>}}
{{<info>}}L'option `-p` demande au client de ne pas fuiter nos fichiers torrent en cherchant des pairs autrement qu'en passant par le tracker.{{</info>}}
Le torrent ne contient finalement pas grand chose : entre autres, le nom du dossier, la liste des trackers et le hash du torrent, indispensable pour l'identifier sur les trackers. Ce hash dépend bien sûr du dossier et de son contenu.
{{<info>}}Utilise la commande `transmission-show perfectly-legal.torrent` pour l'inspecter.{{</info>}}
Avant de se mettre à seeder, il faut copier notre dossier `perfectly-legal` dans le dossier de téléchargement de Transmission, sinon le daemon ne se rendra pas compte qu'il peut seeder !
En réalité, cette commande pourrait aussi lancer un leech, si le fichier était hébergé autre part. C'est le principe même des torrents : tu peux être à la fois seeder et leecher.
Côté client, j'utilise [qBitTorrent](https://www.qbittorrent.org/) pour gérer les torrents que je télécharge. Quand j'ouvre `perfectly-legal.torrent` et que je commence le téléchargement, chaque tracker m'indique un pair. Logique, c'est le serveur depuis lequel le dossier est seedé. Quand je regarde ses informations, je vois :