Использование web3.storage, GitHub Actions и IPNS

Эта статья является обновленной версией моего «Руководства по размещению веб-сайтов на IPFS».



За время, прошедшее с момента публикации этой статьи, я оптимизировал свой подход и сократил процесс обновления моего веб-сайта до трех команд:

  1. git push
  2. gh run view -v
  3. w3 name publish <KEY_ID> <CID>

Магия этой установки исходит из:

  1. Использование действия GitHub для отправки сайта в IPFS через web3.storage
  2. Использование IPNS, чтобы избежать ручного изменения DNS-ссылки.

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

Настройка web3.storage

Чтобы упростить отправку контента в IPFS, мы собираемся использовать web3.storage, созданный той же командой, что и IPFS и Filecoin.

Web3.storage позволяет загружать неограниченное количество данных в IPFS и заботится о закреплении данных на нескольких серверах за вас, и это здорово!

Перейдите на https://web3.storage для создания учетной записи:

Создать токен API web3.storage

Чтобы отправить контент в web3.storage из командной строки и из GitHub Actions, нам понадобится токен API.

  1. Войдите в свою учетную запись web3.storage
  2. Нажмите «Учетная запись» вверху, а затем «Создать токен API».
  3. Введите описательное имя для вашего токена и нажмите «Создать».
  4. Вы можете нажать «Копировать», чтобы скопировать новый токен API в буфер обмена.

Не сообщайте никому свой ключ API, он предназначен только для вашего аккаунта. Вам также следует где-нибудь записать поле Token и надежно сохранить его.

Установите интерфейс командной строки w3

w3 интерфейс командной строки (CLI) позволяет нам взаимодействовать с web3.storage из терминала. Это интерфейс командной строки на основе узлов, поэтому вам сначала нужно установить node на свой компьютер.

Если вы используете Mac, вы можете легко установить node через homebrew.

brew install node

Это будет включать менеджер пакетов узла (npm), который мы будем использовать для установки w3 CLI.

npm install -g @web3-storage/w3

Теперь давайте проверим, установлен ли w3, с помощью следующей команды:

w3 --help

Это отобразит все доступные команды.

Теперь, когда мы знаем, что CLI установлен, запустите команду token, чтобы подключить CLI к web3.storage.

w3 token

Затем вам будет предложено вставить токен API.

Это токен API web3.storage, созданный в предыдущем разделе.

⁂ API token saved означает, что CLI был успешно связан

Поместите файлы в web3.storage

Если вы посмотрите на команду, доступную в w3, вы увидите команду с именем put.

Как вы, наверное, догадались, именно так мы «закладываем» контент в IPFS.

w3 put <path>

В качестве простого примера создайте текстовый файл с сообщением следующим образом:

echo "Hello web3.storage" > hello.txt

Теперь давайте воспользуемся командой put, чтобы отправить файл в IPFS:

w3 put hello.txt --name hello

--name hello сообщает команде имя файла hello в web3.storage.

Выводится идентификатор контента (CID), а также ссылка на публичный шлюз.

https://dweb.link/ipfs/bafybeifzoby6p5khannw2wmdn3sbi3626zxatkzjhvqvp26bg7uo6gxxc4

Если вы точно выполнили описанные выше шаги, то ваш CID должен быть идентичен моему. Помните, что CID — это хэш, который однозначно идентифицирует содержимое.

Точно так же мы можем загружать папки. Просто укажите в команде put путь к каталогу, который вы хотите загрузить.

Позже в этом посте мы будем использовать действие GitHub для автоматизации этого шага размещения.

Создайте IPNS-адрес

CID неизменны и не могут быть изменены. Межпланетная система имен (IPNS) решает эту проблему с помощью изменяемых имен, которые представляют собой хэш открытого ключа. Вы можете думать об IPNS-адресе как об указателе на CID.

Вы можете создать IPNS-адрес с помощью w3 с помощью следующей команды:

w3 name create

Ваш адрес будет отображаться, но вы всегда можете использовать w3 name list для отображения имени. Тем не менее, я бы все равно записал адрес и сохранил его где-нибудь.

Чтобы связать CID с адресом IPNS, мы используем команду publish, как показано ниже:

w3 name publish <key_id> <cid>

<key_id> — это ваш IPNS-адрес (то, что отображается create name list), а <cid> — это то, что мы связываем с адресом.

На данный момент не беспокойтесь о привязке CID к вашему IPNS-адресу. Мы сделаем это позже.

Настройка репозитория GitHub / действий GitHub

Создайте репозиторий GitHub для хранения кода вашего сайта. Если это веб-страница человека, я предлагаю назвать репозиторий <account_name>.github.io, что позволит вам также использовать GitHub Pages.

С вашей настройкой репо давайте добавим действие, которое отправляет репо в web3.storage каждый раз, когда мы используем git push

Поместите следующий фрагмент кода в .github/workflows/web3_storage.yaml вашего репозитория:

Строка ${{ secrets.WEB3_STORAGE_TOKEN }} считывает ваш токен API, так действие знает, что нужно нажать на вашу учетную запись.

