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
А что, если я скажу тебе… Это лишь верхушка айсберга!…
https://cloudflare-ipfs.com/ipfs/QmPDgUhqWE4WqRqAHHtjUTkTjWRiSKGtAHtf8YWcqUiUvA/example#/ipfs/QmXoi5QCbT83obqqoUFwq1hM7EbS2LVnNgNNiDe9LDnMbP