- PVSM.RU - https://www.pvsm.ru -
InterPlanetary File System — это новая децентрализованная сеть обмена файлами (HTTP-сервер, Content Delivery Network [1]). О ней я рассказывал в статье "Межпланетная файловая система IPFS" [2].
Прошло некоторое время от начала моих экспериментов с простых сайтов в IPFS. Запустил я свой IPFS клиент под Windows и у меня есть теперь что дополнить к предыдущей статье "Публикуем сайт в межпланетной файловой системе IPFS" [4]
Необходимо создать ярлык на ipfs.cmd файл в свойствах которого поменять шрифт на Lucida Console. Это даст возможность переключиться на UTF-8.
Хочется видеть какие запросы приходят к нашему клиенту. Используем командный файл. Он настроит вывод консоли, переменные и при помощи findstr или grep отфильтрует вывод IPFS клиента.
Файл: ipfs.cmd
rem Переключаем на UTF-8 (>= Windows 7)
chcp 65001
rem Выключаем цветной лог который не работает в консоли Windows
SET IPFS_LOGGING_FMT=nocolor
rem |-D - включает режим DEBUG в котором в консоль выводится информация о работе клиента
rem |listening - покажет открытые порты
rem |namesys - покажет процесс разрешения домена
rem |path - покажет конечный путь куда обращается клиент
ipfs.exe daemon -D 2>&1|findstr "listening namesys path" 2>nul
pause
В Windows XP есть особенность что попытавшись переключить на utf-8 в командном файле выполнение сразу завершается. Методом проб и ошибок мне удалось переключить кодировку в командном файле.
Решение: start "utf-8" /B cmd /C chcp 65001
Нам понадобится Grep for Windows [15]. Findstr вырубается при включенном UTF-8 от первой строки в которой присутсвуют символы кирилицы. Ну и отображает за место них точки.
Файл: ipfs.cmd
rem Переключаем на UTF-8 (Windows XP)
start "utf-8" /B cmd /C chcp 65001
rem Выключаем цветной лог который не работает в консоли Windows
SET IPFS_LOGGING_FMT=nocolor
rem |-D - включает режим DEBUG в котором в консоль выводится информация о работе клиента
rem |listening - покажет открытые порты
rem |namesys - покажет процесс разрешения домена
rem |path - покажет конечный путь куда обращается клиент
ipfs.exe daemon -D 2>&1|grep "listening|namesys|path" 2>nul
pause
В IPFS нет настраиваемой страницы 404. Мы её можем имитировать при помощи appcache.
Файл: manifest.appcache
CACHE MANIFEST
# 2017-03-29 v1.0
# Записываем в кеш 404.html
CACHE:
404.html
# Назначаем её ответом в случае получения 404 от сервера
FALLBACK:
/ 404.html
# Разрешаем всё остальное грузить с сервера
NETWORK:
*
При использовании appcache нельзя устанавливать заголовок Expiries для страниц на которых объявлен manifest.appcache и ресурсов указанных в манифесте в разделе CACHE. При обновлении файла manifest.appcache Firefox "обновляет" файлы указанные в манифесте из собственного кэша чем оставит старые файлы с обновлённым манифестом.
На страницах нельзя указывать в теге base <base href="https://домен/" /> который ведёт на другой домен. Firefox дополняет путь к файлу манифеста значением свойства href тега base и блокирует загрузку manifest.appcache если он на другом домене или протоколе (http -> https).
Другие нюансы: "Основные ловушки при использовании кэша в HTML5-приложениях" [16]
Внешние ресурсы страницы должны быть указаны относительными путями. Содержимое сайта в IPFS может быть загружено с множества разных url разной степени вложенности.
http://домен/страница.html
http://ipfs.io/ipns/домен/страница.html
http://ipfs.io/ipns/мультихеш_публичного_ключа/страница.html
http://ipfs.io/ipfs/мультихеш_каталога/страница.html
и даже так
http://ipfs.io/ipfs/мультихеш_файла
Для последнего случая лучше включать css и js в страницу. Либо включить скрипт который обработает данный случай и выставит правильные ссылки на ресурсы и страницы.
Также вместо "ipfs.io" или домена в адресе может быть:
localhost:8080127.0.0.1:8080[::1]:8080В итоге у нас получится такая страница.
Файл: index.html
<!doctype html>
<!-- Используем относительный путь в manifest -->
<html manifest="manifest.appcache">
<head>
<meta charset="utf-8" />
<title>Мой сайт</title>
<script>
if (window.location.hash.substr(1,8) == "magnet:?"){
var magnet = document.location.hash.substr(9)
// Используем относительный путь в скриптах
setTimeout(function() {window.location.replace("magnet-converter/#magnet:?"+magnet);}, 0);
}
</script>
</head>
<body>
<!-- Используем относительные пути в href -->
<a href="magnet-converter/">magnet converter</a>
<a href="gravity/gravity.svg">gravity</a>
<a href="https://github.com/ivan386?tab=repositories">All projects</a>
<!-- Используем относительные пути в src -->
<img src="imgs/stars-static.svg" style="display: block; width: 100%" />
</body>
</html>
Не обязательно использовать IPFS клиент как HTTP-сервер. Можно использовать любой HTTP-сервер который будет отдавать содержимое сайта если у посетителя не установлен IPFS клиент. В IPFS можно загрузить зеркало этого сайта.
Рассказал что вспомнил. Надеюсь это не мало. Есть идея по реализации дедупликации и ускорения классического интернета за счёт IPFS. Надеюсь рассказать об этом в будущих статьях с рабочими примерами.
Автор: ivan386
Источник [22]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/cdn/251286
Ссылки в тексте:
[1] Content Delivery Network: https://ru.wikipedia.org/wiki/Content_Delivery_Network
[2] "Межпланетная файловая система IPFS": https://habrahabr.ru/post/314768/
[3] хостингом: https://www.reg.ru/?rlink=reflink-717
[4] "Публикуем сайт в межпланетной файловой системе IPFS": https://habrahabr.ru/post/316468/
[5] Image: https://habrahabr.ru/post/325176/
[6] Перед стартом: #pered-startom
[7] Запуск IPFS под Windows: #zapusk-ipfs-pod-windows
[8] Для Windows 7 и новее: #dlya-windows-7-i-novee
[9] Для Windows XP: #dlya-windows-xp
[10] 404 Not Found (manifest.appcache): #404-not-found-manifestappcache
[11] URL Относительные пути к ресурсам: #url-otnositelnye-puti-k-resursam
[12] IPFS как зеркало: #ipfs-kak-zerkalo
[13] Заключение: #zaklyuchenie
[14] Источники: #istochniki
[15] Grep for Windows: http://gnuwin32.sourceforge.net/packages/grep.htm
[16] "Основные ловушки при использовании кэша в HTML5-приложениях": https://habrahabr.ru/company/paysto/blog/254619/
[17] ipfs command reference: https://ipfs.io/docs/commands/
[18] Documentaion for logging?: https://github.com/ipfs/go-ipfs/issues/2692
[19] grep в Windows? Легко!: https://habrahabr.ru/post/71568/
[20] Что такое grep и с чем его едят: https://habrahabr.ru/post/229501/
[21] Using the application cache: https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache
[22] Источник: https://habrahabr.ru/post/325176/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.