Экспериментируя с Ethereum и IPFS, в процессе настройки https://cryptoblox.co я хотел открыть общедоступный узел IPFS для загрузки файлов. в IPFS откуда угодно, кем угодно - через CryptoBLOX.
Используя js-ipfs, я смог открыть узел IPFS для публики, однако я наткнулся на проблему: ipfs-api в настоящее время не поддерживает HTTPS. - несмотря на использование формата multiaddr. Возможно, это планируется в будущем, но на данный момент не поддерживается.
Очевидно, что вы не можете использовать одновременно HTTP и HTTPS на одном сайте (блокировка смешанного контента).
Поэтому мне пришлось настроить NGINX в качестве обратного прокси для запущенного мной jsipfs daemon.
Установка и настройка JS-IPFS Daemon
Сначала я установил IPFS:
npm install ipfs --global
Я решил использовать его из CLI, поэтому выполнил следующие команды (из документации js-ipfs-api, отредактировано):
# Show the ipfs config API port to check it is correct > jsipfs config Addresses.API /ip4/127.0.0.1/tcp/5001 # Set it if it does not match the above output > jsipfs config Addresses.API /ip4/127.0.0.1/tcp/5001 # Restart the daemon after changing the config # Run the daemon > jsipfs daemon
На моем сервере Node.JS (который работал локально) я регулярно настраивал его:
var ipfs = ipfsAPI('localhost', '5001', {protocol: 'http'})
Вдобавок я хотел запустить его как законный демон - перезапуск после перезагрузки, перезапуск после сбоя и т. Д.
Используя systemctl, я смог добиться следующего:
vim /lib/systemd/system/jsipfs.service
И вставьте следующее:
[Unit] Description=JSIPFS Daemon Client [Service] ExecStart=/root/.nvm/versions/node/v8.9.1/bin/node /root/.nvm/versions/node/v8.9.1/bin/jsipfs daemon Restart=always RestartSec=30 Type=simple User=root Group=root [Install] WantedBy=multi-user.target
Обратите внимание, что для файлов конфигурации службы требуются полные пути к исполняемым файлам.
Теперь запустите:
systemctl daemon-reload systemctl start jsipfs # To see the last lines written to stdout / stderr by the process journalctl -u jsipfs -n50
Настройка nginx в качестве обратного прокси
В моем примере я использовал Let's Encrypt, чтобы получить сертификат SSL, который, на мой взгляд, оказался очень полезным, очень удобным и настроенным за считанные минуты.
Просто бегаю:
sudo certbot --nginx -d cryptoblox.co
Настройте SSL на nginx вместе с добавлением перенаправления с HTTP на HTTPS, никаких дополнительных действий не требуется.
Приступаем к редактированию конфигурации nginx (/ etc / nginx / sites-available / default) - добавляем следующий фрагмент после инициализации исходного сервера:
server { listen [::]:5002 ssl ipv6only=on; # managed by Certbot listen 5002 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/cryptoblox.co/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/cryptoblox.co/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot server_name cryptoblox.co; location / { proxy_pass http://localhost:5001; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
Теперь просто перезапустите nginx, и все готово!
Связь с общедоступным узлом IPFS
На стороне клиента, после запроса js-ipfs-api, я просто инициализировал его, используя:
var ipfsApi = ipfsAPI('cryptoblox.co', '5002', {protocol : "https"})
Или, если вы запрашиваете это из их CDN:
var ipfsApi = window.IpfsApi('cryptoblox.co', '5002', {protocol : "https"})
А затем простая функция, которая принимает blob и добавляет его в IPFS:
async function saveToIPFSToBytes32(blob) { var fileReader = await loadFileReader(blob); var buff = Buffer.from(fileReader.result); var result = await ipfsApi.add(buff, { progress: (prog) => {} }); return ipfsHashToBytes32(result[0].hash); }
Обратите внимание, что файлы сохраняются на вашем узле локально до тех пор, пока их не запросит кто-то другой, поэтому сразу после их загрузки мы отправили запрос на https://ipfs.io глобальный шлюз с хешами файлов.
Вот и все, теперь вы можете связываться со своим общедоступным узлом IPFS через HTTPS.
Надеюсь, это поможет любому, кто стремится сделать Интернет более децентрализованным 👼