Pull to refresh

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

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

В заметке Вы найдёте практическое руководство по запуску двух демонов (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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.