On peut héberger un site sur un serveur, mais pas 15 !
On peut héberger un site sur deux serveurs, mais pas 15 !
On peut héberger un site sur trois serveurs, mais pas 15 !
Ah bah si, on peut héberger un site sur 15 serveurs.
Intro
Présenté en 2015 par Juan Benet (et non par Jeff Tûche), IPFS (Interplanetary File System) définit un système de stockage de fichiers décentralisé, à l’échelle mondiale.
IPFS est un protocole réseau P2P de partage de fichiers. Son objectif est de rendre des documents accessibles partout, sans interruption.
IPFS a été créé en réaction à la direction prise par Internet d’être de plus en plus centralisé. Où la notion de client et de serveur évoque un écosystème où des ressources sont centralisées sur des serveurs, auxquels se connectent des clients, créant ainsi des relations unidirectionnelles et des rôles inégaux.
Cet état de fait est d’autant plus marqué que certaines entreprises ont réussi à se positionner en réels points incontournables du réseau. Ce sont par exemple les GAFAM, pour les services commerciaux. Mais aussi des organisations permettant le fonctionnement d’Internet, comme l’ICANN.
Au-delà des aspects philosophiques, la centralisation d’internet crée également de multiples SPOF (Single Point of Failure), où un service pourrait rendre des ressources inaccessibles s’il tombait en panne.
IPFS veut revenir au but initial d’internet : une vraie distribution des ressources.
Fonctionnement général
IPFS propose un système distribué où chacun participe au fonctionnement du réseau, comme consommateur et comme acteur. Chacun apporte sa pierre à l’édifice pour éviter les pannes, les monopoles et la censure.
IPFS introduit un nouveau moyen de chercher des ressources, la recherche par contenu.
Internet et la recherche par localisation
Internet nous permet de rechercher des éléments par localisation.
Par exemple, via des URL : https://example.org/directory/image.png
Nous allons indiquer quelle ressource nous voulons (image.png
) et à quel endroit, sur quel serveur, la chercher (https://example.org/directory/
).
L’accès est direct, mais cette solution a quelques inconvénients :
- Le serveur peut tomber en panne ou fermer et rendre la ressource indisponible
- Un pirate peut avoir modifié la ressource pour la rendre malveillante, à l’insu de son administrateur
- Le propriétaire de la ressource peut l’avoir modifiée intentionnellement, dans une situation de censure ou de tromperie
- Un seul service doit supporter toute la bande passante de diffusion vers ses multiples clients.
IPFS et la recherche par contenu
Sur IPFS, les documents sont identifiés par un hash, issu de la signature numérique de leur contenu, qui va permettre d’une part d’y accéder et d’autre par de valider leur intégrité.
On accède aux ressources de cette façon : /ipfs/QmYNQJoKGNHTpPxCVPh9KkDpbExgd2duMa3aF6ytMpHdai/directory/image.png
On retrouve la ressource demandée (image.png
), éventuellement dans une arborescence (/directory/
), et surtout son hash (QmYNQJoKGNHTpPxCVPh9KkDpbExgd2duMa3aF6ytMpHdai
).
Nous ne précisons pas où il faut chercher cette ressource. Nous demandons simplement à accéder à telle ressource et nous interrogeons le réseau sur ce contenu, il nous renverra alors les données en les récupérant là où elles se trouvent.
Si on modifie un document, on modifie également son hash. En utilisant le hash connu pour cette ressource, on tombera bien sur la version correspondante à ce hash.
Ici, avec le hash indiqué, nous sommes certains de récupérer le fichier image.png
tel que nous l’avons initialement connu, il n’aura pas été altéré.
Fonctionnement détaillé
Quand on ajoute un fichier sur IPFS, il est d’abord découpé en blocs de 256Ko. Chacun de ces blocs est haché et un arbre de Merkle est constitué à partir de tous ces hashs afin de vérifier son intégrité.
Le fichier obtient alors un CID (Content IDentifier). C’est le hash avec lequel il sera connu sur le réseau.
Tout cela se passe sur notre nœud local. Pour le moment, nous sommes le seul fournisseur de ce fichier, il est stocké uniquement sur notre ordinateur.
Puis nous communiquons le hash de notre fichier à quelqu’un, qui va venir le récupérer. Il va en télécharger une copie. Nous sommes maintenant 2 fournisseurs pour ce document. N’importe qui pourra le consulter tant qu’au moins l’un de nos deux nœuds IPFS est actif. L’objectif est ainsi de multiplier les téléchargements pour multiplier les sources de ce fichier.
Sur IPFS, de base, chaque fichier est présent de façon éphémère sur le réseau. Mais sa durée de vie est impossible à estimer. Elle variera en fonction du besoin de libération d’espace.
Il est possible d’épingler un fichier. Il sera alors conservé durablement. Au plus il y a de nœuds IPFS qui vont épingler ce fichier, au plus il sera disponible.
Tant que des nœuds du réseau hébergent et épinglent un fichier, il ne pourra jamais disparaître. Pour cette raison, attention à l’utilisation d’IPFS dans cas de données sensibles telles que des données personnelles. Nous ne pouvons plus avoir la main dessus pour les supprimer ou les modifier comme la loi nous y oblige.
En pratique
Nous allons montrer comment il est possible d’héberger sur IPFS un site web statique.
Il existe un certain nombre de passerelles, qui permettent de récupérer des documents sur IPFS via un navigateur.
Une passerelle affichera dans le navigateur le contenu du fichier s’il est affichable comme tel. Par exemple des fichiers texte, HTML, image… Sinon le fichier sera simplement téléchargé sur notre ordinateur.
Nous allons nous appuyer sur 2 éléments :
- Notre nœud IPFS local, pour ajouter notre site sur le réseau
- Une passerelle, pour le visualiser une fois diffusé.
Installation
Il existe une version desktop d’IPFS : https://docs.ipfs.tech/install/ipfs-desktop/
Mais nous allons plutôt utiliser ici la version CLI, en version Linux : https://docs.ipfs.tech/how-to/command-line-quick-start/
Le client IPFS “officiel” s’appelle Kubo. Il s’installe de la façon suivante :
Récupération du binaire :
wget https://dist.ipfs.io/kubo/v0.14.0/kubo_v0.14.0_linux-amd64.tar.gz
Extraction :
tar -xvzf kubo_v0.14.0_linux-amd64.tar.gz
Installation :
cd kubo sudo bash install.sh
Nous pouvons vérifier l’installation :
ipfs --version
Il faut maintenant initialiser notre nœud IPFS :
ipfs init
Un dossier ~/.ipfs
est créé avec les données de notre nœud local.
On peut maintenant lancer le démon :
ipfs dameon
Ça y est, nous sommes connectés au réseau. Nous allons pouvoir stocker et récupérer des fichiers via notre nœud local.
Si le démon est bien lancé, on peut aussi aller jeter un œil sur http://127.0.0.1:5001/webui qui fournit une interface d’administration du nœud et un gestionnaire des fichiers stockés localement.
Création d’un document
Nous allons maintenant créer notre petit site statique. Créons d’abord un répertoire, avec 2 fichiers index.html
et style.css
:
mkdir ipfs-site cd ipfs-site touch index.html touch style.css
Initialisons nos fichiers. Nous allons faire un simple affichage dans index.html
, qui intègrera style.css
afin de le mettre en forme.
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>IPFS website</title> <link rel="stylesheet" type="text/css" href="style.css" media="screen" /> </head> <body> <div> <h1>Mon site sur IPFS</h1> <p> Bienvenue, vous êtes décentralisés ! </p> </div> </body> </html>
style.css
body { font-family: Arial, Helvetica, sans-serif; } h1 { text-align: center; } p { color: red; }
Et voilà, un petit site hyper basique. Nous pouvons l’enrichir avec tout un tas d’autres fichiers, ou même avec des bundles obtenus depuis React ou autres frameworks frontend. Mais avec nos 2 petits fichiers, nous avons le contenu minimum pour comprendre comment tout ça va fonctionner.
Déployons-le maintenant sur IPFS.
ipfs add -r .
Avec la commande ipfs add
nous spécifions d’ajouter récursivement tout ce qui est contenu dans le répertoire courant.
Nous obtenons le résultat suivant :
added QmP32QsKYgJyGf31je13V7S9cLFXP8gaBSPz42tqMAMtzX ipfs-site/index.html added QmeAWGXKryvDVb7EwiNso6eN1VW5uFBwNqHXddHLQRKqV6 ipfs-site/style.css added QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx ipfs-site
Nous pouvons voir les CID générés pour chaque fichier. Mais surtout celui de notre répertoire, qui sera le hash de notre site.
Nous pouvons le consulter via la passerelle ipfs.io
: https://ipfs.io/ipfs/QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx/
Attention, comme nous sommes le seul fournisseur de ces documents pour l’instant, il se peut que le premier accès soit très long. La passerelle va devoir parcourir le réseau jusqu’à venir les trouver sur notre nœud. Une fois qu’elle l’aura trouvé, les accès suivants seront plus rapides.
Notre site obtient donc un URL IPFS. Attention à bien utiliser des liens relatifs lors du développement. Les liens absolus ne fonctionneront pas avec cet URL.
Si nous voulons que notre site reste disponible de façon permanente, nous allons épingler notre répertoire avec ipfs pin add <hash>
:
ipfs pin add QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx
Et voilà, notre site est déployé sur IPFS et épinglé afin de le persister.
Attention, pour le moment, nous sommes le seul fournisseur de ces fichiers. Si on éteint notre nœud, le site sera inaccessible. Il faut que d’autres nœuds le récupèrent et l’épinglent à leur tour afin de le rendre de plus en plus disponible.
Il existe des services comme Pinata, auxquels nous passons le hash de notre site et qui vont faire la récupération et l’épinglage. Ils permettent de déposer notre contenu sur un nœud de réseau disponible en permanence.
IPNS
IPNS (Interplanetary Name System) va nous créer une adresse qui sera liée à notre contenu.
Elle ne changera pas, et restera unique, même si nos fichiers, et donc leur hash, change.
ipfs name publish /ipfs/QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx
On obtient le résultat :
Published to k51qzi5uqu5di9pchi0jc7ds0ocij9lu3oxaicx3wmep48o0g71yrkqhgafz4h: /ipfs/QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx
IPNS va nous créer une clé k51...
qui ne changera jamais et qui identifiera toujours notre répertoire, malgré ses changements.
Maintenant, nous pouvons accéder à notre site via sa clé : https://ipfs.io/ipns/k51qzi5uqu5di9pchi0jc7ds0ocij9lu3oxaicx3wmep48o0g71yrkqhgafz4h/
Nous pouvons faire toutes les mises à jour que nous voulons, le hash de nos fichiers changera, ce qui pourra poser des problèmes si nous accédons au site via le hash du répertoire ou de l’index.html.
Mais si nous y accédons grâce à la clé, nous verrons toujours la dernière version, sans rien changer.
Récupération
Fichiers locaux
Nous pouvons voir les fichiers locaux grâce à la commande ipfs files
qui permet d’utiliser les commandes UNIX classique du système de fichiers. Par exemple ls -l
.
> ipfs files ls -l ipfs-site/ QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx 0
Nous obtenons alors la liste des documents stockés sur le nœud local, et leur hash.
Nous pouvons lire le contenu d’un répertoire avec ipfs ls <hash>
> ipfs ls QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx QmP32QsKYgJyGf31je13V7S9cLFXP8gaBSPz42tqMAMtzX 473 index.html QmeAWGXKryvDVb7EwiNso6eN1VW5uFBwNqHXddHLQRKqV6 110 style.css
On récupère le contenu du répertoire. On peut alors consulter le contenu d’un fichier avec ipfs cat <hash>
, pour index.html
par exemple :
> ipfs cat QmP32QsKYgJyGf31je13V7S9cLFXP8gaBSPz42tqMAMtzX <!DOCTYPE html> ...
Fichiers distants
Pour récupérer le contenu d’un fichier ou d’un répertoire et en devenir fournisseur, on utilise ipfs get <hash>
:
ipfs get QmS47DjBqfA1xhJ3CVyUGTVuD5oCCYSs6fF3yb5D1TJGGx
Tout ce que nous avons vu en ligne de commande est également faisable via l’interface web locale http://127.0.0.1:5001/webui.
Elle est très intuitive et très simple d’utilisation.
Les limites d’IPFS
IPFS est une technologie jeune. Elle n’est pas encore parfaite et mérite d’être fiabilisée avec l’usage.
Elle est encore assez peu répandue. En tant que protocole de décentralisation, il ne pourra réaliser son potentiel qu’avec une utilisation massive.
Pour que des documents soient conservés durablement sur le réseau, ils vont devoir être téléchargés et épinglés par un grand nombre d’utilisateurs, sinon ils sont amenés à disparaître. IPFS n’est donc pas fait pour de la sauvegarde de fichiers.
Il est important de noter que IPFS ne chiffre pas les contenus. Tout fichier est consultable par tout le monde. Si vous souhaitez partager un document confidentiel, c’est à vous de le chiffrer en amont.
A noter aussi qu’IPFS ne protège pas non plus l’anonymat de ses utilisateurs. Les trames réseau du protocole comportent beaucoup d’informations sur leur provenance.
Pour aller plus loin
Avec tout ce que nous avons vu, vous avez compris le fonctionnement de base d’IPFS.
Maintenant, vous allez pouvoir l’intégrer dans vos applications grâce à js.ipfs.
Ou encore l’utiliser via Filecoin, qui pose une blockchain et une cryptomonnaie par-dessus le protocole pour monétiser le service de stockage.