11 декабря 2016

Своя нода для TOX.



TOX - это такой протокол для голосовой, текстовой и видеосвязи, работает по технологии p2p, т.е. не требуется отдельный сервер, но для связи нужно, чтобы два клиента могли как-то друг друга найти и между собой соединиться. Для этого используется сеть публичных bootstrap-нод. Одну из подобных я поднимал just for fun.


Все свои извращения я делал внутри nspawn-контейнера с Debian testing, ставил всё в /opt, запуск демона делал с помощью systemd-юнита.

Для начали ставим всё нужное, чтобы потом два раза не бегать и три раза не перезапускать сборку:

sudo apt install build-essential libtool autotools-dev \
automake checkinstall check git yasm checkinstall \
libopus-dev libconfig-dev libvpx-dev

Теперь скачаем исходные тексты, из которых будем собирать и ставить.

git clone https://github.com/irungentoo/toxcore.git
git clone https://github.com/jedisct1/libsodium.git

Начнём с библиотеки libsodium:

cd libsodium
# генерация необходимых файлов
./autogen.sh
# конфигурирование с указанием каталога установки
./configure --prefix=/opt/toxcore
# сборка
make
# каталог для установки
sudo mkdir /opt/toxcore
# установка
sudo checkinstall

Теперь собираем непосредственной демон "tox-bootstrapd":

cd ../toxcore
./autogen.sh
# конфигурирование с указанием каталога установки и
# расположения файлов libsodium
./configure --prefix=/opt/toxcore  \
--with-libsodium-headers=/opt/toxcore/include \
--with-libsodium-libs=/opt/toxcore/lib \
--enable-daemon --enable-logging
# сборка и установка
make
sudo checkinstall

Теперь надо сделать так, чтобы всё это добро запускалось и работало.
Сначала надо создать системного пользователя, от имени которого будет работать демон:

sudo adduser --system --no-create-home --disabled-login tox-bootstrap

Для работы ноды необходим конфиг "/opt/toxcore/etc/tox-bootstrapd.conf" примерно такого содержания:

// Прослушиваемый порт
port = 33445

// Каталог для ключей, который надо создать
// и дать права на запись пользователю tox-bootstrap
// chown tox-bootstrap /opt/toxcore/var/lib/tox-bootstrapd/keys
keys_file_path = "/opt/toxcore/var/lib/tox-bootstrapd/keys"

// PID-файл
// Права на него выставит systemd
pid_file_path = "/var/run/tox-bootstrapd/tox-bootstrapd.pid"

// Использовать IPv6.
enable_ipv6 = true

// Использовать IPv4, если с IPv6 не получилось
enable_ipv4_fallback = true

// Обнаруживать ноды в локальной сети
enable_lan_discovery = true

enable_tcp_relay = true

// Дополнительный порты
tcp_relay_ports = [3389, 33445]

// MOTD (Message Of The Day)
enable_motd = true

// Текст не более 255 байт
motd = "tox-bootstrapd"

// Список нод
bootstrap_nodes = (
  {
    address = "адрес"
    port = порт
    public_key = "публичный ключ"
  },
  ...
  {
    address = "адрес"
    port = порт
    public_key = "публичный ключ"
  }
)

Актуальный список нод в пригодном для вставки формате можно взять по адресу http://tox.0x10k.com/bootstrapd-conf.txt.

Теперь необходим systemd-юнит для управления демоном. Я его создал в том же каталоге каталоге, чтобы за его пределами были только ссылки.

# /opt/toxcore/tox-bootstrapd.service

[Unit]
Description=Tox DHT Bootstrap Daemon
Wants=network-online.target
After=network.target network-online.target

[Service]
Type=forking
RuntimeDirectory=tox-bootstrapd
RuntimeDirectoryMode=750
PIDFile=/var/run/tox-bootstrapd/tox-bootstrapd.pid
WorkingDirectory=/opt/toxcore/var/lib/tox-bootstrapd
ExecStart=/opt/toxcore/bin/tox-bootstrapd --config /opt/toxcore/etc/tox-bootstrapd.conf
User=tox-bootstrap

[Install]
WantedBy=multi-user.target

В юните указывает: для запуска нужно дождаться поднятия сети, сервис после запуска форкается, PID-файл для отслеживания, каталог для PID-файла, команда для запуска, учетная запись демона.

Теперь этот юнит необходимо добавить в систему и запустить:

sudo systemctl enable /opt/toxcore/tox-bootstrapd.service
sudo systemctl start tox-bootstrapd.service
sudo systemctl status tox-bootstrapd.service

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

На написание всё этого вдохновил пост на Habrahabr.