Гайд по установке публичной API-ноды для GOLOS


Публичные ноды важная составляющая для блокчейна, особенно когда мы заинтересованы в развитии приложений (клиентов, ботов, скриптов и пр.), которые порой повышают ценность для всего проекта.

На данный момент работают лишь две публичные 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

Устанавливаем ноду

sudo wget -P ~/home https://github.com/golos-classic/golos/rawить сутки-двое на их полjson

Скачиваем большую часть блоков напрямую с сервера (чтобы не тратить лишних часов, а то и суток на получение и лишнюю нагрузку делегатских seed-нод).

sudo wget файл c актуальнchain hd-нодами. ```ex.org/golos-classic/blockchain/block_log

Создаем папку и добавляем файл c 434
seed1.vvkseed-ноru:2001
seed.aleksw.space:4243
seed.exp ~/config && echo 'seed1.golos.blckchnd.com:30218
seed.golos.lexa.host:42434
upit.vvk.pp.ru:2001
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 witnesst_by_key worker_api
lear-vtness_api follow social_network tags operationlock = 32000000history market_history account_by_key
clear-votes-before-block = 4294967295

history-start-block = 31000000
comment-title-depth = 202800
comment-body-depth = 202800
comment-json-metadata-depth = 2028lse

minif-corrupted = true
skip-virtual-ops = false
enable-stale-production = false
required-participation = 0
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


Запускаем ноду в доv ~/home/blockchain:/var/lib/golosd/blockchain --name n -it -p 127.0.0.1:8090:8090 -p 127.0.0.1:8091:8091 -v ~/config:/etc/golosd -v ~/home:/var/lib/golosd --name golosd vizlex/golos-classic`

После загрузки докер-образа и репле1930 by ..."` нода  несколько часов), с получением логов вида `handle_block "Got 0 transactions on block 3071930 by lex"` нода готова к работе.

## Устанавливаем 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/5 и 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`

После следующей команды потребуется ввести:
1. Email, на который будут отправляться уведомления о необходимости продления сертификата;
2. Согласиться с правилами сервиса введя A и Enter;
3. Отказаться от рассылки N и Enter;
4. Подтвердить добавление сертификатов к указанным доменам вводом Enter;
5. Отказаться от редиректа, введя 1 и Enter.

`sudo certbot --nginx`

Будут добавлены настройки в файл node.conf, которые можно перепроверить. Зайти командой ниже и найти строки с пометкой "# managed by Certbot" в конце файла.

`sudo nano /etc/nginx/sites-enabled/node.conf`

Выходим из файла Ctrl+X.

Перезапускаем Nginx.
и публичную API-ноду, к кото nginx`

Проверяем статус Nginx.

`sudo systemctl status nginx.servак и wss ноду, к кот.host/ws (WebSockets). 

При поючаться как по адресу https://test.lexa.host (RPC) так и через WebSockets на wss://test.lex.host/ws

При получении письма на email о необходимости обновить сертификат (раз в 90 дней), это можно сделать командой (или добавить задачу в cron):
`sudo certbot renew`s

Comments 48


Cпасибо. Попробую на выходных запустить.

21.10.2019 13:35
1

@shafarevich, отлично!

21.10.2019 13:46
1

@lex Можно все в docker-compose завернуть что бы не морочиться сильно с конфигами

21.10.2019 13:43
0

@avral, да, чем больше гайдов, тем лучше, я по старинке )

21.10.2019 13:46
0

@lex благодарим!

21.10.2019 16:26
0

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.

21.10.2019 17:23
0

Здравствуйте, @lex.
Вы получили 100.00% апвот от @goloslove.
Оплатил(a) ап поста: @lindsay.

Инструкция по использованию сервиса.

22.10.2019 01:43
0

@lex упустил один момент:
После установки и настройки Nginx нужно сделать вот так
sudo apt update
sudo apt dist-upgrade //ну или как там ты обновляешь
Перезапустить сервер
sudo reboot //не забыв сначала стопнуть контейнер чтоб не повредился случайно
И потом после запуска сервера и контейнера:
sudo systemctl start nginx

По твоему рецепту у меня посыпало в консоль кучу ошибок и не захотело стартовать, запустилось только после обновления и перезапуска. Наверное потому что сам Nginx из репозитория подхватывается актуальный, а либы в системе, которые он юзает, могут быть устаревшими.

22.10.2019 01:58
3

