Выход на межпланетный уровень

Я уже как-то сетовал, что полноценно скрестить ужа с ежом индивеб с IPFS затруднительно, но желание повесить этот сайт в IPFS всё никак не давало мне покоя. Сайт, выгруженный в IPFS, доступен всегда (правда, первая загрузка может быть довольно медленной), пока доступна DNS-запись и в сети есть хоть одна копия (поэтому его невозможно заблокировать, кроме как на уровне DNS), и чем популярнее конкретная страница, тем больше существует её копий, и тем быстрее она будет загружаться — своего рода «бесплатная» CDN. Ну и для приватности пользователей здорово: даже в логах сервера никаких следов посещения не остаётся. Собственно, у меня есть сайт-визитка, который вообще только в IPFS и существует (а в «обычный» интернет проброшен бесплатным сервисом Cloudflare), и прекрасно там себя чувствует. Если б не проблема со скоростью распространения (а при отсылке вебменшена это реальная проблема)…

Очевидное решение пришло в голову только на днях: а что, собственно, мешает не переносить сайт в IPFS целиком, а сделать зеркало сайта в IPFS и DNS-запись для него?! При этом сайт никуда не девается из «обычной» Паутины, через неё же продолжают работать вебменшены и прочие индивебные штуки, но в IPFS сайт тоже доступен, и все соответствующие радости имеют место. Да оно и технически несложно…

Поскольку сайт с недавних пор всё равно крутится на VPS, и немножко свободных ресурсов на сервере оставалось, проще всего оказалось установить узел IPFS прямо на этот же сервер, а в скрипт, пересобирающий сайт при обновлениях, добавить буквально пару строк. Благо, в процессе обновления у меня всё равно есть момент, когда существуют директории и со старой версией сайта, и с новой, поэтому можно легко «открепить» старую версию и сделать доступной в IPFS новую — как-то вот так:

ipfs add -r -H -Q -n old/public | ipfs pin rm
ipfs-dns.sh $(ipfs add -r -H -Q public)

Здесь идентификатор новой версии сайта сразу передаётся скрипту ipfs-dns.sh, который прописывает его в DNS-запись. Для DigitalOcean, где у меня VPS, это выглядит примерно так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/sh
set -e
token=[токен аутентификации]
record=[номер записи TXT, содержащей _dnslink]
curl -X PUT \
 "https://api.digitalocean.com/v2/domains/evgenykuznetsov.org/records/$record" \
 -H "Authorization: Bearer $token" \
 -H "Content-Type: application/json" \
 -d '{"data":"dnslink=/ipfs/'$1'"}' \
 -s | jq '."domain_record"."data"'

Собственно, сегодня я вот это всё сделал. Теперь, если зайти на этот сайт браузером, поддерживающим IPFS (для Firefox и Chrome есть плагины, Brave, говорят, «из коробки» умеет), сайт откроется именно через IPFS.

Здо́рово же?!