Dorénant ce blog est hosté à cette adresse : https://ipfs.io/ipns/blog.burdet.ch

Séduit par le concept de IPFS, qui allie peer-to-peer et donnée adressée par contenu “à la Git”, le présente post vous explique comment j’ai déporté l’hébergement de ce blog dans ce que sera Internet bientôt.

Un avantage, c’est que par exemple le blog pourra continuer d’être accessible pendant que mon serveur est down.

Plusieurs modifications ont été nécessaires pour parvenir à cela.

Préparation IPFS sur orion

Orion est mon serveur à tout faire, c’est lui qui héberge le code source du blog ainsi que le processus d’intégration continue (Jenkins) qui le publie vers le serveur web nginx.

Nous y allons lui ajouter une n ème brique de plus, ipfs.

On commence par créer le user ipfs :

[jfburdet@orion ~]$ sudo useradd -m  -s /bin/bash ipfs

Ensuite, sous l’identité du user ipfs, on initie le repository :

[jfburdet@orion ~]$ sudo su - ipfs
[ipfs@orion ~]$ ipfs init

Pour adresser mon serveur par un hash fixe, je dois créer une clé spécifique :

[ipfs@orion ~]$ ipfs key gen --type=rsa --size=2048 blog.burdet.ch                                                                                                                                  10:41:13
QmNTzWJc31KdqiiEAW4sXkDMiF96iB5Hq29RRKC9H1SFyu

Le hash donné ci-dessus (QmNTzWJc31KdqiiEAW4sXkDMiF96iB5Hq29RRKC9H1SFyu) sera l’url d’accès dans les namespace ipfs, à savoir /ipns/QmNTzWJc31KdqiiEAW4sXkDMiF96iB5Hq29RRKC9H1SFyu.

Cette clé est stockée dans /home/ipfs/.ipfs/keystore, qu’il faut backuper !

Finalement, il faut créer le systemd unit file et activer le service :

[ipfs@orion ~]$ exit
[jfburdet@orion ~]$ sudo vi /etc/systemd/system/ipfs.service
 
[Service]
ExecStartPre=chdir /home/ipfs
ExecStart=/usr/bin/ipfs daemon --writable
Restart=always
User=ipfs
Group=ipfs

[Install]
WantedBy=multi-user.target
[jfburdet@orion ~]$sudo systemctl enable --now ipfs

Réglages DNS

Afin que le blog soit accessible via des urls intelligible, comme https://ipfs.io/ipns/blog.burdet.ch à la place de https://ipfs.io/ipns/QmNTzWJc31KdqiiEAW4sXkDMiF96iB5Hq29RRKC9H1SFyu

Il faut ajouter le record TXT suivant chez dans la configuration DNS :

dnslink=/ipns/QmNTzWJc31KdqiiEAW4sXkDMiF96iB5Hq29RRKC9H1SFyu

Redirection WEB

On configure Nginx pour indiquer au client http la redirection permanente sur la nouvelle url.

[jfburdet@orion ~] sudo vi /etc/nginx/servers-enabled/blog.burdet.ch.conf

On remplace la ligne

root /srv/http/blog.burdet.ch; 

par

rewrite ^/$ https://ipfs.io/ipns/blog.burdet.ch permanent;

On peut maintenant supprimer /srv/http/blog.burdet.ch

Réglages jekyll

Il faut spécifier que l’url racine du site à changé dans _config.yml

url: https://ipfs.io/ipns/blog.burdet.ch

Intégration avec Jenkins et publication IPFS

On modifie ensuite le scripr de build jenkins (via la web ui):

set -e

## Etape 1 : Build du blog via jekyll, dans docker

docker build -t jenkins/blog .
rm -f cid
docker run --cidfile=cid jenkins/blog bash -c  "bundle exec jekyll build"
rm -rf _site/
docker cp $(cat cid):/blog/_site .
rm -f cid


# Etape 2 : Deploiement vers IPFS

# On doit d'abord convertir le site avec un mini serveur web et wget
PORT=26320
TMPDIR=$(mktemp -d)
PIDFILE=$(mktemp)

daemonize -p $PIDFILE -c $WORKSPACE/_site /usr/bin/ruby -run -ehttpd . -p$PORT
sleep 1

cd $TMPDIR
wget --no-verbose --mirror --convert-links --page-requisites http://localhost:$PORT

pkill -F $PIDFILE

# Le site est maintenant convertir et se trouve ddans $TMPDIR/localhost:$PORT
# on le publie via l'API locale ips (attention : le daemon ipfs doit être writable)

OLDHASH=$(ipfs --api /ip4/127.0.0.1/tcp/5001 resolve -r /ipns/blog.burdet.ch)
NEWHASH=$(ipfs --api /ip4/127.0.0.1/tcp/5001 add -Q localhost:$PORT -r)


ipfs --api /ip4/127.0.0.1/tcp/5001 name publish --key blog.burdet.ch $NEWHASH
ipfs --api /ip4/127.0.0.1/tcp/5001 pin add $NEWHASH

if [ "$OLDHASH" != "$NEWHASH" ]
then
	ipfs --api /ip4/127.0.0.1/tcp/5001 pin rm $OLDHASH
fi

rm -rf $TMPDIR
rm -rf $PIDFILE