Публікуємо сайт в міжпланетної файловій системі 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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.