Хостинг на IPFS
Маленькая заметка о том как захостить статический сайт-визитку без “настоящего” хостинга, с помощью 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 сервисы тоже это делают.