Запуск ноды IPFS на своём сервере

IPFS is the Distributed Web

A peer-to-peer hypermedia protocol to make the web faster, safer, and more open.

IPFS (InterPlanetary File System, межпланетная файловая система) — контентно-адресуемый, одноранговый гипермедийный протокол связи. Узлы IPFS-сети формируют распределенную файловую систему. IPFS является проектом с открытым исходным кодом, разработанным Protocol Labs при содействии open-source сообщества.

Официальный сайт: ipfs.io


Эта чудесная штука, нечто среднее между торрентами (bittorrent),  файлообменником (dc), репозиторием (git), блокчейном (blockchain) и вебом (http). Позволяет мгновенно опубликовать любой файл, откуда угодно и куда угодно, через Интернет, посредством распределённой сети. И соответственно, получить доступ к опубликованным файлам (и каталогам) как из самой сети так и через обычный веб, посредством специальных шлюзов. При это один и тот же файл нельзя опубликовать дважды, т.е. создать дубль, т.к. адресом файла (его названием) является мультихэш от содержимого. И конечно, вся сеть зашифрована и практически не поддаётся цензуре.

Установка и настройка IPFS ноды на сервере под ОС Debian 9

Данная статья не является единственным или наиболее верным руководством. Настоятельно рекомендую ознакомиться с официальной документацией: https://ipfs.io/docs

Установка IPFS

Начать следует с загрузки архива скриптов установки и обновления: https://dist.ipfs.io/#ipfs-update

cd /opt/
wget https://dist.ipfs.io/ipfs-update/v1.5.2/ipfs-update_v1.5.2_linux-amd64.tar.gz
tar -xvzf ipfs-update_v1.5.2_linux-amd64.tar.gz
cd ipfs-update/
./ipfs-update install latest

Упростим дальнейший ввод команд, добавив псевдоним. Таким образом мы обеспечим выполнение утилиты ipfs от пользователя www-data (наиболее подходящего для этого):
nano ~/.bashrc

alias ipfs='sudo -u www-data ipfs'

alias ipfs='sudo -u www-data ipfs'

Настройка IPFS

Настройка не сложная, но понимать её нужно. Файл конфигурации лежит здесь: /var/www/.ipfs/config

Выполним первичную инициализацию:
ipfs init
Зададим максимальный объём хранилища:
ipfs config --json Datastore.StorageMax '"10GB"'
Адрес API для доступа к веб интерфейсу:
ipfs config --json Addresses.API '"/ip4/0.0.0.0/tcp/5001"'
Адрес шлюза для доступа к сети:
ipfs config --json Addresses.Gateway '"/ip4/0.0.0.0/tcp/8080"'
Разрешённые заголовки API:
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]'
Адреса с которых разрешено администрирование:
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://АДРЕС-СЕРВЕРА:5001", "http://localhost", "http://127.0.0.1"]' ОСТОРОЖНО! Не открывайте наружу!
Пользовательский X-заголовок:
ipfs config --json API.HTTPHeaders.X-Special-Header '["so special :)"]'
Тоже самое, только для шлюза:
ipfs config --json Gateway.HTTPHeaders.X-Special-Header '["so special :)"]'
Экспериментальная опция, позволяющая не копировать публикуемые файлы во внутреннее хранилище:
ipfs config --json Experimental.FilestoreEnabled true

Запуск IPFS

Создадим сервис для легкого и автоматического запуска демона IPFS: nano /etc/systemd/system/ipfs.service

[Unit]
Description=IPFS daemon
After=network.target

[Service]
ExecStart=/usr/local/bin/ipfs daemon
ExecStop=/usr/bin/pkill ipfs
Restart=on-failure
User=www-data

[Install]
WantedBy=default.target

Обновим информацию о сервисах:
systemctl daemon-reload
Запустим новый сервис:
service ipfs start
Проверим его состояние:
service ipfs status
Если всё ОК, то включим автозагрузку:
systemctl enable ipfs.service

Примеры использования IPFS

Опубликовать один конкретный файл, без дублирования во внутреннюю библиотеку IPFS:
ipfs add --nocopy ./folder/music.mp3
Опубликовать каталог со всем содержимым (рекурсивно), с дублированием (копированием) во внутреннюю библиотеку IPFS:
ipfs add --recursive ./folder/
Узнать мультихэш файла, без публикации его в сеть:
ipfs add --only-hash -q ./folder/pic.jpg
Опубликовать можно не только файлы или каталоги, но и просто текст:
echo "Hello world!" | ipfs add
Закрепить локально (скопировать себе) объект, опубликованный в другом месте:
ipfs pin add -r=false QmQAWnaRR2S57jyMX5EykqcFwF2jwadXMq2RuTpzFa6Tuq
Получить содержимое объекта:
ipfs cat QmfHTUfG6hexg2D3Dgatx1CxyKVyrKQqeJ2ge7DVuvJHqp
Ссылка для получения объекта (файла, директории) через специальный, распределённый, открытый шлюз:
https://gateway.ipfs.io/ipfs/QmfHTUfG6hexg2D3Dgatx1CxyKVyrKQqeJ2ge7DVuvJHqp

Что ещё можно делать с IPFS

what if I told you
А что, если я скажу тебе… Это лишь верхушка айсберга!…
https://cloudflare-ipfs.com/ipfs/QmPDgUhqWE4WqRqAHHtjUTkTjWRiSKGtAHtf8YWcqUiUvA/example#/ipfs/QmXoi5QCbT83obqqoUFwq1hM7EbS2LVnNgNNiDe9LDnMbP