Нода 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.

Every external node should use its personal domain, we highly recommend to use CloudFlare for protect node, https and so on. To encrypt the traffic between CloudFlare and node we recommend “Let’s Encrypt” free SSL certificates – install certbot package for this purpose.

Рекомендуется, чтобы каждая внешняя нода использовала свой персональный домен. Настоятельно рекомендуем использовать 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