В InterPlanetary File System можно запустить статичный сайт который будет доступен и напрямую и по IPNS. У сайта будет нормальное доменное имя благодаря использованию DNS. Доменное имя можно использовать для доступа к сайту напрямую, через глобальный и локальный шлюз.
Условия:
- На нашем сервере установлен IPFS
- У нас есть домен и доступно редактирование DNS записей
Имя домена может содержать только один тире подряд из за этой строки:
const DomainRegexpStr = "^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$"
Она проверяет правильность имени домена. Ограничения на домен будут работать пока не примут Pull request "Use more comprehensive hostname regex pattern".
Один сайт
-
В каталоге сайта должен быть минимальный набор:
- Индексный файл "index.html" (если его не будет то IPFS покажет содержимое каталога)
- Инструкция для поисковых систем "robots.txt" (я про него вспомнил когда роботы пришли на разведку и я увидел ошибки в консоли IPFS)
- Иконка сайта "favicon.ico" (его браузеры автоматом запрашивают если другой не задан)
-
В настройках меняем строку
"Gateway": "/ip6/127.0.0.1/tcp/8080", на "Gateway": "/ip6/0.0.0.0/tcp/80",
Редактирование настроек доступно в веб интерфейсе http://127.0.0.1:5001/webui#config(он будет доступен после запуска клиента командой
ipfs daemon
) либо в файле~/.ipfs/config
После редактирования настроек клиент необходимо перезапустить.
Так мы откроем доступ к шлюзу из интернета.
-
Запускаем клиент.
>ipfs daemon
-
Публикуем каталог с содержимым сайта
ipfs add -r [путь до каталога] >ipfs add -r ..ivan386.github.io 18.17 KB / ? [-------------------------------------=------------------------------ added QmP2FJJXBjeVqm5DgJ4Q4ZjC5G9A3e74FRTFMV43kHP5p8 ivan386.github.io/favicon.ico ... 80.25 KB / ? [-------------------------------------------------------------------- added QmXzx3rvzdRhLXPtzayG7abQzpyeH3JsyXWNt8CFqKy3Yv ivan386.github.io/index.html ... added QmUsr9A8ggX79UKfQRTRCFX6FU9HrrWstHNyED5ygqgShA ivan386.github.io
Последним будет нужный нам мультихеш корневого каталога
-
Привязываем мультихеш каталога к ID
ipfs name publish [мультихеш каталога] >ipfs name publish QmNjE3iwCqY7729972CHRdFp3bGPosWoFHJ9YsTzea5icT Published to QmVBRmftY9ytHZ1z39b65gtEMY8Tq4Ri8AtmQeqULXPnm5: QmNjE3iwCqY7729972CHRdFp3bGPosWoFHJ9YsTzea5icT
Здесь в ответе первым идёт ID
-
Заходим в панель управления DNS добавляем запись TXT
@ TXT dnslink=/ipns/<наш id> @ TXT dnslink=/ipns/QmVBRmftY9ytHZ1z39b65gtEMY8Tq4Ri8AtmQeqULXPnm5
Через некоторое время (когда произойдёт обновление DNS) контент станет доступен по адресу сайта и на шлюзе по адресу <адрес шлюза>/ipns/<имя домена>
Так мы опубликовали один сайт.
Проверка
Проверить правильную работу домена можно командой:
ipfs name resolve -r <имя домена>
>ipfs name resolve -r ipfs.io
/ipfs/QmaYRrBpZQRjonxBpBBSLvYmy893ySPpXpHCakhomaQtkU
Несколько сайтов
Бывает что нужно опубликовать несколько разных сайтов.
Для этого:
- Складываем каталоги сайтов в один, публикуем и привязываем корневой каталог сайтов к ID.
-
Добавляем в DNS TXT запись каждого каталога dnslink.
@ TXT dnslink=/ipns/<наш id>/<имя каталога сайта> @ TXT dnslink=/ipns/QmVBRmftY9ytHZ1z39b65gtEMY8Tq4Ri8AtmQeqULXPnm5/magnet-converter
Альтернативные способы
-
Можно ссылаться на другой домен у которого задан dnslink.
@ TXT dnslink=/ipns/<имя другого домена>[/<путь к файлу или каталогу>] @ TXT dnslink=/ipns/ipfs.io
-
В dnslink можно аналогично указать мультихеш на каталог или файл.
@ TXT dnslink=/ipfs/<мультихеш>[/<путь к файлу или каталогу>]
-
на каталог
@ TXT dnslink=/ipfs/Qmce1EkrLpAV4gPxE75c68PhDWFCmEsedWkYVNNVU6Ut1S или @ TXT dnslink=/ipfs/QmUsr9A8ggX79UKfQRTRCFX6FU9HrrWstHNyED5ygqgShA/magnet-converter
- на файл
@ TXT dnslink=/ipfs/QmXzx3rvzdRhLXPtzayG7abQzpyeH3JsyXWNt8CFqKy3Yv или @ TXT dnslink=/ipfs/Qmce1EkrLpAV4gPxE75c68PhDWFCmEsedWkYVNNVU6Ut1S/index.html
Это будут перманентные ссылки.
-
Локальный шлюз
Для того чтобы пользователи автоматически подключались к сайту через локальный шлюз я предлагаю добавить A DNS запись.
this-is-ipfs-site-use-local-gate A 127.0.0.1
Это позволит пользователю подключить простой proxy.pac который загрузит сайт через локальный шлюз.
function FindProxyForURL(url, host) {
if ( shExpMatch(url, "http:*") && dnsResolve("this-is-ipfs-site-use-local-gate."+host) == "127.0.0.1" ){
return "PROXY 127.0.0.1:8080; DIRECT"
}
return "DIRECT"
}
Глобальный шлюз
Можно использовать IPFS
_dnslink TXT dnslink=/ipns/<наш id>/<имя каталога сайта>
@ CNAME gateway.ipfs.io
Но не все DNS хостинги позволят задать CNAME корневому домену.
В данном случае наш IPFS клиент может работать с настройками по умолчанию. Как только кто то обратится к нашему сайту IPFS клиент на сервере gateway.ipfs.io скопирует от нас содержимое сайта и передаст через шлюз. Данный вариант удобен если ваш сервер за NAT. Но не забываем о том что у глобального шлюза тоже бывают перегрузки.
Заключение
Вот так просто мы делаем свой сайт доступным более современным способом. Теперь он доступен не только напрямую но также и в децентрализованной сети IPFS.
Сайт для теста: ivan386.tk
Через глобальный шлюз: ipfs.io/ipns/ivan386.tk
Через локальный шлюз: 127.0.0.1:8080/ipns/ivan386.tk
Источники
- IPFS for websites
- ipfs command reference
- Межпланетная файловая система IPFS
- Почему Интернету нужен IPFS, пока ещё не поздно
- Работа в IPFS с человеческим лицом
- PAC Functions
- Мультихеш
- IPFS implementation in Go
Автор: ivan386