Нода Universa: предварительная конфигурация сервера


🇬🇧 / 🇷🇺

В настоящем документе описана процедура конфигурации сервера Linux для запуска на нём программного обеспечения Universa Node.

Сервер должен соответствовать требованиям к ОС и аппаратному обеспечению, указанным на Портале владельцев нод.

Необходимые пакеты

Последняя версия репозитория PostgreSQL

Сконфигурируйте источники APT PostgreSQL 10, как описано здесь.

Обязательные пакеты

Установите обязательные пакеты, необходимые для запуска и обслуживания ноды Universa.

apt-get install apache2-utils build-essential check-postgres curl dirmngr git haveged libpam-systemd libpq-dev libssl-dev lsb-release netfilter-persistent nginx-light postgresql postgresql-client pgtop rsync sudo wget vim hdparm net-tools

Java

Установка Oracle JDK из webupd более недоступна в связи с изменением лицензии Oracle. Есть два варианта:

  1. Зарегистрируйтесь на сайте Oracle, скачайте и установите tar.gz-архив для Linux x64.

  2. Установите пакет openjdk-11-jdk из репозитория Debian stretch-backports.

УСТАРЕВШИЙ МЕТОД

Установите webupd8.org пакеты Oracle Java для Debian:

su -
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
apt-get update
apt-get install oracle-java8-installer oracle-java8-set-default binfmt-support
exit

Откройте файл /etc/java-8-oracle/security/java.security в текстовом редакторе. Измените строчку:

securerandom.source=file:/dev/random

на:

securerandom.source=file:/dev/./urandom

Сохраните изменения и закройте текстовый редактор. Подробнее смотрите здесь.

В случае OpenJDK 11 необходимо отредактировать файл /etc/java-11-openjdk/security/java.security.

Другие пакеты

Рекомендуемые, но не обязательные пакеты:

  • cryptsetup – для защиты частных ключей и других конфиденциальных данных, или вообще всей базы PostgreSQL, в зашифрованном разделе LUKS.
  • certbot – для получения бесплатных SSL-сертификатов для HTTP-сервера Nginx.

Nginx

Образцы conf-файлов конфигурации можно найти в приложенном архиве файлов конфигурации Nginx, где вместо фактического домена указано DOMAIN.

Рекомендуется, чтобы каждая внешняя нода использовала свой персональный домен. Настоятельно рекомендуем использовать CloudFlare для защиты ноды, HTTPS и так далее. Для шифрования трафика между CloudFlare и нодой рекомендуем бесплатные SSL сертификаты “Let’s Encrypt” – для этого необходимо установить пакет certbot.

Распакуйте образцы файлов из архива в /etc/nginx, измените доменное имя (везде, где оно встречается), отредактируйте пути к SSL сертификатам, сгенерируйте dhparam, создайте символическую ссылку и перезагрузите Nginx:

ln -s /etc/nginx/sites-available/universa_node /etc/nginx/sites-enabled
openssl dhparam -out /etc/nginx/dhparam.pem 4096
nginx -t && nginx -s reload

Получение SSL сертификата при помощи certbot

При настройке ноды на использование бесплатных SSL сертификатов Let’s Encrypt необходимо принять следующие меры предосторожности:

До того, как вы получите первый SSL сертификат для своего узла, вы не можете использовать строку 8443 ssl в конфигурационном файле Nginx (поскольку сертификата ещё нет), поэтому закомментируйте её на время.

Отредактируйте следующую команду, указав ваш домен, и получите сертификаты:

certbot certonly -d #{domain} --webroot -w /var/www/letsencrypt

После успешного выполнения раскомментируйте секцию, связанную с SSL, в файле Nginx и ещё раз перезапустите Nginx (service nginx reload).

Дополнительная конфигурация

PostgreSQL

После установки всех пакетов создайте пользователя баз данных, от имени которого будет работать ПО Universa, пароль и название базы данных выберите по своему усмотрению.

CREATE USER universa PASSWORD '<PASSWORD>';
CREATE DATABASE universa_node WITH OWNER=universa;

Добавьте следующую строку в файл pg_hba.conf; отредактируйте её, если вы изменили имя пользователя или базы данных:

local    universa_node   universa       md5

Настройка postgresql.conf

Увеличьте число одновременных подключений в файле /etc/postgresql/10/main/postgresql.conf:

max_connections = 500