@lindsay, не упустил, а просто не сталкивался. На VPS-ках/серверах c Ubuntu 16.04 и 18.04 было не нужно (пакеты обновлены по дефолту), но добавил в пост, вдруг у кого будет та же проблема. Спасибо.

22.10.2019 09:27
0

@lex, немного про индексируемость id яндексом

изображение.png

изображение.png

22.10.2019 04:29
6

@lex, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующих категориях:

  • комментарии - 8 позицию - 6 комментарии
  • Потенциальных Выплаты - 3 позицию - 396,648 GBG
22.10.2019 09:13
0

@lex Ну и один из основных и я думаю главных вопросов для пользвоатаеля, на сколько это профитно. Бытует мнение, что золотые годы уже канули, и это не прфоитно уже.

22.10.2019 19:38
0

@mrarturs, публичные ноды уже давно не профитны, но без них и развитие "приложений" сложно ожидать...

22.10.2019 20:41
1

@lex Да с таким курсом токена по ходу уже никакие не профитны, мало того, они даже себя не окупают - до 11 коп курс токена продавили. Ликвидность - стоит сейчас выйти одному дельфинчику с СГ 10000 и курс токена будет 1 сатоши (это меньше 1 коп).
В общем, по ходу, инициатива Classic загибается, Норвег, нанятый маркетмейкером, вместо того чтобы обеспечивать ликвидность и пампить курс, всех кинул (как всегда), просто делегировав подаренную СГ бустеру, а богачи выкупать из стакана токен чтобы нас кормить, тупо не хотят. Хоть бери под дулом автомата заставляй. Совсем не радужная рисуется картина... =( Не нужны никому ни мы ни наш шиткоин.

23.10.2019 03:43
0

@lindsay да он после флаговых войн никому не нужен стал. Когда все нормальные люди, посмотрев на адекватность ДримТимы тихо ушли из этого дурдома.

20.11.2019 20:49
1

@oceanotechnic
Сейчас дурдом еще похуже чем при Дримтиме, вот почитайте чат за последние 2-3 дня
https://t.me/golos_id

20.11.2019 20:51
0

@lindsay ну я эпизодически отсматриваю, да :) Веселит.

Иногда мне кажется, что Россия -- место проклятое. Яндекс.Дзен стал напоминать Голос добустерной эпохи. Пул пилят ботофермы с рерайтом, а авторский контент особо никому не нужен. Ну и выдача у них что-то с чем-то.

23.11.2019 15:24
0

Копируем в него правила, предварительно заменив адрес server_name на свой субдомен/домен (не забыв привязать его в настройках DNS к нашему IP сервера).

Нужен чисто домен или домен + хостинг ? И что к чему привязывать ?

26.10.2019 06:18
0

@shafarevich, только домен (напр. на reg.ru по 1$ есть), а в настройках привязать его к IP сервера.

26.10.2019 12:05
0

@lex домен за бакс, продление за 15 хе-хе. У рег.ру странная политика. Дешевле купить статический хостинг на 3 года, чем каждый год продлевать домен.

20.11.2019 20:50
0

@oceanotechnic этот совет,для ноды. Ну и каждый год брать другой домен за бакс напр...

20.11.2019 21:00
0

@lex ну вариант. Vik где-то кидал линк на бесплатные домены

23.11.2019 15:19
0

Всё сделал по инструкции, но адрес shafarevich.space не доступен. Я его сегодня только зарегистрировал, наверное, надо ждать 24 часа для обновления DNS.

27.10.2019 06:50
0

@shafarevich, кажется ошибка с привязкой к IP.
Нужно указать IP инстанта на гугле (когда прописывал), или если использовать Cloudflare, заменить DNS домена с "регрушных" на указанные при добавлении сайта в Cloudflare...

27.10.2019 12:04
0

@lex IP 104.18.59.151, что выдаёт по запросу на www.golos.id, я прописал как указано в инструкции, а DNS клаудфлейровские cейчас пропишу.

28.10.2019 08:53
0

@shafarevich, напишу тебе в ТГ

28.10.2019 09:02
0

@lex добавь в мануал sudo /usr/sbin/certbot-auto -q renew в крон :D насколько помню на 90 ж дней Let’s Encrypt

02.11.2019 07:39
0

@lex хде это серваки по 5 зелёных раздают? Меньше 10-ки не встречались

20.11.2019 20:53
0

@lex благодару. Добавлю в закладки.

23.11.2019 15:20
0