Бессерверный статический сайт с помощью IPFS

TL; DR: IPFS позволяет хостить статические сайты распределённо, доступ к которым можно осуществлять через публичные кеширующие гейты (прозрачные реверс-прокси) в интернете, без необходимости устанавливать программу посетителю. Такие сайты можно раздавать без маршрутизируемого («белого») статического IP-адреса (будет работать за NAT), они остаются работоспособными при кратковременном (несколько часов) отсутствии раздающих, за счет кеша на гейтах. К гейтам по желанию можно привязать свой домен, причём добавить DNS-записи можно на несколько гейтов одновременно, для повышения надёжности и балансировки нагрузки. Сайт могут скачать другие пользователи IPFS и помочь с раздачей.
IPFS отлично подходит для статических блогов, простых сайтов, файловых архивов (в качестве замены Bittorrent), а также просто для единовременной передачи больших файлов без предварительной загрузки их на какой-либо сервис. IPFS — децентрализованная пиринговая система передачи файлов, по принципу работы похожая на BitTorrent, но с возможностью доступа через HTTP, для Web. Все скачиваемые пользователем файлы временно кешируются IPFS-демоном и раздаются другим пользователям, запрашивающим их. Важные файлы можно «прикрепить» (pin) к IPFS-демону, тогда они не исчезнут из кеша.
Добавляемые в IPFS файлы получают глобальные хеши-идентификаторы, которые не меняются при повторном добавлении файла. Адресация в сети осуществляется по идентификаторам контента (CID), внутри которых содержится мультихеш. В контексте IPFS, они указывают на неизменяющийся или изменяющийся файл, директорию, метаданные или симлинк.

На текущий момент развития, проект полноценно работает только со статическими данными, но уже имеется экспериментальная поддержка протокола типа издатель-подписчик (publish/subscribe), а также реализация IPFS на Javascript, работающая в браузере, что в перспективе позволит создавать динамические сайты (например, блоги с комментариями) с возможностью взаимодействия в реальном времени (например, чаты).

Одно из серьезных преимуществ IPFS в сравнении с другими подобными технологиями — доступ к ресурсам из интернета через гейты, которые устанавливают компании и энтузиасты технологии. Они позволяют просматривать сайты и скачивать файлы без установки IPFS на компьютер. Самый большой гейт — от Cloudflare, он также позволяет выпустить бесплатный HTTPS-сертификат для домена.

Сеть позволяет эффективно, распределённо и децентрализованно раздавать и скачивать данные, в том числе из браузера. Я вижу следующие реальные применения проекту:

  1. Бесплатный бомж-хостинг статических веб-сайтов на домашнем компьютере, без выделенного IP-адреса (за NAT), без домена или с доменом;
  2. Не подконтрольный цензуре хостинг сайтов повышенного риска, которые могут быть заблокированы государством или сторонними компаниями в рамках DMCA;
  3. Раздача периодически меняющихся или добавляющихся данных, которые нельзя эффективно раздать через Bittorrent (придется постоянно пересоздавать torrent-файл и просить всех раздающих скачивать его заново, что ведёт к фрагментации сидов);
  4. Альтернатива CDN, не требующая настроек на стороне «CDN-провайдера».

Это проще, чем с обычным хостингом! Рассмотрим бомж-хостинг простого статического сайта.

Самый простой вариант — с использованием графической утилиты Siderus Orion.
Устанавливаем утилиту, запускаем, нажимаем File → Add Directory, выбираем директорию с файлами сайта.
Через какое-то время появится окно с информацией импортированного контента:
image

Переходим во вкладку «Files», нажимаем правой кнопкой мыши на хеш → Open in browser:
image

Если всё было сделано правильно, сайт откроется через гейт siderus.com:
https://siderus.io/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7/

Это всё, ваш статический сайт доступен для других пользователей, пока вы держите запущенной программу, или пока он остается в кеше гейта.

Альтернативный консольный вариант — скачиваем официальный клиент go-ipfs, распаковываем, инициализируем и запускаем так, как написано на сайте:

ipfs init
ipfs daemon


Далее, добавляем нашу директорию с файлами сайта:

