On the weekend with IPFS technology
Выходные с IPFS
byzoni12-17 minutes 28.02.2021Добавление файла размещает его на многих машинах, которые являются частью подключенного роя. Когда вы добавляете файл, вы получаете адрес. Этот адрес относится к файлу, а не к серверу, на котором он находится.
IPFS также имеет фиксированные шлюзы - машины, подключенные к IPFS, которые являются частью роя и помогают облегчить публикацию и выборку файлов в рое. Эти шлюзы также имеют Javascript API, позволяющий интерфейсным приложениям напрямую взаимодействовать с IPFS, опять же без сервера.
Передавая сеть сообществу, мы устраняем трение, вызванное обязательством одной организации умиротворить заинтересованные стороны или давлением со стороны различных форм власти.
Это довольно круто, и это очень просто, если вы немного измените представление о файловой системе.
План на выходные - настроить виртуальный частный сервер в качестве шлюза IPFS для размещения небольшого веб-сайта с доменом вроде https://ipfs.example.com
.
Эта статья предназначена для профессиональных разработчиков или любителей, интересующихся распределенной сетью, и мы рассмотрим…
- Настройка IPFS на сервере для создания шлюза
- Поддержание работы шлюза как службы
- Получение файлов и публикация файлов в IPFS
- Укажите доменное имя на общедоступном шлюзе и на нашем шлюзе
- Настройте SSL с помощью Let’s encrypt для nginx
- Обратный прокси-сервер шлюза с помощью nginx, перенаправьте запросы с веб-порта на внутренний порт, на котором работает IPFS.
- Конфигурация кеширования для нашего нового шлюза IPFS.
Установите IPFS на Ubuntu 20.04
Сначала убедитесь, что система обновлена, и установите tar и wget:
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install tar wget
Затем загрузите последнюю версию IPFS (вы можете проверить доступные версии здесь) и установите его:
$ wget https://dist.ipfs.io/go-ipfs/v0.8.0/go-ipfs_v0.8.0_linux-amd64.tar.gz
Распакуйте и переместите в извлеченную папку для установки:
$ tar xfv go-ipfs_v0.8.0_linux-amd64.tar.gz
$ cd go-ipfs
$ sudo ./install.sh
Обычно запускать общедоступную службу от имени пользователя root - не лучший вариант. Итак, создайте новую учетную запись пользователя для запуска IPFS и переключитесь на нее:
$ adduser ipfs
$ su ipfs
Проверьте версию и давайте инициализируем ipfs:
$ ipfs version
$ ipfs init --profile=server
Запишите результат. Идентификатор однорангового узла идентифицирует однорангового узла в отличие от контента, который будет опубликован одноранговым узлом, нам это понадобится позже.
initializing IPFS node at /ipfs/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmeQe5FTgMs8PNspzTQ3LRz1iMhdq9K34TQnsCP2jqt8wV
to get started, enter:ipfs cat /ipfs/QmVLDAhCY3X9P2uRudKAryuQFPM5zqA3Yij1dY8FpGbL7T/readme
Для некоторой радости вы можете сделать то, что он предлагает, и запустить нижеприведенный документ, который покажет вам документ readme IPFS.
$ ipfs cat /ipfs/QmVLDAhCY3X9P2uRudKAryuQFPM5zqA3Yij1dY8FpGbL7T/readme
Пока все хорошо, но мы хотим убедиться, что так и будет. Чтобы IPFS постоянно работала, мы должны настроить демон ipfs deamon &
для работы в фоновом режиме. Перейдем в систему и сделаем служебный файл:
$ exit
Создайте файл /etc/systemd/system/ipfs.service
с этим содержимым:
[Unit]
Description=IPFS daemon
[Service]
User=ipfs
Group=ipfs
ExecStart=/usr/local/bin/ipfs daemon --enable-gc
Restart=on-failure
[Install]
WantedBy=multi-user.target
Разрешите пользователю ipfs запускать долго работающие службы, включив задержку для этого пользователя:
$ sudo loginctl enable-linger ipfs
Включите и запустите службу:
$ sudo systemctl daemon-reload
$ sudo systemctl enable ipfs.service
$ sudo systemctl start ipfs.service
Теперь IPFS должна быть запущена и запускаться при загрузке сервера.
Давайте убедимся, что он восстановится после перезагрузки, а затем перезагрузимся, чтобы проверить это.
$ sudo reboot
Войдите в систему и проверьте активность с помощью
$ sudo systemctl status ipfs.service
Давайте наведем порядок, удалив файлы, которые мы скачивали и распаковывали.
$ rm -rf go-ipfs/
$ rm go-ipfs_v0.8.0_linux-amd64.tar.gz
Теперь убедитесь, что мы подключаемся к другим узлам роя.
$ su ipfs
$ ipfs swarm peers
и вы должны увидеть большой старый список сверстников! Ура! Потрясающие!
Другие члены роя также смогут выполнить ту же команду и увидеть наш шлюз в списке.
Время публиковать!
Так же, как когда мы настраиваем apache
или nginx
для веб-хостинга, я собираюсь создать папку с тем же именем, что и домен, который будет указывать на эту папку. Я назвал эту папку ipfs.example.com
, вы можете называть ее как хотите, но позже, когда у вас будет много сайтов, вы можете не знать, какой домен указывает на какую папку.
$ cd var/www/
$ mkdir -p ipfs.example.com
$ cd ipfs.example.com
Хорошо, давайте сделаем действительно крутой сайт. Все должно быть статичным, поэтому не более чем старый добрый HTML, JavaScript и CSS.
$ nano index.html
и скопируйте или сделайте что-нибудь получше:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Выходные с IPFS</title>
</head>
<body>
<h1>IPFS Magic! Ура!<h1>
<p>Вы запустили его за выходные! Ух!<p>
<img src = "cat.jpg">
</body>
</html>
Мы можем опубликовать это, выпрыгнув из папки
$ cd ../ && ls
Вы должны просто увидеть папку ipfs.example.com
, которую мы создали ранее. Теперь мы хотим добавить всю папку и ее содержимое в IPFS.
$ ipfs add -r ipfs.example.com
Это рекурсивно добавляет все содержимое папки ipfs.example.com
в IPFS. Вы должны увидеть примерно такой результат:
added Qmd286K6pohQcTKYqnS1YhWrCiS4gz7Xi34sdwMe9USZ7u ipfs.example.com/cat.jpg
added Qmd4kHTYwyZHZcDihK5JxrAVRwPb9FjDztMDknhPng7BM3 ipfs.example.com/index.html
added QmV8G4EzLq9AMvrw7f9kdjzdPsGefyjrCp6hnP7urWa8ED ipfs.example.com
IPFS сгенерирует хеш для каждого добавленного файла. В конце он предоставит вам хеш-код вашего сайта, это тот, который нас интересует.
QmV8G4EzLq9AMvrw7f9kdjzdPsGefyjrCp6hnP7urWa8ED
Ваш сайт теперь добавлен в IPFS. Вы можете просмотреть его сейчас на шлюзе ipfs.io
: https://ipfs.io/ipfs/QmV8G4Ez...
Или на своем локальном по адресу localhost:8080
. Или на любом другом шлюзе.
Вау, волшебство !!! Но подождите, если я хочу изменить сайт, этот хеш будет изменяться, и если я свяжу домен с хешем, он будет ломаться каждый раз, когда я меняю сайт. Что нам нужно сделать, так это связать хэш сайта с идентификатором партнера.
$ ipfs name publish QmV8G4EzLq9AMvrw7f9kdjzdPsGefyjrCp6hnP7urWa8ED
и вы получите два нижеприведенных хэша, которые теперь связаны между собой, первый хеш - это ваш идентификатор партнера, который мы сохранили ранее, а второй - хеш вашего сайта.
Published to QmeQe5FTgMs8PNspzTQ3LRz1iMhdq9K34TQnsCP2jqt8wV: /ipfs/QmV8G4EzLq9AMvrw7f9kdjzdPsGefyjrCp6hnP7urWa8ED
Для связывания однорангового идентификатора с файлом или папкой используются IPNS.
IPNS можно рассматривать так же, как DNS, домен, который не изменяется и может быть связан с любым IP-адресом. С IPNS у нас есть одноранговая идентификация, которая может быть связана с любым файлом или папкой. Обратите внимание, что теперь мы используем «ipns» (межпланетная система имен), а не «ipfs» (межпланетная файловая система), как мы делали это раньше по ссылке ниже.
https://ipfs.io/ipns/QmeQe5FT...
Так что даже если мы изменим сайт, эта ссылка всегда будет хорошей. А чтобы сменить сайт, нам просто нужно сделать…
$ ipfs add -r ipfs.example.com
$ ipfs name publish <THE HASH THAT WE GOT>
Примечание: объекты, добавленные с помощью
ipfs add
, по умолчанию закрепляются рекурсивно. Закрепление ipfs - это способ убедиться, что сборка мусора не удаляет объекты, которые вы хотите сохранить.
Давайте сделаем так, чтобы этот URL выглядел немного лучше, где бы вы ни приобрели свой домен, они предоставят вам панель управления, в которой вы можете редактировать свои записи DNS. В DNS давайте добавим запись TXT
на ipfs.example.com
и дождемся ее распространения.
dnslink=/ipns/QmeQe5FT...
Теперь мы можем перейти к https://ipfs.io/ipns/ipfs.example.com
лучше, но все же не самое лучшее, давайте добавим запись A
, указывающую на IP-адрес https://ipfs.io
$ ping https://ipfs.io
результат
$ 209.94.90.1
Итак, давайте укажем запись A
для ipfs.example.com
на 209.94.90.1
и снова подождем, пока она распространится.
В качестве альтернативы это можно сделать с помощью CNAME
для ipfs.example.com
, чтобы указать на gateway.ipfs.io
, что позволит избежать привязки к любому IP-адресу.
Теперь мы можем перейти на ipfs.example.com
.
Просто чтобы убедиться, что на сервер не полагаются, выключите его и снова запросите домен ipfs.example.com
, и вы обнаружите, что он все еще там!
Пока люди продолжают его запрашивать, он будет оставаться там, если его никто не запросит какое-то время, сборщик мусора узлов избавится от него. Если вы будете поддерживать свой сервер в рабочем состоянии, он всегда будет там.
Установите nginx с SSL-сертификатами Let’s Encrypt
Убедитесь, что система обновлена, и установите nginx
:
$ apt-get update
$ apt-get install nginx
Отредактируйте /etc/nginx/sites-available/default
server {
server_name example.com ipfs.example.com;
server_tokens off;
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Проверьте свою конфигурацию:
$ sudo nginx -t
Если все в порядке, перезагрузите nginx:
$ sudo systemctl restart nginx.service
Это будет проксировать все запросы к example.com
и ipfs.example.com
на наш IPFS шлюз, работающий на localhost:8080
, но без кеширования!
Установите Certbot
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx
Запустите Certbot
, чтобы получить сертификаты SSL
. Certbot
поддерживает nginx
и автоматически обновит ваш файл конфигурации.
$ sudo certbot --nginx -d example.com -d ipfs.example.com
Certbot попросит вас выбрать, является ли доступ HTTPS
обязательным или необязательным (выберите вариант «Безопасный»).
Чтобы повысить безопасность, обновите параметры Диффи-Хеллмана:
$ sudo openssl dhparam -out /etc/ssl/certs/dh_4096.pem 4096
Включите этот файл где-нибудь в блоке server
вашей nginx конфигурации /etc/nginx/sites-available/default
, например:
server {
...
ssl_dhparam /etc/ssl/certs/dh_4096.pem;
...
}
Опять же, проверьте свою конфигурацию:
$ sudo nginx -t
Если все в порядке, перезагрузите nginx:
$ sudo systemctl restart nginx.service
Срок действия сертификатов Let's Encrypt
истекает через 90 дней, поэтому у вас должны быть средства для их автоматического обновления. Crontab - хороший способ сделать это:
$ sudo crontab -e
Добавьте в конец файла следующую строку:
15 3 * * * /usr/bin/certbot renew --quiet
При этом certbot renew --quiet
будет запускаться каждый день в 3:15. Он проверяет, скоро ли истекает срок действия сертификатов (через 30 дней или меньше), и, если да, обновляет их.
Теперь, если вы перейдете на https://example.com
, вы должны увидеть веб-сайт, который вы добавили в IPFS выше.
Давайте попробуем заставить обратный прокси nginx правильно кэшировать ответ IPFS. Это не ускорит загрузку начального запроса страницы, но во всех последующих запросах он будет невероятно быстрым, так как будет поступать с локального диска.
Отредактируйте /etc/nginx/sites-available/default
Удалить эту строку
proxy_cache_bypass $ http_upgrade;
Добавить эту строку
proxy_cache STATIC;
proxy_cache_valid 200 1d;
proxy_cache_use_stale error timeout invalid_header updating
http_500 http_502 http_503 http_504;
Добавьте этот блок с истечением срока действия над существующим блоком сервера
# Expires map
map $sent_http_content_type $expires {
default off;
text/html epoch;
text/css max;
application/javascript max;
~image/ max;
}
В серверном блоке добавьте
expires $expires;
Затем отредактируйте nginx.conf
$ sudo nano /etc/nginx/nginx.conf
Под http, добавьте
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
Раскомментируйте
gzip_vary on;
Добавьте
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types text/plain application/x-javascript text/xml text/css;
Опять же, проверьте свою конфигурацию:
$ sudo nginx -t
Тест может завершиться неудачно, потому что некоторых папок не существует, поэтому добавьте те, на которые он жалуется, вручную и повторите попытку.
$ mkdir <folder name>
Затем перезапустите снова…
$ sudo systemctl restart nginx.service
Ура! Вернувшись на вкладку сети в Chrome Dev Tools
, html-файлы
проверяются на сервере и получают 304
без изменений, а изображение получает 200
из кэша памяти и быстро загружается.
Окончательная версия со шлюзом кеширования находится в сети здесь https://ipfs.example.com
. Если вы хотите сравнить его с отсутствием кеширования, вы можете посетить более медленный общедоступный шлюз по адресу https://ipfs.io/ipns/ipfs.example.com
.
Заключение
В мире, где секунды на счету, IPFS - отличный запасной вариант, но я бы не стал жертвовать потерей пользователей из-за более медленных или непостоянных скоростей по сравнению с резкими скоростями и безопасностью более крупной и предсказуемой облачной службы, которая также защищает вас от атак ddos. и выталкивание вашего контента на границы Интернета и что наиболее важно, отправка всех файлов в браузер одновременно.
Коментарі
Дописати коментар
Олег Мічман в X: «Donations and support for media resources, bloggers, projects, and individuals. https://t.co/HPKsNRd4Uo https://t.co/R6NXVPK62M» / X
https://twitter.com/olukawy/status/1703876551505309973