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

от автора

В IPFS можно запустить статичный сайт который будет доступен и напрямую и по 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",

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

  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.

Сайт для теста: ivan386.tk

Источники

  1. ipfs command reference
    1. ipfs dns
    2. ipfs name
  2. Межпланетная файловая система IPFS
  3. Почему Интернету нужен IPFS, пока ещё не поздно
  4. Работа в IPFS с человеческим лицом
  5. PAC Functions

ссылка на оригинал статьи https://habrahabr.ru/post/316468/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *