Публичные ноды важная составляющая для блокчейна, особенно когда мы заинтересованы в развитии приложений (клиентов, ботов, скриптов и пр.), которые порой повышают ценность для всего проекта.
На данный момент работают лишь две публичные API-ноды (кроме отдельной для клиента golos.id), что несомненно мало для развития. Было бы здорово если делегаты или энтузиасты исправят это, подняв дополнительные.
В зависимости от целей, публичную ноду можно поднять начиная с 2 ядер процессора, 8 Гб RAM и 60 Гб SSD памяти + стабильного интернета. Есть провайдеры, где подобная VPS-ка/сервер обойдётся вам всего в 5-7 евро/месяц.
Коротко опишу команды для установки с нуля рабочего варианта полной публичной API-ноды для блокчейна GOLOS (с хранением истории на неделю). Для такой, оптимальный вариант - VPS-ка/сервер с 16 Гб RAM памяти.
Устанавливаем Docker
sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce -y
Устанавливаем ноду
Скачиваем большую часть блоков напрямую с сервера (чтобы не тратить сутки-двое на их получение и лишнюю нагрузку делегатских seed-нод).
sudo wget -P ~/home/blockchain https://files.rudex.org/golos-classic/blockchain/block_log
Создаем папку и добавляем файл c актуальными seed-нодами.
mkdir ~/config && echo 'seed1.golos.blckchnd.com:30218
seed.golos.lexa.host:42434
seed1.vvk.pp.ru:2001
seed.aleksw.space:4243
seed.expertgroup.org:9243' | sudo tee -a ~/config/seednodes
Добавляем конфиг ноды (указанные в нём 202800
блоков = неделя).
Какие плагины нужны для ваших целей, можно посмотреть тут https://ropox.app/steemjs/api/
echo 'webserver-thread-pool-size = 2
webserver-http-endpoint = 0.0.0.0:8090
webserver-ws-endpoint = 0.0.0.0:8091
read-wait-micro = 500000
max-read-wait-retries = 2
write-wait-micro = 500000
max-write-wait-retries = 3
single-write-thread = true
enable-plugins-on-push-transaction = false
shared-file-size = 2G
min-free-shared-file-size = 500M
inc-shared-file-size = 2G
block-num-check-free-size = 1000
plugin = chain p2p json_rpc webserver network_broadcast_api witness database_api witness_api follow social_network tags operation_history account_history market_history account_by_key worker_api
clear-votes-before-block = 4294967295
history-start-block = 32000000
comment-title-depth = 202800
comment-body-depth = 202800
comment-json-metadata-depth = 202800
history-blocks = 202800
replay-if-corrupted = true
skip-virtual-ops = false
enable-stale-production = false
mining-threads = 0
[log.console_appender.stderr]
stream=std_error
[log.file_appender.p2p]
filename=logs/p2p/p2p.log
[logger.default]
level=debug
appenders=stderr
[logger.p2p]
level=none
appenders=stderr' | sudo tee -a ~/config/config.ini
Запускаем ноду в докер-контейнере.
sudo docker run -it -p 127.0.0.1:8090:8090 -p 127.0.0.1:8091:8091 -v ~/config:/etc/golosd -v ~/home/blockchain:/var/lib/golosd/blockchain --name golosd vizlex/golos-classic
После загрузки докер-образа и реплея (который занимает несколько часов), с получением логов вида handle_block "Got 0 transactions on block 3071930 by ..."
нода готова к работе.
Устанавливаем Nginx
sudo apt-add-repository ppa:nginx/stable -y
sudo apt-get update
sudo apt-get install nginx -y
Добавляем файл для своих настроек Nginx.
sudo nano /etc/nginx/sites-enabled/node.conf
Копируем в него правила, предварительно заменив адрес server_name
на свой субдомен/домен (не забыв привязать его в настройках DNS к нашему IP сервера). Бесплатные домены можно зарегистрировать напр. здесь.
server {
listen 80;
server_name test.lexa.host;
location / {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
}
proxy_http_version 1.1;
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8090;
}
location /ws {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
proxy_pass http://127.0.0.1:8091;
proxy_read_timeout 3600;
}
}
Сохраняем изменения Ctrl+O, подтверждаем Enter, выходим Ctrl+X.
Возможно потребуется обновить также и пакеты, как описано в комменте. На VPS-ках c Ubuntu 16.04 и 18.04 я с этим не сталкивался, на других, может пригодится.
Устанавливаем сертификаты
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot -y
sudo apt-get update
sudo apt-get install python-certbot-nginx -y
После следующей команды потребуется ввести:
- Email, на который будут отправляться уведомления о необходимости продления сертификата;
- Согласиться с правилами сервиса введя A и Enter;
- Отказаться от рассылки N и Enter;
- Подтвердить добавление сертификатов к указанным доменам вводом Enter;
- Отказаться от редиректа, введя 1 и Enter.
sudo certbot --nginx
Будут добавлены настройки в файл node.conf, которые можно перепроверить. Зайти командой ниже и найти строки с пометкой "# managed by Certbot" в конце файла.
sudo nano /etc/nginx/sites-enabled/node.conf
Выходим из файла Ctrl+X.
Перезапускаем Nginx.
sudo systemctl restart nginx
Проверяем статус Nginx.
sudo systemctl status nginx.service
Мы запустили публичную API-ноду, к которой можно подключаться как по адресу https://test.lexa.host (RPC) так и wss://test.lexa.host/ws (WebSockets).
При получении письма на email о необходимости обновить сертификат (раз в 90 дней), это можно сделать командой (или добавить задачу в cron):
sudo certbot renew
@lex упустил один момент:
После установки и настройки Nginx нужно сделать вот так
sudo apt update
sudo apt dist-upgrade
//ну или как там ты обновляешьПерезапустить сервер
sudo reboot
//не забыв сначала стопнуть контейнер чтоб не повредился случайноИ потом после запуска сервера и контейнера:
sudo systemctl start nginx
По твоему рецепту у меня посыпало в консоль кучу ошибок и не захотело стартовать, запустилось только после обновления и перезапуска. Наверное потому что сам Nginx из репозитория подхватывается актуальный, а либы в системе, которые он юзает, могут быть устаревшими.
@lindsay, не упустил, а просто не сталкивался. На VPS-ках/серверах c Ubuntu 16.04 и 18.04 было не нужно (пакеты обновлены по дефолту), но добавил в пост, вдруг у кого будет та же проблема. Спасибо.
@lex, немного про индексируемость id яндексом
Cпасибо. Попробую на выходных запустить.
@shafarevich, отлично!
@lex хде это серваки по 5 зелёных раздают? Меньше 10-ки не встречались
@oceanotechnic впс-ки
https://hetzner.com/cloud-ru
https://contabo.com/?show=vps
https://netcup.de/vserver/vps.php
@lex благодару. Добавлю в закладки.
Всё сделал по инструкции, но адрес shafarevich.space не доступен. Я его сегодня только зарегистрировал, наверное, надо ждать 24 часа для обновления DNS.
@shafarevich, кажется ошибка с привязкой к IP.
Нужно указать IP инстанта на гугле (когда прописывал), или если использовать Cloudflare, заменить DNS домена с "регрушных" на указанные при добавлении сайта в Cloudflare...
@lex IP 104.18.59.151, что выдаёт по запросу на www.golos.id, я прописал как указано в инструкции, а DNS клаудфлейровские cейчас пропишу.
@shafarevich, напишу тебе в ТГ
@lex добавь в мануал sudo /usr/sbin/certbot-auto -q renew в крон :D насколько помню на 90 ж дней Let’s Encrypt
Нужен чисто домен или домен + хостинг ? И что к чему привязывать ?
@shafarevich, только домен (напр. на reg.ru по 1$ есть), а в настройках привязать его к IP сервера.
@lex домен за бакс, продление за 15 хе-хе. У рег.ру странная политика. Дешевле купить статический хостинг на 3 года, чем каждый год продлевать домен.
@oceanotechnic этот совет,для ноды. Ну и каждый год брать другой домен за бакс напр...
@lex ну вариант. Vik где-то кидал линк на бесплатные домены
@lex Ну и один из основных и я думаю главных вопросов для пользвоатаеля, на сколько это профитно. Бытует мнение, что золотые годы уже канули, и это не прфоитно уже.
@mrarturs, публичные ноды уже давно не профитны, но без них и развитие "приложений" сложно ожидать...
@lex Да с таким курсом токена по ходу уже никакие не профитны, мало того, они даже себя не окупают - до 11 коп курс токена продавили. Ликвидность - стоит сейчас выйти одному дельфинчику с СГ 10000 и курс токена будет 1 сатоши (это меньше 1 коп).
В общем, по ходу, инициатива Classic загибается, Норвег, нанятый маркетмейкером, вместо того чтобы обеспечивать ликвидность и пампить курс, всех кинул (как всегда), просто делегировав подаренную СГ бустеру, а богачи выкупать из стакана токен чтобы нас кормить, тупо не хотят. Хоть бери под дулом автомата заставляй. Совсем не радужная рисуется картина... =( Не нужны никому ни мы ни наш шиткоин.
@lindsay да он после флаговых войн никому не нужен стал. Когда все нормальные люди, посмотрев на адекватность ДримТимы тихо ушли из этого дурдома.
@oceanotechnic
Сейчас дурдом еще похуже чем при Дримтиме, вот почитайте чат за последние 2-3 дня
https://t.me/golos_id
@lindsay ну я эпизодически отсматриваю, да :) Веселит.
Иногда мне кажется, что Россия -- место проклятое. Яндекс.Дзен стал напоминать Голос добустерной эпохи. Пул пилят ботофермы с рерайтом, а авторский контент особо никому не нужен. Ну и выдача у них что-то с чем-то.
@lex, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующих категориях:
Здравствуйте, @lex.
Вы получили 100.00% апвот от @goloslove.
Оплатил(a) ап поста: @lindsay.
Инструкция по использованию сервиса.
Hello, @lex. You received 100% upvote from UPRomo for burned GBG. Promoted this post in the queue: @denis-skripnik.
Service added about 27.228 GBG to your post.
The instruction for burning, for promotion or a drop of posts.
Invest in UPRomo and promote increase in number of the burned GBG.
Agreement on the use of service UPRomo.
Здравствуйте, @lex. Вы получили 100% апвот от UPRomo за сожженные GBG. Продвигали этот пост в очереди: @denis-skripnik.
Сервис прибавил к вашему посту примерно 27.228 GBG.
Инструкция по сжиганию для продвижения или задвигания постов.
Инвестируйте в UPRomo и способствуйте увеличению количества сжигаемых GBG.
Соглашение об использовании UPRomo.
@lex благодарим!
@lex Можно все в docker-compose завернуть что бы не морочиться сильно с конфигами
@avral, да, чем больше гайдов, тем лучше, я по старинке )