Also, configure the memory-related settings, depending on your server RAM and disk type, so you have to change the numbers (refer to http://pgtune.leopard.in.ua/ and PostgreSQL documentation):

Кроме того, задайте настройки, относящиеся к памяти, с учётом объёма ОЗУ и типа диска вашего сервера, а также измените цифры (см. http://pgtune.leopard.in.ua/ и документацию PostgreSQL):

shared_buffers = 196MB 
work_mem = 64MB
maintenance_work_mem = 256MB
max_wal_size = 8GB

Перезапустите сервер:

systemctl restart postgresql.service

Подготовьте специального пользователя для запуска службы

Добавьте пользователя deploy для ноды. Обязательно используйте именно такое имя:

useradd -m -s /bin/bash deploy

Включите просмотр журналов systemd:

usermod -a -G systemd-journal deploy 

Включите службу systemd для пользователя:

loginctl enable-linger deploy 

Подготовьте файл службы systemd /home/deploy/.config/systemd/user/java.service:

[Unit]
Description=Universa Java daemon
After=network.target

[Service]
StandardOutput=journal+console
StandardError=journal+console
Type=simple
WorkingDirectory=/home/deploy/universad/current
ExecStart=/usr/bin/java -jar /home/deploy/universad/current/app/uninode.jar -c /home/deploy/universad/current                          
TimeoutStartSec=15s
ExecStop=/bin/kill -TERM $MAINPID
TimeoutStopSec=10s
Restart=always

[Install]
WantedBy=default.target

Перезапустите systemd и запустите службу:

systemctl --user daemon-reload
systemctl --user enable java

Если вы настраиваете частную тестовую сеть и сразу несколько нод, то, с помощью утилиты uniclient подготовьте ключи для всех нод сети; в примере ниже используются 10 нод (для одной ноды понадобится только один ключ):

for n in $(seq 1 10); do uniclient -g node_$(printf "%04d" $n); done

Подготовьте конфигурацию в формате YAML, согласно примеру для первой ноды (node_number: 1). Необходимо поменять домен node-1-test.example.com и IP-адрес.

---                                                                                                                                     
http_client_port: 2052                                                                                                                  
http_client_listen:                                                                                                                     
- 127.0.0.1                                                                                                                             
http_server_port: 2082                                                                                                                  
udp_server_port: 2700                                                                                                                   
database: jdbc:postgresql://localhost:5432/universa_node?user=universa&password=<PASSWORD>                                              
node_number: 1                                                                                                                          
public_host: node-1-test.example.com                                                                                                    
node_name: node-1-test.example.com                                                                                                    
ip:                                                                                                                                     
- 1.2.3.4
ipv6:
- 1111:2222:33:4::5555

Скомпилируйте .jar-файлы Universa-ноды в Gradle-конфигурации multi-jar:

gradle :universa_node:buildMultiJar -x test

Загрузите файлы .jar от ноды Universa в директорию ~/universad/current/app.

Загрузите публичные ключи всех нод в ~/universad/current/config/keys.

Загрузите файлы конфигурации всех нод в ~/universad/current/config/nodes.

Загрузите файл конфигурации настраиваемой ноды в ~/universad/shared/config/config.yaml.

Загрузите приватный ключ в директорию ~/universad/current/tmp – для безопасности можно расположить её на файловой системе tmpfs или ramfs.

Теперь мы готовы запустить ноду как службу systemd:

systemctl --user start java

Доступ к сконфигурированной сети

Чтобы получить доступ к сконфигурированным нодам или сети, вам понадобится какое-то клиентское ПО вроде uniclient. Если вы настраиваете частную сеть (а не используете Mainnet), для доступа к сети такому клиенту наверняка понадобится файл сетевой топологии. Используйте приложенное приложение Topology builder, чтобы сгенерировать такой файл для вашей сети.

Полезные команды для управления

Чтобы проверить статус процесса:

systemctl --user status java

Чтобы просмотреть журнал в реальном времени («следовать» за логом, “follow”):

journalctl -f --user-unit java

Дополнительные настройки только для удалённо управляемых нод

SSH

Подготовьте файл authorized_keys и добавьте в него приложенные публичные ключи SSH для пользователь deploy (в вашей системе могут использоваться authorized_keys2).

mkdir -m 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Сгенерируйте пару ключей SSH для пользователя deploy:

ssh-keygen

Если вы управляете несколькими нодами, достаточно создать ключ один раз и скопировать его на другие ноды.

Файрволл и открытые порты

Должны быть открыты следующие порты:

tcp 22 или другой нестандартный порт, используемый sshd                                                                    

tcp 80                                                                                                                      
tcp 8080                                                                                                                      
tcp 8443                                                                                                                      
tcp 2052                                                                                                                      
tcp 2082                                                                                                                      
udp 2700