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

в 17:29, , рубрики: DNS, ipfs, ipns, децентрализованные сети

В 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. В каталоге сайта должен быть минимальный набор:

    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

Автор: ivan386

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js