Разворачиваем статический веб-сайт в IPFS

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

Для начала я в двух словах объясню в чём состоит различие между динамическими и статическими веб-сайтами.

У динамических веб-сайтов за отдачу содержимого отвечает какая-то программа. Обычно такие программы пишутся на одном из языков вроде PHP, JavaScript, Python, Go и других. Запрос от браузера пользователя обслуживается веб-сервером, который перенаправляет его программе, а программа в ответ на лету генерирует какую-то html-страницу, которая возвращается пользователю. В теории, запросы к одному и тому же адресу от разных пользователей могут получать разные ответы. Такой подход оправдан в случае если действительно есть необходимость отдавать разным пользователям разный контент при запросе одних и тех же страниц. Например, в социальных сетях одна и та же страница новостей для разных пользователей содержит разные новости.

В случае статического веб-сайта, все html-файлы заранее созданы и лежат в файловой системе сервера. Все запросы к сайту также обслуживаются веб-сервером, но он, минуя другие программы, отдаёт html-файлы с диска. Таким образом, все пользователи получают абсолютно одинаковые ответы на запросы к одинаковым адресам. Это максимально простой, быстрый и надёжный способ раздавать данные, который подходит для блогов вроде этого (хотя есть и куда более сложные сценарии использования статических сайтов). Dynamic site vs static

IPFS – это распределённое хранилище и оно не способно обслуживать динамические сайты, однако вполне подходит для статических. Фактически, статический веб-сайт это просто директория с набором html-файлов, css, скриптов и картинок. Чтобы разместить такой сайт в IPFS достаточно добавить эти файлы в систему командой вида ipfs add .... Однако есть несколько важных нюансов, о которых я бы хотел рассказать.

Для того чтобы сделать статический веб-сайт доступным в IPFS нужно выполнить 4 шага:

  1. запустить ipfs daemon,
  2. в html-файлах использовать относительные ссылки на локальные ресурсы,
  3. добавить dnslink,
  4. использовать IPNS и включить его автоообновление.

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

Читать дальше ➠

Html-представление этого блога генерируется с помощью генератора статических сайтов Hugo и темы оформления Frühling, которую я сделал специально для себя. Несколько дней назад я опубликовал её как отдельный проект под лицензией MIT на themes.gohugo.io и на Гитхабе. Теперь любой желающий может переиспользовать её для своих целей. Упрощенная демо-версия блога построенного с использованием этой темы доступна на Github Pages.

Перенёс этот блог с Друпала на Хьюго

Небольшое лирическое вступление

Я уже не помню точно когда я сделал первую версию этого блога, но доменное имя romka.eu я зарегистрировал 10 августа 2006 года, 17 лет назад =8) Все эти 17 лет блог работал на CMS Drupal. Опять-таки, я уже не помню, на какой версии Друпала была сделана его первая версия, вполне вероятно, что это была версия 4.7. Версия упомянутая в этом блог-посте уже, скорее всего работала на пятёрке, а затем, позднее, по мере выхода новых релизов, я обновил блог до шестёрки и семёрки.

Примерно с 2007 по 2014 год я профессионально (в смысле, за деньги) занимался веб-разработкой и Друпал был моим основным рабочим инструментом. Не могу сказать, что работа с этой системой это ценный профессиональный опыт, но чего совершенно точно нельзя отрицать, так это того, что без участия в Друпал-сообществе не случилась бы та цепочка событий, которая сегодня привела меня туда где я есть. Семинары и конференции по Друпалу, новые знакомства, работа в forbes.ru (полученная в том числе благодаря моей самоуверенности в том, что друпальщика лучше меня ребятам просто не найти), а затем и в Яндексе, всё это скорее всего не произошло бы, если бы я тогда, году в 2006 не заинтересовался Друпалом. Я как-нибудь напишу эту историю подробнее, думаю, она может получиться интересной, но этот пост не об этом.

Обновление

Уже почти 10 лет как я не работаю с Друпалом и я давно хотел с него съехать. Используемый им стек технологий постоянно требовал внимания к себе: админка Друпала была красной от предупреждений о найденных уязвимостях для модулей, обновления к которым не выходили последние как минимум лет 5; спамеры находили всё новые и новые способы зафлудить БД бесполезными мусорными комментариями. Сайт работал на давно устаревшей Ubuntu 14.04, обновление которой потянуло бы за собой и обновление основных зависимостей Друпала: версии PHP и связанных с ним библиотек. В общем, сайт причинял головную боль, а разбираться со всем этим мне было уже совсем не интересно. Да и, кроме всего прочего, мне стали очевидны две вещи:

  1. мне не нужна такая сложная CMS для такого простого блога,
  2. я хочу, чтобы весь созданный мною контент представлял из себя простое дерево директорий, где каждый материал это одна директория, содержащая и текст, и связанные с ним фотографии и другие файлы. С таким подходом для просмотра содержимого не нужен ни веб-сервер, ни тем более БД и интерпретатор PHP.

Собственно, по этой причине я перенёс этот блог на статический генератор сайтов Hugo. Исходники блога лежат на Гитхабе (например, вот так выглядит этот пост), а из них Хьюго генерирует html-файлы, которые раскладываются на арендуемый мною сервер на Digital Ocean, а также на два CDN: netlify.com и render.com. Зеркала этого сайта на этих двух CDN доступны по адресам mirror1.romka.eu / romka-eu.onrender.com и mirror2.romka.eu / nimble-figolla-e0e98e.netlify.app. Для того объема контента, который у меня есть, использование этих CDN бесплатно, так что возможно, со временем, один из них может стать основным хостингом для этого блога.

Для сайта я сделал свою собственную тему оформления frühling, пока она распространяется только как часть этого блога, но позднее, когда я завершу её разработку, я планирую выложить её отдельным проектом.

Читать дальше ➠