Публикуем сайт в межпланетной файловой системе IPFS

В InterPlanetary File System можно запустить статичный сайт который будет доступен и напрямую и по IPNS. У сайта будет нормальное доменное имя благодаря использованию DNS. Доменное имя можно использовать для доступа к сайту напрямую, через глобальный и локальный шлюз.


Условия:


  1. На нашем сервере установлен IPFS
  2. У нас есть домен и доступно редактирование DNS записей

image


Имя домена может содержать только один тире подряд из за этой строки:


const DomainRegexpStr = "^([a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,}$"

Она проверяет правильность имени домена. Ограничения на домен будут работать пока не примут Pull request «Use more comprehensive hostname regex pattern».


Оглавление
  1. Один сайт
  2. Проверка
  3. Несколько сайтов
  4. Альтернативные способы
  5. Локальный шлюз
  6. Глобальный шлюз
  7. Заключение
  8. Источники

Один сайт


  1. В каталоге сайта должен быть минимальный набор:


    1. Индексный файл «index.html» (если его не будет то IPFS покажет содержимое каталога)
    2. Инструкция для поисковых систем «robots.txt» (я про него вспомнил когда роботы пришли на разведку и я увидел ошибки в консоли IPFS)
    3. Иконка сайта «favicon.ico» (его браузеры автоматом запрашивают если другой не задан)

  2. В настройках меняем строку


    "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


    После редактирования настроек клиент необходимо перезапустить.


    Так мы откроем доступ к шлюзу из интернета.


  3. Запускаем клиент.


    >ipfs daemon

  4. Публикуем каталог с содержимым сайта


    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

    Последним будет нужный нам мультихеш корневого каталога


  5. Привязываем мультихеш каталога к ID


    ipfs name publish [мультихеш каталога]
    
    >ipfs name publish QmNjE3iwCqY7729972CHRdFp3bGPosWoFHJ9YsTzea5icT
    Published to QmVBRmftY9ytHZ1z39b65gtEMY8Tq4Ri8AtmQeqULXPnm5: QmNjE3iwCqY7729972CHRdFp3bGPosWoFHJ9YsTzea5icT

    Здесь в ответе первым идёт ID


  6. Заходим в панель управления DNS добавляем запись TXT


    @ TXT dnslink=/ipns/<наш id>
    
    @ TXT dnslink=/ipns/QmVBRmftY9ytHZ1z39b65gtEMY8Tq4Ri8AtmQeqULXPnm5


Через некоторое время (когда произойдёт обновление DNS) контент станет доступен по адресу сайта и на шлюзе по адресу <адрес шлюза>/ipns/<имя домена>


Так мы опубликовали один сайт.


Проверка


Проверить правильную работу домена можно командой:


    ipfs name resolve -r <имя домена>

    >ipfs name resolve -r ipfs.io
    /ipfs/QmaYRrBpZQRjonxBpBBSLvYmy893ySPpXpHCakhomaQtkU

Несколько сайтов


Бывает что нужно опубликовать несколько разных сайтов.


Для этого:


  1. Складываем каталоги сайтов в один, публикуем и привязываем корневой каталог сайтов к ID.
  2. Добавляем в DNS TXT запись каждого каталога dnslink.


    @ TXT dnslink=/ipns/<наш id>/<имя каталога сайта>
    
    @ TXT dnslink=/ipns/QmVBRmftY9ytHZ1z39b65gtEMY8Tq4Ri8AtmQeqULXPnm5/magnet-converter


Альтернативные способы


  1. Можно ссылаться на другой домен у которого задан dnslink.


    @ TXT dnslink=/ipns/<имя другого домена>[/<путь к файлу или каталогу>]
    
    @ TXT dnslink=/ipns/ipfs.io

  2. В dnslink можно аналогично указать мультихеш на каталог или файл.


    @ TXT dnslink=/ipfs/<мультихеш>[/<путь к файлу или каталогу>]

    1. на каталог


      @ TXT dnslink=/ipfs/Qmce1EkrLpAV4gPxE75c68PhDWFCmEsedWkYVNNVU6Ut1S
      или
      @ TXT dnslink=/ipfs/QmUsr9A8ggX79UKfQRTRCFX6FU9HrrWstHNyED5ygqgShA/magnet-converter

    2. на файл
      @ 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


Источники


  1. IPFS for websites
  2. ipfs command reference
    1. ipfs dns
    2. ipfs name
  3. Межпланетная файловая система IPFS
  4. Почему Интернету нужен IPFS, пока ещё не поздно
  5. Работа в IPFS с человеческим лицом
  6. PAC Functions
  7. Мультихеш
  8. 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 недавно только начал изучать.

© Habrahabr.ru