Automatizar arranque clientes

Tenemos nuestros 2 clientes funcionando pero, ¿qué pasa si se corta la luz? ¿Al reiniciarse se inician sólos? No. Los clientes se inician a mano, y en el caso de Bitcoin basta con introducir el comando, pero ¿y en el caso de LND? Hay que meter una contraseña cada vez que se inicia, ¿cómo lo hacemos?

Por partes, primero lo sencillo, vamos a crear el servicio para el cliente Bitcoin Core, este servicio se encargará de arrancar el cliente en caso de reinicio o cualquier error que provoque una parada. Simplemente tenemos que crear un fichero que se llame bitcoind.service (ajustar nombre de usuario y rutas si las habéis modificado), para ello:

echo "[Unit]" >> ~/soft/bitcoind.service
echo "Description=Bitcoin daemon" >> ~/soft/bitcoind.service
echo "After=network.target" >> ~/soft/bitcoind.service
echo "" >> ~/soft/bitcoind.service
echo "[Service]" >> ~/soft/bitcoind.service
echo "User=pi" >> ~/soft/bitcoind.service
echo "" >> ~/soft/bitcoind.service
echo "Type=forking" >> ~/soft/bitcoind.service
echo "ExecStart=/home/pi/soft/bitcoin/bin/bitcoind -conf=/home/pi/.bitcoin/bitcoin.conf -datadir=/home/pi/.bitcoin -pid=/home/pi/.bitcoin/bitcoin.pid" >> ~/soft/bitcoind.service
echo "" >> ~/soft/bitcoind.service
echo "Restart=always" >> ~/soft/bitcoind.service
echo "" >> ~/soft/bitcoind.service
echo "" >> ~/soft/bitcoind.service
echo "[Install]" >> ~/soft/bitcoind.service
echo "WantedBy=multi-user.target" >> ~/soft/bitcoind.service

Movemos el fichero al directorio system con

sudo mv ~/soft/bitcoind.service /etc/systemd/system/bitcoind.service

Habilitamos el servicio con

sudo systemctl enable bitcoind.service

Iniciamos el servicio con

sudo systemctl start bitcoind.service

Nota: Este servicio arranca el cliente siempre que esté parado, en caso de que queramos pararlo hay que desactivar el servicio con sudo systemctl disable bitcoind.service antes de detener el cliente.

Con esto hacemos «imparable» nuestro cliente Bitcoin, ahora vamos con lo peliagudo, el cliente Lightning.

La wallet de Lightning está protegida por contraseña, debemos desbloquear esta cartera con la contraseña en cada arranque por lo que si creamos un servicio como el de Bitcoin, el cliente arrancará y se quedará a la espera del desbloqueo de wallet, es nuestra primera opción:

Arranque cliente y desbloqueo manual

Creamos el servicio con

echo "[Unit]" >> ~/soft/lnd.service
echo "Description=LND Daemon" >> ~/soft/lnd.service
echo "Requires=bitcoind.service" >> ~/soft/lnd.service
echo "After=bitcoind.service" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "[Service]" >> ~/soft/lnd.service
echo "User=pi" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "Type=simple" >> ~/soft/lnd.service
echo "ExecStart=/home/pi/soft/lnd/lnd " >> ~/soft/lnd.service
echo "PIDFile=/home/pi/.lnd/lnd.pid" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "Restart=always" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "[Install]" >> ~/soft/lnd.service
echo "WantedBy=multi-user.target" >> ~/soft/lnd.service

Movemos el fichero al directorio system con

sudo mv ~/soft/lnd.service /etc/systemd/system/lnd.service

Habilitamos el servicio con

sudo systemctl enable lnd.service

Iniciamos el servicio con

sudo systemctl start lnd.service

Arranque cliente y desbloqueo automático

Este modo nos obliga a almacenar nuestra contraseña en un fichero.

Instalamos prerequisitos (este punto tarda un rato, ¡coffee time!)

sudo apt-get install python-pip git
pip install grpcio grpcio-tools googleapis-common-protos
mkdir ~/soft/lndinit && cd ~/soft/lndinit
curl -o rpc.proto -s https://raw.githubusercontent.com/lightningnetwork/lnd/master/lnrpc/rpc.proto
git clone https://github.com/googleapis/googleapis.git
python -m grpc_tools.protoc --proto_path=googleapis:. --python_out=. --grpc_python_out=. rpc.proto

Creamos un pequeño script en python que será el encargado de desbloquear la cartera, para ello (sustituir el password por el que habéis puesto a vuestra cartera):

echo "import codecs, grpc, os" >> ~/soft/lndinit/lndinit.py
echo "import rpc_pb2 as ln, rpc_pb2_grpc as lnrpc" >> ~/soft/lndinit/lndinit.py
echo "os.environ['GRPC_SSL_CIPHER_SUITES'] = 'HIGH+ECDSA'" >> ~/soft/lndinit/lndinit.py
echo "cert = open('/home/pi/.lnd/tls.cert', 'rb').read()" >> ~/soft/lndinit/lndinit.py
echo "ssl_creds = grpc.ssl_channel_credentials(cert)" >> ~/soft/lndinit/lndinit.py
echo "channel = grpc.secure_channel('localhost:10009', ssl_creds)" >> ~/soft/lndinit/lndinit.py
echo "stub = lnrpc.WalletUnlockerStub(channel)" >> ~/soft/lndinit/lndinit.py
echo "request = ln.UnlockWalletRequest(" >> ~/soft/lndinit/lndinit.py
echo " wallet_password='blockchainespana'," >> ~/soft/lndinit/lndinit.py
echo " recovery_window=0," >> ~/soft/lndinit/lndinit.py
echo ")" >> ~/soft/lndinit/lndinit.py
echo "response = stub.UnlockWallet(request)" >> ~/soft/lndinit/lndinit.py

Y ahora generamos el servicio que arrancará LND y desbloqueará la cartera:

echo "[Unit]" >> ~/soft/lnd.service
echo "Description=LND Daemon" >> ~/soft/lnd.service
echo "Requires=bitcoind.service" >> ~/soft/lnd.service
echo "After=bitcoind.service" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "[Service]" >> ~/soft/lnd.service
echo "User=pi" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "Type=idle" >> ~/soft/lnd.service
echo "ExecStart=/home/pi/soft/lnd/lnd " >> ~/soft/lnd.service
echo "PIDFile=/home/pi/.lnd/lnd.pid" >> ~/soft/lnd.service
echo "ExecStartPost=/usr/bin/python /home/pi/soft/lndinit/lndinit.py" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "Restart=always" >> ~/soft/lnd.service
echo "" >> ~/soft/lnd.service
echo "[Install]" >> ~/soft/lnd.service
echo "WantedBy=multi-user.target" >> ~/soft/lnd.service

Movemos el fichero al directorio system con

sudo mv ~/soft/lnd.service /etc/systemd/system/lnd.service

Habilitamos el servicio con

sudo systemctl enable lnd.service

Iniciamos el servicio con

sudo systemctl start lnd.service

Con esto ya tenemos un arranque automático de ambos clientes.

Parte 8 – Backup

Añadir un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *