Bonjour à tous,
J'ai mis la main sur un nom de domaine .ETH car le concept d'un système de nom de domaine sur la blockchain m'intéressait et il se trouve que le service en question permet de faire pointer l'adresse .eth vers du contenu IPFS. Un cocktail bien corsé pour construire des sites statiques plus résistant à la censure ! Dans ce qui va suivre, je vais addresser les difficultés et les réponses que j'ai trouvé pour mettre mon contenu sur IPFS.
J'ai téléchargé l'implémentation en Go de IPFS et commencé à suivre ce guide pour publier le site web ici présent sur IPFS. La manipulation peut se résumer comme ceci:
systemctl enable --user --now ipfs # activation du service ipfs au démaragge pour l'utilisateur ipfs init # initialisation fichier de config IPFS cd /srv/www/blog ipfs add -r . > [...output...] > added QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9 partage.les-miquelots.net # noter la dernière valeur de la commande `ipfs add -r` du dessus, c'est le hash du répertoire contenant les autres fichiers de notre site sur ipfs. # vous pouvez la récupérer APRÈS ajout en ajoutant les paramètres '-n -q' à la commande `ipfs add -r`, seul les hashs seront listés. ipfs name publish QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9 > Publishing to /ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9... Published to k51qzi5uqu5di7tiomn1hejxpswnctdg6m0p6ywk044nv22nk34bapve8ji6xe: /ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9
"Super" me suis-je dis, "je vais pouvoir y accéder dans un navigateur via la clé d'installation IPFS du répertoire (celle qui commence par k51qzi...
) et une passerelle ipfs...". Mais non, je fus accueilli par l'erreur suivante: Error: context deadline exceeded
.
Il se trouve qu'il faut ouvrir le(s) port(s) correspondant à une valeur trouvé dans le fichier de configuration d'IPFS, Addresses.Swarm:
ipfs config Addresses.Swarm >[ > "/ip4/0.0.0.0/tcp/4001", > "/ip6/::/tcp/4001", > "/ip4/0.0.0.0/udp/4001/quic", > "/ip6/::/udp/4001/quic" >]
Ce qui nous intéresse ici est la valeur après le type du protocole de communication: dans notre mon cas c'est 4001 (votre valeur peut différer). Ouvrons ce port dans le pare-feu:
ufw allow 4001
J'ai ensuite réajouté mon site web dans IPFS via ipfs add -r
et ipfs name publish ...
puis retenter le chargement via ipns, et ça a marché.
Ou dénommés hooks, sont essentiels pour le déploiement d'un site web statique via Git (j'aime bien ce guide sur le sujet). La modification pour intégration avec IPFS est simple, voici à quoi ressemble mon hook post-receive
:
#!/bin/sh WEBDIR="/srv/www/webdir" GIT_WORK_TREE="$WEBDIR" git checkout -f chmod 755 -R $WEBDIR rm -rf $WEBDIR/.git $WEBDIR/.gitignore # ménage des dossiers # et fichiers inutiles # pour le site ipfs add -r $WEBDIR # ajout du répertoire du site web sur IPFS IPFS_DIR_HASH="$(ipfs add -r -q -n $WEBDIR | tail -1)" # hash du répertoire sur # la dernière ligne, on recup ipfs name publish $IPFS_DIR_HASH # publication sur ipns
L'attente devrait être en moyenne aux alentours de 30 secondes pour la publication du contenu sur IPFS.
Après ça je me suis demandais s'il y avait des configurations préfaites selon le contexte d'utilisation d'IPFS. Il se trouve que oui et on peut les appliquer via la ligne de commande. Si vous êtes sur un VPS, ipfs config profile apply server
est intéressant: il désactive le balayage du réseau local pour la recherche de noeud IPFS.
Redémarrez votre daemon IPFS après la commande.
Si vous utilisez par exemple https://gateway.ipfs.io/ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9 pour accéder à votre site hébergé via IPFS, la déclaration de chemin absolu dans la source HTML de votre site va poser problème: la feuille de style href="/styles.css"
pointera vers https://gateway.ipfs.io/styles.css.
À cet effet, je préfère dweb.link parce que cette passerelle dirige vers un sous domaine lors de la résolution de nom des addresses de contenu ipfs: https://dweb.link/ipfs/QmQjEXGdrWbp4eu6hsN4wwVjvkeGurmUxoXBoY5J2QvEk9/ redirigera vers https://bafybeibdqbrggbnn5to7rd2nieobiiklhikjiwcexb5arpziqb7u5khygi.ipfs.dweb.link/ et on n'aura pas de soucis. Celà évite de réécrire tout en chemin relatifs.
Pour que le nom de domaine en .eth pointe vers notre site hébergé depuis IPFS, il faut lui donner l'adresse du contenu. Si vous avez déjà fait plusieurs mise à jour et publié sur IPFS, vous avez pu voir que le CID change lors du changemnt du contenu du répertoire ou fichier.
Mettre à jour ce contenu dans l'interface de ens.domains coûte de l'ETH avec les coûts du gas qui l'accompagne, puisque on inscrit cette donnée dans la blockchain. Avec les prix du gas actuel et surtout si vous faites des mises à jour fréquentes, vous allez payer bonbon.
Je pense donc que la solution pour contrecarrer le fait qu'on est pas Crésus est d'utiliser IPNS + DNSLink. La démarche est comme suit:
_dnslink
et comme valeur dnslink=/ipfs/hash_du_fichier_ou_repertoire_sur_ipfs
. Automatisable si votre hébergeur DNS fournit l'accés à son API. Dans mon cas, on a par exemple:
;; ANSWER SECTION: _dnslink.partage.les-miquelots.net. 60 IN TXT "dnslink=/ipfs/QmPud4wyhs58VWxyzgKNSi2rFwFdtjscHADt4rbw1WaMNp"
ipfs key list -l --ipns-base base32 >bafzaajaiaejcaum5ub77e74hftph3jbbitj2njlmrn2zs2xbsp4aedog776jnjus self
/ipns/bafzaajaiaejcaum5ub77e74hftph3jbbitj2njlmrn2zs2xbsp4aedog776jnjus
ou ipns://bafzaajaiaejcaum5ub77e74hftph3jbbitj2njlmrn2zs2xbsp4aedog776jnjus
De ce fait, vous n'avez plus qu'à mettre à jour votre zone DNS (de façon automatisée de préférence) hors blockchain afin que votre domaine .eth pointe toujours vers le contenu IPFS le plus récent pour votre site web.
J'ai remarqué que malgré le fait que ipfs add -r
épingle (pin) les fichiers pour les rendre disponible, au bout d'un certain temps, si vous ne refaites pas un ipfs add -r
même quand le contenu de votre site ne change pas, il ne sera plus accessible via ipns. L'astuce est donc de refaire un coup de ipfs add -r
et pourquoi pas de mettre tout ça dans la crontab de l'utilisateur d'IPFS:
# adaptez le chemin /srv/www/webdir avec le votre # lancement de la commande d'ajout des fichiers sur IPFS toutes les heures * */1 * * * /usr/bin/ipfs add -r /srv/www/webdir
C'est tout ce que j'ai à dire pour l'instant sur le sujet. Hey, c'est d'ailleurs le premier poste de 2022! Bonne année à vous tous!