Экспериментируя с 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.

Надеюсь, это поможет любому, кто стремится сделать Интернет более децентрализованным 👼