Публикуем сайт в межпланетной файловой системе IPFS
В 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 хостинг. Для этого надо добавить две записи в DNS.
_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 dns
- ipfs name
- Межпланетная файловая система IPFS
- Почему Интернету нужен IPFS, пока ещё не поздно
- Работа в IPFS с человеческим лицом
- PAC Functions
- Мультихеш
- IPFS implementation in Go
Комментарии (4)
29 ноября 2016 в 22:42
+1↑
↓
И на какой еще планете этот сайт можно открыть?
29 ноября 2016 в 23:08
+1↑
↓
Пока только на этой.
30 ноября 2016 в 01:17
0↑
↓
Ну… maidsafe вроде как отдупляет, и сие интересней, чем то, о чем статья.
А если нужно самый быстрый сайт (из многих точек мира), то есть cloudflare.30 ноября 2016 в 02:12
0↑
↓
Вот кстати интересно есть ли CloudFlare в Норильске?Я воспользовался данным сервисом для 24 часового онлайна. Но в малонаселённых пунктах с медленным интернетом сомневаюсь что CloudFlare позаботится поставить свои сервера. Они держатся на слепом доверии что не будут вмешиваться в то что я через них публикую.
IPFS клиенты и соответственно шлюзы могут быть в каждой локальной сети. Считайте это такой народный CDN. Поскольку содержимое идентифицируется мультихешем IPFS может проверить что получает от других клиентов именно то содержимое которое я опубликовал.
По поводу MaidSafe ничего не могу сказать. Я и IPFS недавно только начал изучать.