Сохраните токен API в GitHub, выполнив следующие действия:

  1. Войдите в свой аккаунт GitHub
  2. Перейдите в настройки
  3. Тогда секреты
  4. Нажмите «Действия», а затем «Новый секрет репозитория».
  5. Ваш токен должен быть названWEB3_STORAGE_TOKEN
  6. Скопируйте токен API web3.storage, который мы создали ранее, в поле

Теперь каждый раз, когда вы запускаете git push, действие будет запускаться, и ваше репо будет загружаться в IPFS. Если вы попробуете это, у вас должна появиться зеленая галочка ✅, означающая, что ошибок не было.

Нажмите на галочку, чтобы просмотреть подробности действия. Это отобразит CID и URL-адрес шлюза (это то, что делают последние две строки в действии).

Использование интерфейса командной строки GitHub

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

Интерфейс командной строки GitHub не является неотъемлемой частью установки, но позволяет вам просматривать результаты своих действий в терминале.

На Mac мы можем установить gh CLI с помощью homebrew следующим образом:

brew install gh

См. документацию по установке на другую ОС.

Перейдите на https://github.com/settings/tokens, чтобы создать токен доступа. Подробности шагов вы можете найти в документации. Обратите внимание, что этот токен отличается от токена web3.storage, который мы создали ранее. Это сделано для того, чтобы интерфейс командной строки GitHub мог взаимодействовать с вашей учетной записью GitHub.

Получив токен доступа, выполните следующую команду:

gh auth login

Вам будет предложено ввести токен аутентификации GitHub.

Мы можем использовать команду gh для просмотра информации о действиях, которые мы выполняем:

gh run view -v

Вы должны запустить эту команду из каталога с удаленной установкой git, иначе вы получите сообщение об ошибке: «не удалось определить базовый репозиторий: не найдено ни одного удаленного репозитория git»

Флаг -v здесь включает подробный вывод. В противном случае вас встретит сообщение «Для получения дополнительной информации о задании попробуйте: gh run view…»

Выберите рабочий процесс, который вы хотите просмотреть, и результат откроется в инструменте разбиения на страницы.

Это отображает выходные данные действия GitHub, в частности CID.

Вы можете открыть репозиторий с помощью gh repo view username/repo --web, если хотите скопировать CID с веб-страницы.

Теперь, когда мы знаем наш CID, давайте свяжемся с IPNS-адресом, который мы создали ранее.

Привязать CID к IPNS

Чтобы связать CID с адресом IPNS, используйте следующую команду:

w3 name publish <key_id> <cid>

Обратите внимание, что <key_id> — это IPNS-адрес, а <cid> — это CID из последнего раздела.

Преимущество этого в том, что IPNS-адрес можно изменить. Это означает, что после обновления веб-сайта адрес может указывать на обновленный CID.

Наконец, давайте настроим DNSLink с нашим IPNS-адресом.

Настройка DNS-ссылки

У вас должен быть собственный домен, приобретенный через провайдера DNS. Я использовал Cloudflare, но должен работать любой провайдер.

Идея здесь состоит в том, чтобы наш личный домен извлекал содержимое из URL-адреса шлюза, но мы должны сообщить ему IPNS-адрес для извлечения.

Инструкции по подключению DNS с помощью Cloudflare

  1. Войдите в CloudFlare
  2. Нажмите на свой активный веб-сайт, а затем на DNS в левой колонке.
  3. В разделе управления DNS добавьте записи TXT и CNAME.
  4. Установите для имени записи TXT значение _dnslink.yourwebsite.com (примечание: обязательно замените yourwebsite.com своим собственным доменом).
  5. Установите для содержимого записи TXT значение dnslink=/ipns/<key_id> (примечание: <key_id> – это ваш IPNS-адрес.
  6. Установите запись CNAME для любого шлюза IPFS (например, gateway.ipfs.io )

В качестве примера, вот скриншот моих записей TXT и CNAME:

Связывание DNS необходимо выполнить только один раз с изменяемым IPNS-адресом.

Что здесь происходит

Что мы только что сделали, так это связали наше доменное имя (которое размещено на центральном сервере) с сервером шлюза. Этот сервер шлюза (который также является централизованным сервером) извлекает запрошенный нами контент из сети IPFS (которая децентрализована).

Таким образом, ваш сайт псевдоразмещен на IPFS. Сервер шлюза централизован, и ваш сайт будет неактивен, если этот сервер выйдет из строя.

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

Последние мысли

Я думаю, что максимально упростил процесс. Этот подход устраняет необходимость обновлять CID в ссылке DNS, и все можно выполнить из командной строки с помощью всего трех команд.

Три команды для обновления веб-сайта

  1. git push : обновляет репозиторий и переводит сайт в IPFS.
  2. gh run view -h : это для просмотра нашего CID
  3. w3 name publish <key_id> <cid> : обновляет ссылку IPNS

Подход требует некоторого времени для настройки, но я думаю, что это стоит затраченных усилий.

Я открыт для предложений, если у кого-нибудь есть способы улучшить этот рабочий процесс.

Акронимы

  • Межпланетная файловая система (IPFS)
  • Межпланетная система именования (IPNS)
  • Идентификатор контента (CID)
  • Система доменных имен (DNS)
  • Интерфейс командной строки (CLI)