Хостинг на IPFS

Опубликовано 25 Июня, 2023 под тегами IPFS, Хостинг, Cloudflare

Маленькая заметка о том как захостить статический сайт-визитку без “настоящего” хостинга, с помощью ipfs.

Что такое ipfs объяснять не буду, Википедия лучше меня объяснит. Что нас интересует в данном случае – это то что существуют гейты из ipfs в clearnet.

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

Короткий гайд без свистелок:

0. Установка ipfs

Ставим https://github.com/ipfs/kubo, не суть важно как. Выполняем ipfs init. Запускаем ipfs daemon. Web-UI доступен на http://127.0.0.1:5001/

1. Публикация

Можно добавить директорию через web-ui на вкладке Files. В чём-то проще через командную строку:

$ ipfs add -r path/to/webroot

Важно: по умолчанию ipfs игнорирует “скрытые” файлы (начинающиеся на точку), поэтому какой-нибудь .well-known будет проигнорирован. Чтобы этого избежать, надо делать add с флагом -H:

$ ipfs add -H -r path/to/webroot

Вывод будет выглядеть как-то так:

...
added QmbeSofVciuxQxSN2ZJxoa2a3jDRzR3HfmS77nCpdd4h4X webroot/index.html
...
added QmSbW2Nfjj9ZRYERcKijzTVCLQyuoXGUyXsm7xPn9JSHXk webroot

Записываем куда-нибудь хэш из последней строчки! Это ipfs-идентификатор, по которому будет доступно содержимое директории.

2. Настройка гейта

Хэш который выдаёт ipfs по умолчанию чувствителен к регистру. Поскольку мы хотим получать к нему доступ через доменное имя, которое к регистру не обязательно чувствительно, нужна другая кодировка. Поэтому возьмём хэш из предыдущего шага и скормим его в ipfs cid base32:

$ ipfs cid base32 QmSbW2Nfjj9ZRYERcKijzTVCLQyuoXGUyXsm7xPn9JSHXk
bafybeib7hsr36qjfxi6lxouqkhdas2zbnkl4knhpbt2mg6d26iffoqdfn4

Этот хэш уже можно использовать с каким-нибудь публичным гейтом. Гейт можно найти на https://ipfs.github.io/public-gateway-checker/, но есть нюанс, не все гейты умеют в dns алиасы. Собственно, их на момент написания два рабочих: dweb.link и cf-ipfs.com, последний предоставляется Cloudflare.

Чтобы получить адрес опубликованного сайта мы берём хэш в base32 и добавляем его как поддомен от ipfs.<gateway>, например: http://bafybeib7hsr36qjfxi6lxouqkhdas2zbnkl4knhpbt2mg6d26iffoqdfn4.ipfs.cf-ipfs.com/

Ура, работает! Но это ещё не всё…

3. Пиннинг

Никто не гарантирует что файлы будут доступны в ipfs-сети, если выключить ipfs-узел их загрузивший. То есть, они кэшируются на промежуточных узлах, но эти кэши рано или поздно истекут. Чтобы кэши не истекали, контент надо “запинить” командой ipfs pin. Когда мы делали ipfs add, это произошло автоматом, но только на нашем узле, понятно. Чтобы не держать ipfs-демона постоянно включенным на своей машине, можно воспользоваться сторонним сервисом. Предлагающих какой-никакой но бесплатный тариф без трудновыполнимых условий я нашёл два:

  • https://www.pinata.cloud/
  • https://www.4everland.org/

Последний правда требует небольших единоразовых затрат крипты для активации всех функций и увеличения лимитов, но можно обойтись и без этого.

На примере Pinata, создаём аккаунт, на вкладке Files жмём кнопку Add Files, выбираем CID и вводим хэш директории с шага (1). Ждём пока он появится в списке файлов (может занять до нескольких часов). После этого можно с чистой совестью прибить ipfs у себя (ipfs shutdown).

Почему сразу не загрузить файлы? Потому что “HTML is not allowed on free plans”, но если добавить по CID, то прокатывает.

Послесловие

Можно ли это привязать к своему домену? Можно, с помощью CNAME. Но тут есть много нюансов, и таким образом абьюзить публичный гейт не слишком красиво. Cloudflare продаёт приватные гейты по разумным ценам. Pinning сервисы тоже это делают.

Reading material