ipfs add -r ./www.uncleoutrage.com
…
added QmXdaairbPoSGV98sQ3GsEuevVTE1EBUzZ4PhbLfKVh1nX www.uncleoutrage.com/images/fanart
added QmdFbHdzzB4qBBkn8UsyHnjg1BKEtm9d5LaTyv5aZd8bbE www.uncleoutrage.com/images/gigs/thumbs
added QmVPJ3Mr8gZL5x15A9XARC1uHASqb2JMsKTT7mWs37UmBo www.uncleoutrage.com/images/gigs
added Qmd3AbVwMVE9W6ZSEuax96Xnymbnic4XVCdNEKBPZcWi5c www.uncleoutrage.com/images/live/thumbs
added QmebUfmT2wmZMbJcAmSMS4cZJr4guTqV67xNJ3hiQGsLYx www.uncleoutrage.com/images/live
added QmaEVaRiUUXfDnjjuXHGGsg7jDaFrCaxS7wi6q83q4N1uu www.uncleoutrage.com/images/misc/thumbs
added QmW2ZivQF5eh5LHSLet298AhKCHiQsFV6rvUFvMcCkLopo www.uncleoutrage.com/images/misc
added QmZXXn7abBvj7SvYJoYMAXUeajP6A1UABKENrNwuhKqofk www.uncleoutrage.com/images/promo/thumbs
added Qmcx6bMKur4Anzh91bJC6o5vMPftzocSMmd7iYxoGwQrNX www.uncleoutrage.com/images/promo
added QmW8P3ZnvKUytCWJF6y6wvBD8XAkk4bvJoVK8j3apokzLS www.uncleoutrage.com/images
added QmXG1QjfpCjErQBGZvF6VWBryXe9WFLPqhrsGWtikACVwR www.uncleoutrage.com/js
added QmYGXwLJBnqXwWYGKVtjZtmwncgwNoqNmnYqo1NTinTGBp www.uncleoutrage.com/theband/misc/pages
added QmWg4JyZ4ox9hcHt6JGBfzUm5CqWsb6DixUksamFvbirH4 www.uncleoutrage.com/theband/misc
added QmPtn9XBhWqe7A1z3ikktWExSPSM27LTzUL3US9N5xcAPB www.uncleoutrage.com/theband/redsaug21/pages
added QmaGV6kfLdL1bKGBBHYJLDVstiejAANayBZt16NMF9g9j9 www.uncleoutrage.com/theband/redsaug21
added QmScmcUAdC5pinMxaoLuXSy3FDUAX5E68dADnGjYZbPUiY www.uncleoutrage.com/theband
added QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7 www.uncleoutrage.com


Последний хеш — хеш директории, он нам и нужен.

Составляем ссылку для открытия директории через гейт вручную, вида:

https://домен/ipfs/хеш


Например:
https://cloudflare-ipfs.com/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7 Чтобы сделать веб-сайт доступным по домену https://uncleoutrage.com/, а не по длинной и некрасивой ссылке, необходимо добавить несколько DNS-записей:

  1. A и AAAA-записи, указывающие на IP-адрес гейта, либо CNAME-запись, указывающую на доменное имя гейта;
  2. TXT-запись »_dnslink», с содержимым вида «dnslink=/ipfs/HASH».


В моём случае, я добавил A и AAAA-записи, указывающие на IP-адреса cloudflare-ipfs.com, и TXT-запись »_dnslink.uncleoutrage.com»:

uncleoutrage.com.  IN  A 104.18.252.167
uncleoutrage.com.  IN  A 104.18.255.167
uncleoutrage.com.  IN  AAAA 2400:cb00:2048:1::6812:fda7
uncleoutrage.com.  IN  AAAA 2400:cb00:2048:1::6812:40a8
_dnslink.uncleoutrage.com. IN TXT "dnslink=/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7"


У Cloudflare можно получить HTTPS-сертификат для привязанного домена, его нужно запросить на специальной странице получения сертификата.
Если вам не нужна поддержка HTTPS, вы можете добавить сразу несколько A/AAAA-записей на разные гейты, актуальный список рабочих гейтов доступен на форуме проекта.
В случае обновления сайта, вам придётся обновить и TXT-запись домена. IPFS позволяет сгенерировать специальный статичный хеш-идентификатор, указывающий на изменяющийся хеш — IPNS. В графическом клиенте достаточно нажать File → Publish to IPNS, и указывать в ссылке или в TXT-записи домена свой peer ID, а не хеш, полученный при добавлении директории. Например:

https://cloudflare-ipfs.com/ipns/QmV97DGqaaTVn54RH9CLTi9hxXfr57gJQ4zGtyHcVbtfH6


Однако, IPNS-запись нужно обновлять (публиковать) раз в несколько часов вручную, и резолвятся они заметно медленнее /ipfs/. Если вы хотите узнать больше об IPFS — читайте цикл отличных статей ivan386. Они гиковские, и в них почти не рассказывается, зачем обычному человеку может потребоваться IPFS (иначе этой статьи бы не было).

Хотите помочь в раздаче IPFS-сайтов, или быть информированным о том, что домен привязан к IPFS-гейту? Устанавливайте браузерное дополнение (для Firefox, для Chrome), переадресующее IPFS-сайты на вашу локальную ноду.

Антизапрет уже несколько месяцев раздает терабайт PAC-файлов в сутки через IPFS, с использованием гейта Cloudflare. Работает стабильно, значительно экономит трафик сервера.

© Habrahabr.ru