Заметка про запуск двух bitcoind (core+abc) на одном сервере

в 10:57, , рубрики: децентрализованные сети, Криптовалюты

Дело было вечером, делать было нечего.

В заметке Вы найдёте практическое руководство по запуску двух демонов (core+abc) на одной ноде.

Все операции проведены на DigitalOcean. Создан дроплет Debian 9 на 6 ядер и 16 гигов, к нему прицепил внешний 1ТБ диск. В теории всё ниже совместимо с любыми debian-based системами.

Разделять разные демоны будем с помощью LXC.
Докер решил не использовать, по двум объективным причинам:

  • Это не stateless приложения.
  • У блокчейнов хватает и своих проблем, не хватало болезни слоёв от докера.

Заводим LXC

Установка

apt-get update -q
apt-get install -yq lxc

Заводим сеть:

cat << EOF > /etc/default/lxc-net
USE_LXC_BRIDGE="true"
LXC_BRIDGE="br0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254"
LXC_DHCP_MAX="253"
LXC_DHCP_CONFILE=""
LXC_DOMAIN=""
EOF

systemctl enable lxc-net
systemctl start lxc-net

Пишем дефолтные настройки для контейнера

cat << EOF > /etc/lxc/default.conf
lxc.network.type = veth
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.flags = up
lxc.network.hwaddr = 00:FF:AA:FF:xx:xx

EOF

Для внешних дисков

Если у вас, как и в моём случае, место не на корневом диске, а где-то в /mnt/ — прошу заменить путь маунта.

cat << EOF >> /etc/lxc/default.conf
lxc.mount.entry = /mnt/volume_fra1_01/bitcoin-core/ var/lib/bitcoin-core/ none bind,create=dir 0 0
lxc.mount.entry = /mnt/volume_fra1_01/bitcoin-cash/ var/lib/bitcoin-cash/ none bind,create=dir 0 0
EOF

mkdir -p /mnt/volume_fra1_01/bitcoin-{core,cash}

Создаём контейнеры

Первый контейнер будет создаваться долго, т.к. ОСь контейнера будет debootstrap-ится с зеркал. Крайне советую запускать команды в screen-е, если присутствуют проблемы с сетью или сессиями ssh-а.

cat << EOF | bash
set -e
lxc-create -t debian -n bitcoin-core
lxc-start -n bitcoin-core
lxc-create -t debian -n bitcoin-cash
lxc-start -n bitcoin-cash
EOF

Дисклэймер

Люблю я собирать .deb пакеты, посему и всё счастье запихнул в них. Тут они по своей сути не нужны, кроме как для удобных обновлений.

Устанавливаем православный bitcoin core

Если заводите в РФ — проверьте доступность bitcoin.org до выполнения следующей простыни. Восславим РКН за это!

Прошу заметить, что команда выполняется на хост-машине, перенаправляется в контейнер через пайп на первой строчке.

Команды прокомментировал.

cat << EOF | lxc-attach -n bitcoin-core -- bash
# падать на любой ошибке
set -e
# ставим зависимости
apt-get update -q
apt-get install -yq wget tar
# выкачиваем и распаковываем бинари
wget https://bitcoin.org/bin/bitcoin-core-0.16.1/bitcoin-0.16.1-x86_64-linux-gnu.tar.gz
tar xzvf bitcoin-0.16.1-x86_64-linux-gnu.tar.gz
cd bitcoin-0.16.1
# создаём нужные папки для .deb пакета
mkdir -p DEBIAN var/lib/bitcoin-core/
# пишем файлик конфигурации для dpkg
echo "Package: bitcoin-core
Version: 0.16.1
Section: misc
Architecture: amd64
Depends: bash
Maintainer: root <root@localhost.tld>
Description: Bitcoin core 0.16.1" > DEBIAN/control
# Создаём systemd сервис
echo "[Unit]
Description=Bitcoin daemon service (core)

