Бессерверный статический сайт с помощью IPFS

    TL;DR: IPFS позволяет хостить статические сайты распределённо, доступ к которым можно осуществлять через публичные кеширующие гейты (прозрачные реверс-прокси) в интернете, без необходимости устанавливать программу посетителю. Такие сайты можно раздавать без маршрутизируемого («белого») статического IP-адреса (будет работать за NAT), они остаются работоспособными при кратковременном (несколько часов) отсутствии раздающих, за счет кеша на гейтах. К гейтам по желанию можно привязать свой домен, причём добавить DNS-записи можно на несколько гейтов одновременно, для повышения надёжности и балансировки нагрузки. Сайт могут скачать другие пользователи IPFS и помочь с раздачей.
    IPFS отлично подходит для статических блогов, простых сайтов, файловых архивов (в качестве замены Bittorrent), а также просто для единовременной передачи больших файлов без предварительной загрузки их на какой-либо сервис.

    Что такое IPFS?

    IPFS — децентрализованная пиринговая система передачи файлов, по принципу работы похожая на BitTorrent, но с возможностью доступа через HTTP, для Web. Все скачиваемые пользователем файлы временно кешируются IPFS-демоном и раздаются другим пользователям, запрашивающим их. Важные файлы можно «прикрепить» (pin) к IPFS-демону, тогда они не исчезнут из кеша.
    Добавляемые в IPFS файлы получают глобальные хеши-идентификаторы, которые не меняются при повторном добавлении файла. Адресация в сети осуществляется по идентификаторам контента (CID), внутри которых содержится мультихеш. В контексте IPFS, они указывают на неизменяющийся или изменяющийся файл, директорию, метаданные или симлинк.

    На текущий момент развития, проект полноценно работает только со статическими данными, но уже имеется экспериментальная поддержка протокола типа издатель-подписчик (publish/subscribe), а также реализация IPFS на Javascript, работающая в браузере, что в перспективе позволит создавать динамические сайты (например, блоги с комментариями) с возможностью взаимодействия в реальном времени (например, чаты).

    Одно из серьезных преимуществ IPFS в сравнении с другими подобными технологиями — доступ к ресурсам из интернета через гейты, которые устанавливают компании и энтузиасты технологии. Они позволяют просматривать сайты и скачивать файлы без установки IPFS на компьютер. Самый большой гейт — от Cloudflare, он также позволяет выпустить бесплатный HTTPS-сертификат для домена.

    Зачем нужен IPFS, и где его применять?

    Сеть позволяет эффективно, распределённо и децентрализованно раздавать и скачивать данные, в том числе из браузера. Я вижу следующие реальные применения проекту:

    1. Бесплатный бомж-хостинг статических веб-сайтов на домашнем компьютере, без выделенного IP-адреса (за NAT), без домена или с доменом;
    2. Не подконтрольный цензуре хостинг сайтов повышенного риска, которые могут быть заблокированы государством или сторонними компаниями в рамках DMCA;
    3. Раздача периодически меняющихся или добавляющихся данных, которые нельзя эффективно раздать через Bittorrent (придется постоянно пересоздавать torrent-файл и просить всех раздающих скачивать его заново, что ведёт к фрагментации сидов);
    4. Альтернатива CDN, не требующая настроек на стороне «CDN-провайдера».

    Как создать сайт в IPFS?

    Это проще, чем с обычным хостингом! Рассмотрим бомж-хостинг простого статического сайта.

    Самый простой вариант — с использованием графической утилиты Siderus Orion.
    Устанавливаем утилиту, запускаем, нажимаем File → Add Directory, выбираем директорию с файлами сайта.

    Через какое-то время появится окно с информацией импортированного контента:
    image

    Переходим во вкладку «Files», нажимаем правой кнопкой мыши на хеш → Open in browser:
    image

    Если всё было сделано правильно, сайт откроется через гейт siderus.com:
    https://siderus.io/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7/

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

    Альтернативный консольный вариант — скачиваем официальный клиент go-ipfs, распаковываем, инициализируем и запускаем так, как написано на сайте:
    ipfs init
    ipfs daemon

    Далее, добавляем нашу директорию с файлами сайта:
    ipfs add -r ./www.uncleoutrage.com
    …
    added QmXdaairbPoSGV98sQ3GsEuevVTE1EBUzZ4PhbLfKVh1nX www.uncleoutrage.com/images/fanart
    added QmdFbHdzzB4qBBkn8UsyHnjg1BKEtm9d5LaTyv5aZd8bbE www.uncleoutrage.com/images/gigs/thumbs
    added QmVPJ3Mr8gZL5x15A9XARC1uHASqb2JMsKTT7mWs37UmBo www.uncleoutrage.com/images/gigs
    added Qmd3AbVwMVE9W6ZSEuax96Xnymbnic4XVCdNEKBPZcWi5c www.uncleoutrage.com/images/live/thumbs
    added QmebUfmT2wmZMbJcAmSMS4cZJr4guTqV67xNJ3hiQGsLYx www.uncleoutrage.com/images/live
    added QmaEVaRiUUXfDnjjuXHGGsg7jDaFrCaxS7wi6q83q4N1uu www.uncleoutrage.com/images/misc/thumbs
    added QmW2ZivQF5eh5LHSLet298AhKCHiQsFV6rvUFvMcCkLopo www.uncleoutrage.com/images/misc
    added QmZXXn7abBvj7SvYJoYMAXUeajP6A1UABKENrNwuhKqofk www.uncleoutrage.com/images/promo/thumbs
    added Qmcx6bMKur4Anzh91bJC6o5vMPftzocSMmd7iYxoGwQrNX www.uncleoutrage.com/images/promo
    added QmW8P3ZnvKUytCWJF6y6wvBD8XAkk4bvJoVK8j3apokzLS www.uncleoutrage.com/images
    added QmXG1QjfpCjErQBGZvF6VWBryXe9WFLPqhrsGWtikACVwR www.uncleoutrage.com/js
    added QmYGXwLJBnqXwWYGKVtjZtmwncgwNoqNmnYqo1NTinTGBp www.uncleoutrage.com/theband/misc/pages
    added QmWg4JyZ4ox9hcHt6JGBfzUm5CqWsb6DixUksamFvbirH4 www.uncleoutrage.com/theband/misc
    added QmPtn9XBhWqe7A1z3ikktWExSPSM27LTzUL3US9N5xcAPB www.uncleoutrage.com/theband/redsaug21/pages
    added QmaGV6kfLdL1bKGBBHYJLDVstiejAANayBZt16NMF9g9j9 www.uncleoutrage.com/theband/redsaug21
    added QmScmcUAdC5pinMxaoLuXSy3FDUAX5E68dADnGjYZbPUiY www.uncleoutrage.com/theband
    added QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7 www.uncleoutrage.com

    Последний хеш — хеш директории, он нам и нужен.

    Составляем ссылку для открытия директории через гейт вручную, вида:
    https://домен/ipfs/хеш

    Например:
    https://cloudflare-ipfs.com/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7

    Как привязать IPFS-хеш к домену?

    Чтобы сделать веб-сайт доступным по домену https://uncleoutrage.com/, а не по длинной и некрасивой ссылке, необходимо добавить несколько DNS-записей:

    1. A и AAAA-записи, указывающие на IP-адрес гейта, либо CNAME-запись, указывающую на доменное имя гейта;
    2. TXT-запись "_dnslink", с содержимым вида «dnslink=/ipfs/HASH».

    В моём случае, я добавил A и AAAA-записи, указывающие на IP-адреса cloudflare-ipfs.com, и TXT-запись "_dnslink.uncleoutrage.com":
    uncleoutrage.com.  IN  A 104.18.252.167
    uncleoutrage.com.  IN  A 104.18.255.167
    uncleoutrage.com.  IN  AAAA 2400:cb00:2048:1::6812:fda7
    uncleoutrage.com.  IN  AAAA 2400:cb00:2048:1::6812:40a8
    _dnslink.uncleoutrage.com. IN TXT "dnslink=/ipfs/QmU8rJjkXbfkPqEE3Dr8GiUMKF1vPnnNUKWdaB5DsZDfJ7"

    У Cloudflare можно получить HTTPS-сертификат для привязанного домена, его нужно запросить на специальной странице получения сертификата.
    Если вам не нужна поддержка HTTPS, вы можете добавить сразу несколько A/AAAA-записей на разные гейты, актуальный список рабочих гейтов доступен на форуме проекта.
    В случае обновления сайта, вам придётся обновить и TXT-запись домена.

    Как не обновлять TXT-запись при обновлениях сайта?

    IPFS позволяет сгенерировать специальный статичный хеш-идентификатор, указывающий на изменяющийся хеш — IPNS. В графическом клиенте достаточно нажать File → Publish to IPNS, и указывать в ссылке или в TXT-записи домена свой peer ID, а не хеш, полученный при добавлении директории. Например:
    https://cloudflare-ipfs.com/ipns/QmV97DGqaaTVn54RH9CLTi9hxXfr57gJQ4zGtyHcVbtfH6

    Однако, IPNS-запись нужно обновлять (публиковать) раз в несколько часов вручную, и резолвятся они заметно медленнее /ipfs/.

    К слову, IPNS умеет резолвить не только CID, но и dnslink-записи домена — сайт можно открыть по ссылке вида https://cloudflare-ipfs.com/ipns/uncleoutrage.com.

    Заключение

    Если вы хотите узнать больше об IPFS — читайте цикл отличных статей ivan386. Они гиковские, и в них почти не рассказывается, зачем обычному человеку может потребоваться IPFS (иначе этой статьи бы не было).

    Хотите помочь в раздаче IPFS-сайтов, или быть информированным о том, что домен привязан к IPFS-гейту? Устанавливайте браузерное дополнение (для Firefox, для Chrome), переадресующее IPFS-сайты на вашу локальную ноду.

    Антизапрет уже несколько месяцев раздает терабайт PAC-файлов в сутки через IPFS, с использованием гейта Cloudflare. Работает стабильно, значительно экономит трафик сервера.
    Share post

    Similar posts

    Comments 32

      +2
      Хочу отметить, что IPFS не является анонимной сетью, то есть, имея ссылку на данные, можно узнать IP узлов, которые хранят данные. К счастью, есть версия IPFS для I2P, которая позволяет скрыть физическое местонахождение нод, таким образом затрудняя цензуру.
        0
        Как и Bittorrent. Для IPFS существуют транспорты, например, есть транспорт для Tor: github.com/OpenBazaar/go-onion-transport
        Разработчики IPFS не хотят интегрироваться с анонимными сетями до того, как пройдут аудит безопасности.
        Я не слышал о версии IPFS для I2P. Где её взять?
        0
        Не подконтрольный цензуре хостинг сайтов...

        Просто будут блокировать публичные гейты целиком.

          +2
          Да, для РКН не проблема заблочить весь Cloudflare.
            +1
            Имелся в виду хостинг сайтов без гейтов, конечно. Гейт — временный костыль, пока пользователь не поставит себе IPFS-демон и расширение в браузер, а как поставит — блокировки не страшны.
              +1
              пока пользователь не поставит себе IPFS-демон
              И тогда его можно будет ещё и за пособничество нарко-педо-экстримизму прижать… По числу сайтов в системе.
                +1
                А когда доделают JS-IPFS, можно будет ему прямо на страницу браузера демон инжектить, при заходе на сайт!
                  0

                  Отличная новость!
                  Из мира ethereum swarm ее не увидел. Спасибо!

            0
            О спасибо.
            Давно хотел сделать сайт на IPFS
              +1
              Посмотрите еще проект ZeroNet, он позволяет создавать динамические распределенные сайты, гибко управлять доступом, для него есть готовые движки блогов, форумов, чатов, видеохостингов, GIT-репозиториев, есть своя распределённая почта, провайдеры регистрации и аутентификации (а-ла oauth), классный интерфейс, и возможность работы через Tor.
              Одна проблема — он не приспособлен для доступа через гейты, и в него есть всего два рабочих.
              proxy.zeronet.a0z.ru
                0
                Если вкратце, то можно ли на его основе сделать распределённый форум тиба хабра чтобы клиентами были телефоны?
                  +1
                  Да, там движок распределенных блогов уже есть — ZeroMedium, аналог medium.com. Он как бы объединяет множество разрозненных блогов, принадлежащих разным людям, в единый интерфейс, с помощью технологии объединения сайтов merger sites.
                  В Play Store есть ZeroNet, должен работать.
                    0
                    Почитал про ZeroNet. Если я правильно понял, это способ сделать свой блог, опубликовать его хеш через торрент-трекер и позволить другим найти и скачать этот блог по его хешу. Всё написано на питоне. Возможности редактировать блог сообща там нет.

                    То о чём я думаю это немного другое. Есть у нас каталог книг вроде либрусека. Сами книги там не хранятся, только их описание и комментарии к ним. Есть модераторы и админы, но их список не прибит гвоздями, а может меняться голосованием например. Может быть вообще так, что каталог книг есть, а модераторов нет и удалять ничего нельзя. Нет даже админа с приватным ключом который мог бы что то поменять. Судя по всему в рамках ZeroNet такую штуку сделать нельзя.
                      0
                      Можно, конечно. Посмотрите, как устроена система комментариев на том же ZeroBlogs, и сделайте аналогично.
                        0
                        > Would it be possible to allow multiple people to publish to a site using something like this?
                        > If you share the private key of the site then yes, its possible.
                        Так конечно можно, но тогда первый залетевший дятел разрушит цивилизацию. Это получится как общий FTP сервер где каждому надо дать права админа.
                          0
                          Не знаю, что вы цитируете, но то, что вы хотите сделать, можно сделать, не распространяя ключ сайта. Используйте технологию, которую используют комментарии.
              0
              Благодарю за статью. IPFS очень интересен.
                0
                Последнююю фразу статьи нужно было ставить первой. Большинство народу не почешется пока им денежкой не помашешь ;)

                Хотелось бы добавить альтернативную идею по развитию этого направления — на волне недавнего бана прона на тумблере, переезд всех заинтересованных в распределенные сети например одна из fediverse систем + хостинг собственно картинок в ipfs. При наличии халявных хостингов как в статье это все становится более-менее подьемным.
                  0
                  Он не «халявный», файлы всё-равно нужно где-то хранить. В IPFS планируется интеграция с Filecoin — криптовалютой, созданной для хранения файлов. Платишь небольшое количество валюты — твои файлы в IPFS хранит кто-то другой какое-то время.

                  Интересная концепция была у хостинга файлов glop.me — файлы загружались в IPFS в единую директорию, и любой мог периодически делать ipfs pin add директория, чтобы скачать себе все загруженные файлы и помочь в их хранении раздаче.
                  0
                  Однозначно плюс за статью и за популяризацию. IPFS это крутая идея, но им решительно не хватает денег и времени, поэтому разработка движется со скоростью улитки. Состояние дел на сегодня это два клиента — Go и JS — которые жрут память и CPU как не в себя, не очень умеют в NAT и JS версия делает DHT уже второй год. Всё делается крошечными шагами когда/если у разработчиков есть на это время.
                    0
                    go-ipfs с версии 0.4.18 больше не течёт, больше 600 МБ RAM не потребляет у меня, процессор особо не нагружает. NAT нормально пробивает, пробовал добавить уникальные файлы и открыть их через гейт — работает, хоть и первое открытие занимает десятки секунд.
                    0
                    И вновь встаёт вопрос об универсальных ссылках в браузерах.
                      0
                      Если у вас установлено браузерное расширение, то оно поймёт, что ссылка указывает на IPFS-хеш, и откроет её локальным демоном или работающим гейтом.
                      В перспективе будут использоваться схемы ipfs:// и dweb:/, см. github.com/ipfs/in-web-browsers/blob/master/ADDRESSING.md

                      Если вы хотите вставить, например, картинку, то в HTML5 можно указать несколько её источников с помощью тега source.
                        0
                        Спасибо. Я был неуклюж и случайно потёр пост, на который вы отвечали.
                          0
                          Текст был следующий:
                          Меня беспокоит такое обстоятельство. Я могу дать доступ к документу в ipfs через один из гейтов, например cloudflare-ipfs.com/ipfs/QmSUYxtRRHyCpTJn4RxU8vcj9T23wZmjxHke7mBjWkPu8u.
                          Но если cloudflare убьёт гейт, то все ссылки протухнут.
                          0
                          Нужно будет внимательно изучить эти методы.
                          P.S. Нет ли информации о том, собираются ли как-то стандартизовать эти решения с добавлением их непосредственно в браузеры в ближайшее время?
                      0
                      Учитывая тенденции к утолщению клиентов мб выстрелит.
                        0
                        Причём здесь это?
                          0

                          При том, что толстые клиенты означают, что меньше требуется сервер, так как всё делается в браузере, а ifps поддерживает только статику, значит что скоро сайт как youtube можно будет хостить у себя на роутере, который будет отдавать spa для всего мира, сам видосы да держать где-то в облаке.

                        0
                        Бывают реализации ipfs сервера на пхп, чтобы не свой комп держать выключенным, а например бесплатные шаред хосты?
                          0
                          Таких нет. На shared-хостингах, как правило, можно в том числе запускать любые процессы, и IPFS должен работать.

                        Only users with full accounts can post comments. Log in, please.