Pull to refresh

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

Reading time5 min
Views20K

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


Условия:


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

Напомню: InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network). О ней я начал рассказ в статье "Межпланетная файловая система IPFS".

image


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


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

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



Один сайт


  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

    Смотрим: Запуск IPFS под Windows


  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/<имя домена>


Публикацию через ID нужно использовать когда сайт часто обновляется. IPFS клиент через который публикуется контент должен быть постоянно включен или выключаться на небольшие промежутки времени. За день offline у меня клиент забыл привязку id -> мультихеш. Видимо привязка храниться только в DHT.


Если данные условия не подходят можно использовать мультихеш.


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


Проверка


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


    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


    Это будут перманентные ссылки. Этот способ подойдёт для публикации редко изменяющегося содержимого. В данном случае сразу доступен мультихеш содержимого и оно сразу будет доступно если есть его копия в IPFS сети.


    Соответственно в данном способе публикации при обновлении содержимого сайта нужно обновлять и DNS запись.



Локальный шлюз


Для того чтобы пользователи автоматически подключались к сайту через локальный шлюз я предлагаю добавить 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"
}

Альтернативный вариант: Переключаем свой сайт на localhost (локальный шлюз IPFS)


Глобальный шлюз


Можно использовать IPFS хостинг. Для этого надо добавить две записи в DNS.


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

@ CNAME gateway.ipfs.io

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


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


Заключение


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


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


Сделал свой релиз клиента с исправлениями:


  1. Совместимость с punycode.
  2. Etag для всех GET запросов.
  3. Правильное определение скрытых файлов в Windows.

Источники


  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

Продолжение


Хостим сайт в межпланетной файловой системе IPFS под Windows

Tags:
Hubs:
Total votes 21: ↑20 and ↓1+19
Comments23

Articles