- PVSM.RU - https://www.pvsm.ru -

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

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

Условия:

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

image [1]

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

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

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

Один сайт

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

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

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

    "Gateway": "/ip6/127.0.0.1/tcp/8080",
    
    на
    
    "Gateway": "/ip6/0.0.0.0/tcp/80",

    Редактирование настроек доступно в веб интерфейсе http://127.0.0.1:5001/webui#config [12](он будет доступен после запуска клиента командой 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 хостинг [13]. Для этого надо добавить две записи в DNS.

_dnslink TXT dnslink=/ipns/<наш id>/<имя каталога сайта>

@ CNAME gateway.ipfs.io

Но не все DNS хостинги позволят задать CNAME корневому домену.

В данном случае наш IPFS клиент может работать с настройками по умолчанию. Как только кто то обратится к нашему сайту IPFS клиент на сервере gateway.ipfs.io скопирует от нас содержимое сайта и передаст через шлюз. Данный вариант удобен если ваш сервер за NAT. Но не забываем о том что у глобального шлюза тоже бывают перегрузки.

Заключение

Вот так просто мы делаем свой сайт доступным более современным способом. Теперь он доступен не только напрямую но также и в децентрализованной сети IPFS.

Сайт для теста: ivan386.tk [14]
Через глобальный шлюз: ipfs.io/ipns/ivan386.tk [15]
Через локальный шлюз: 127.0.0.1:8080/ipns/ivan386.tk [16]

Источники

  1. IPFS for websites [17]
  2. ipfs command reference
    1. ipfs dns [18]
    2. ipfs name [19]
  3. Межпланетная файловая система IPFS [20]
  4. Почему Интернету нужен IPFS, пока ещё не поздно [21]
  5. Работа в IPFS с человеческим лицом [22]
  6. PAC Functions [23]
  7. Мультихеш [24]
  8. IPFS implementation in Go [25]

Автор: ivan386

Источник [26]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/dns-2/215271

Ссылки в тексте:

[1] Image: https://habrahabr.ru/post/316468/

[2] "Use more comprehensive hostname regex pattern": https://github.com/jbenet/go-is-domain/pull/3

[3] Один сайт: #odin-sayt

[4] Проверка: #proverka

[5] Несколько сайтов: #neskolko-saytov

[6] Альтернативные способы: #alternativnye-sposoby

[7] Локальный шлюз: #lokalnyy-shlyuz

[8] Глобальный шлюз: #globalnyy-shlyuz

[9] Заключение: #zaklyuchenie

[10] Источники: #istochniki

[11] настройках: https://github.com/ipfs/examples/tree/master/examples/config

[12] http://127.0.0.1:5001/webui#config: http://127.0.0.1:5001/webui#config

[13] хостинг: https://www.reg.ru/?rlink=reflink-717

[14] ivan386.tk: http://ivan386.tk

[15] ipfs.io/ipns/ivan386.tk: http://ipfs.io/ipns/ivan386.tk

[16] 127.0.0.1:8080/ipns/ivan386.tk: http://127.0.0.1:8080/ipns/ivan386.tk

[17] IPFS for websites: https://github.com/ipfs/examples/tree/master/examples/websites

[18] ipfs dns: https://ipfs.io/docs/commands/#ipfs-dns

[19] ipfs name: https://ipfs.io/docs/commands/#ipfs-name

[20] Межпланетная файловая система IPFS: https://habrahabr.ru/post/314768/

[21] Почему Интернету нужен IPFS, пока ещё не поздно: https://habrahabr.ru/post/268275/

[22] Работа в IPFS с человеческим лицом: https://habrahabr.ru/post/310554/

[23] PAC Functions: http://findproxyforurl.com/pac-functions/

[24] Мультихеш: https://github.com/multiformats/multihash

[25] IPFS implementation in Go: https://github.com/ipfs/go-ipfs

[26] Источник: https://habrahabr.ru/post/316468/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best