[Service]
Type=forking
Restart=always
ExecStart=/bin/bitcoind -datadir=/var/lib/bitcoin-core/ -discover -daemon -server -rpcuser=test -rpcpassword=test -rpcport=8332 -rpcallowip=0.0.0.0/0 -printtoconsole -logips

[Install]
WantedBy=multi-user.target" > /etc/systemd/system/bitcoind.service 

cd ..
# собираем и устанавливаем пакет
dpkg -b bitcoin-0.16.1
dpkg -i bitcoin-0.16.1.deb
# запускаем сервис, включаем в автозагрузку
systemctl start bitcoind.service
systemctl enable bitcoind.service
systemctl status bitcoind.service
EOF

Заводим модный bitcoin cash

Полная аналогия предыдущего. Заменены версии, имена, урлы.

cat << EOF | lxc-attach -n bitcoin-cash -- bash
set -e
apt-get update -q
apt-get install -yq wget tar
wget https://download.bitcoinabc.org/0.17.2/linux/bitcoin-abc-0.17.2-x86_64-linux-gnu.tar.gz
tar xzvf bitcoin-abc-0.17.2-x86_64-linux-gnu.tar.gz
cd bitcoin-abc-0.17.2
mkdir -p DEBIAN var/lib/bitcoin-cash/

echo "Package: bitcoin-abc
Version: 0.17.2
Section: misc
Architecture: amd64
Depends: bash
Maintainer: root <root@localhost.tld>
Description: Bitcoin abc 0.17.2" > DEBIAN/control

echo "[Unit]
Description=Bitcoin daemon service (abc)

[Service]
Type=forking
Restart=always
ExecStart=/bin/bitcoind -datadir=/var/lib/bitcoin-cash/ -discover -daemon -server -rpcuser=test -rpcpassword=test -rpcport=8332 -rpcallowip=0.0.0.0/0 -printtoconsole -logips

[Install]
WantedBy=multi-user.target" > /etc/systemd/system/bitcoind.service 

cd ..

dpkg -b bitcoin-abc-0.17.2
dpkg -i bitcoin-abc-0.17.2.deb
systemctl start bitcoind.service
systemctl enable bitcoind.service
systemctl status bitcoind.service
EOF

Утилиты

Для удобного доступа к cli с хост машины.

cat << EOF >> ~/.bashrc
lxc-restart () {
  lxc-stop -n ${1};
  lxc-start -n ${1};
}
alias bitcoin-cash-cli='lxc-attach -n bitcoin-cash -- bitcoin-cli -rpcuser=test -rpcpassword=test'
alias bitcoin-core-cli='lxc-attach -n bitcoin-core -- bitcoin-cli -rpcuser=test -rpcpassword=test'
EOF

. ~/.bashrc

Теперь можно пользоватся cli вот так:

bitcoin-cash-cli getmininginfo
bitcoin-core-cli getmininginfo

Посмотреть, сколько скушали диска:

  • Для внешних маунтов: du -sh /mnt/volume_fra1_01/bitcoin*
  • Без них: du -sh /var/lib/lxc/bitcoin*/rootfs/var/lib/bitcoin*

Вывод:

3.7G    /mnt/volume_fra1_01/bitcoin-cash
66G     /mnt/volume_fra1_01/bitcoin-core

Дальнейшие действия

  • Подождите минут 5.
  • Проверьте размеры блокчейнов.
  • Проверьте выводы cli с getmininginfo.

Если вы поймали баг, что блокчейны не хотят синхронизироватся

Перезапустим конейнеры

lxc-restart bitcoin-cash
lxc-restart bitcoin-core

Ждём 5 минут, проверяем блокчейны. Время расчитано из 50мбс+ линка, и проца выше i3.

Надоело, хочу избавится.

Убить всё это можно легко, просто, без следов в системе.

lxc-stop -t 1 -n bitcoin-core
lxc-destroy -n bitcoin-core
lxc-stop -t 1 -n bitcoin-cash
lxc-destroy -n bitcoin-cash

rm /etc/default/lxc-net
apt-get purge lxc -yq
apt-get autoremove -yq

Автор: человек со стажем

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js