Automatizar arranque clientes
- Parte 1 – Introducción e instalación del sistema
- Parte 2 – Configuración de Raspbian
- Parte 3 – Instalación Bitcoin Core
- Parte 4 – Instalación Lightning Network Daemon (LND)
- Parte 5 – Redirección de puertos
- Parte 6 – TOR
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.