В свете последних "постановлений Партии и Правительства" у части голосян возникли проблемы с доступом к любимому блокчейну. Для решения этой проблемы предлагаю еще одну публичную ноду Голоса, которая находится по адресу golosapi.ecurrex.ru и доступна как через https протокол, так и через wss (вебсокеты). Можете использовать ее либо в своих скриптах, либо в декстопном или мобильном клиенте. Тот, кто решится сделать свою собственную веб-морду, также может использовать ее в своем решении. Данная api нода представляет собой две полные ноды Голоса (все посты и комментарии с первого до последнего текущего блока, история переводов/лайков/донатов ограничена 6 мес.), которые объединены сервисом nginx для балансировки и резервирования.
Я думаю для "официального анонса" этого вполне достаточно. Теперь переходим непосредственно к описанию "самого фокуса" для тех, кто также решится поднять что-то такое :)
Немного отступления по расписыванию топологии, чтобы представляли как оно все на самом деле. Есть vps в РФ, которая на данный момент не попадает "под санкции" и тп. и есть "домашний дата-центр", в котором и расположены все сервера. Доступ из дома реализован через промышленный 4G роутер Tandem-4GM с двумя сим-картами разных операторов, с собственной операционной системой на базе Linux. На нем же поднят openvpn клиент именно для связи "точка-точка" с вышеупомянутой vps, чтобы делать проброс портов в локальную сеть. Это нужно для получения адресов для депозитов у некоторых шлюзов, ну и вот теперь еще и работе публичной api ноды Голоса.
Теперь постараюсь объяснить как сделать тоже самое, если кто-то вдруг захочет повторить этот фокус. Ну и заодно для себя оставлю в блокчейне, вдруг забуду, а тут раз и посмотрел.
A. VPS с белым IP и зарегистрированным доменом (домен обязателен, без него никуда). Подойдет самая простая конфигурация, хватит 1 CPU и 512MB ОЗУ. Места на диске также "нюхает".
Ставим любой дистрибутив Linux, регистрируем домен у регистратора и устанавливаем в простом варианте только nginx. А в варианте как у меня еще и openvpn сервер. Конфигурация nginx для vps выглядит следующим образом:
server {
listen [::]:443 ssl;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/ecurrex.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ecurrex.ru/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
server_name golosapi.ecurrex.ru;
location / {
proxy_buffers 8 64k;
proxy_pass http://X.X.X.X:8080;
}
location /ws {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600;
proxy_pass http://X.X.X.X:8080;
}
}
server {
listen 80;
listen [::]:80;
server_name golosapi.ecurrex.ru;
if ($host = golosapi.ecurrex.ru) {
return 301 https://$host$request_uri;
}
return 404;
}
Где http://X.X.X.X:8080 - промежуточный web-сервер, который находится внутри локальной сети и доступ к которому вот как раз и получаем после поднятия туннеля и проброса портов. SSL сертификаты я обычно получаю у Let's Encrypt, но можно ставить любые, хоть платные, хоть бесплатные. Роли это не играет. Конфигурация простая, задача nginx на vps просто принять запрос и пробросить его на "основной" web-сервер.
B. Промежуточный web-сервер (или единственный, если ноды Голоса у вас будут на серверах в ДЦ). Здесь также нет особых требований к железу, и если он будет стоять внутри локальной сети, то и SSL сертификаты тоже не нужны, тк. весь трафик идет внутри vpn туннеля и надежно зашифрован. Конфигурация nginx здесь будет следующая
upstream goloshttp {
least_conn;
server golosapi.lan:8090 max_fails=5 fail_timeout=60s;
server golos.lan:8090 max_fails=5 fail_timeout=60s;
}
upstream golosws {
least_conn;
server golos.lan:8091 max_fails=5 fail_timeout=60s;
server golosapi.lan:8091 max_fails=5 fail_timeout=60;
}
server {
listen 80;
location / {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffers 8 64k;
proxy_pass http://goloshttp;
}
location /ws {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600;
proxy_pass http://golosws;
}
}
Здесь прописываются две дерективы upstream (описывает группу серверов) - одна для запросов через http и вторая для вебсокетов. golosapi.lan и golos.lan - две локальные ноды голоса, которые слушают соответствующие запросы либо на 8090 порту (http), либо на 8091 (ws). Параметр least_conn - задаёт для группы метод балансировки нагрузки, при котором запрос передаётся серверу с наименьшим числом активных соединений. При отсутствии активных соединений - просто чередует ноды по порядку. Если бы ноды Голоса отличались по "мощности", то можно было бы также прописать еще и вес каждого сервера, но тк. в моем случае они идентичные, то я пропустил этот параметр. Параметр max_fails задаёт число неудачных попыток работы с сервером, которые должны произойти в течение времени, заданного параметром fail_timeout, чтобы сервер считался недоступным на период времени, также заданный параметром fail_timeout. Те. если одна из нод Голоса по какой-то причине выйдет из строя (поломалась, выключена на техобслуживание, ...), то запросы будут передаваться только "живой". Если выйдут обе - збенитя.
Директива location / (в данном случае) - отвечает за http, location /ws - за вебсокеты. Те. все запросы по нужному протоколу будут перенаправляться по правильному пути. Настроены так, чтобы приняв запрос от вышестоящего веб-сервера переслать его ноде, а приняв ответ от ноды правильно вернуть его вышестоящему, а тот, в свою очередь, вернет его тому, кто посылал этот запрос (десктопный клиент, скрипт и тп.)
C. Нода Голоса. Тут требования к железу уже соответствующие. 2-4 CPU (потока), 64Gb ОЗУ (на 32 "не идет", я пробовал - фигня получается), 120GB NVME диск. Таких конфигураций нужно две штуки, одна "основная" и одна "резервная". Как установить ноду Голоса я расписывал в предыдущем посте, дублировать не буду.
Теперь предупреждая вопросы - а что так кратко и тп. Во-первых, чтобы делать вот это вот все, нужны какие-никакие базовые знания в администрировании Linux либо BSD. Это что касается web-серверов. Ноду Голоса, скорее всего, для минимизации гемора и тп. лучше все-таки ставить на Linux. Либо, если по какой-то причине нет Linux, то использовать docker контейнер, но я лично докер не очень люблю. В Сети полно руководств как поднять и настроить то-то и то-то, поэтому дублировать это на Голосе просто не вижу смысла. Кому лень искать, могу предложить, как один из вариантов, https://www.8host.com/blog/ , где в доходчивой форме расписано по шагам как и что можно настроить. Здесь же я расписал только то, чего в Сети просто нет.
Вот вроде бы и все. Свой десктоп клиент я уже перевел на эту публичную ноду. Проблем пока что не обнаружено, все работает так как надо. Но если кто-то найдет ошибку и тп. - отпишитесь и я исправлю, если она будет не на вашей стороне.