Actualización de los servicios de la Infraestructura
8. Actualización de los servicios de la Infraestructura
Con la infraestructura en producción, en este capítulo describimos el proceso de actualización de cada servicio. Recomendamos siempre revisar las notas de lanzamiento antes de actualizar y realizar un respaldo previo.
8.1 Lightning Network Daemon (LND)
Para realizar cualquier actualización sobre el servicio LND, debemos saber que de no tener la frase semilla y el último respaldo del estado de los canales, corremos el riesgo de que si falla la actualización por algún error no tendremos forma de restaurar el nodo.
¿Dónde encontramos la frase semilla? La frase semilla la obtuvimos en el capítulo de Primeros Pasos, y solo se puede obtener una vez, así que no hay manera de recuperarla nuevamente.
¿Dónde encontramos el respaldo de los canales? Este se guarda por defecto dentro del directorio data del nodo, en nuestra infraestructura se localiza en app-data/lnd/data/chain/bitcoin/mainnet/chan-backup-archives/
Listamos el directorio chan-backup-archives/:
ls app-data/lnd/data/chain/bitcoin/mainnet/chan-backup-archives/
Imagen 1: Directorio de respaldo de canales en un LND.
Es importante que debemos revisar las notas de lanzamiento de la nueva versión del nodo antes de actualizar, ya que en ocasiones hay que realizar cambios en la configuración para evitar fallas.
Nuestro nodo tiene la versión v0.19.3-beta y la vamos actualizar con la última versión v0.20.1-beta, tras revisar las notas de lanzamiento no hay nada que destacar por lo que solo necesitamos modificar el archivo docker-compose.yml
Para actualizar la versión editamos el archivo docker-compose.yml y nos desplazamos hasta el servicio lnd:
nano docker-compose.yml
El servicio lnd estaría compuesto por lo siguiente:
lnd:
image: lightninglabs/lnd:v0.19.3-beta
container_name: lightning-node-1
restart: unless-stopped
ports:
- "9735:9735"
- "10009:10009"
- "8080:8080"
volumes:
- ./app-data/lnd:/root/.lnd
- tor-data:/var/lib/tor:ro
command:
- --configfile=/root/.lnd/lnd.conf
depends_on:
- tor
En la línea image: es donde se declara la versión de la imagen que usará nuestro contenedor, como queremos subir la versión donde dice v0.19.3 ponemos v0.20.1 quedando de la siguiente manera:
lnd:
image: lightninglabs/lnd:v0.20.1-beta
container_name: lightning-node-1
restart: unless-stopped
ports:
- "9735:9735"
- "10009:10009"
- "8080:8080"
volumes:
- ./app-data/lnd:/root/.lnd
- tor-data:/var/lib/tor:ro
command:
- --configfile=/root/.lnd/lnd.conf
depends_on:
- tor
Guardamos y salimos del archivo ctrl+s y ctrl+x.
Recreamos el contenedor con el siguiente comando:
docker-compose up --force-recreate lnd -d
Este comando descarga la nueva imagen, elimina el contenedor anterior y lo recrea con la nueva imagen.
8.2 Actualizando LNbits
Orden recomendado antes de actualizar:
docker-compose stop cashudocker-compose stop lnbits- Esperar ~1 minuto para que los pagos en vuelo se liquiden.
- Realizar el respaldo (ver sección 8.2.1).
- Actualizar y recrear el contenedor. No interrumpir la migración de base de datos.
- Si la migración falla, restaurar el respaldo y recrear con la versión anterior.
Antes de realizar cambios en la versión de LNbits se recomienda realizar un respaldo de la base de datos. Esto se puede hacer desde la cuenta de superusuario de LNbits; si no la recordamos, podemos volver al capítulo de LNbits.
Tras iniciar sesión en LNbits vamos a los Settings y damos clic en el botón DOWNLOAD DATABASE BACKUP que nos aparece al lado del botón RESTART SERVER
Imagen 2: Respaldo de la Base de Datos.
El archivo zip descargado contiene un volcado de la base de datos, además una copia del directorio data de LNbits que incluye las extensiones y los log de la aplicación.
8.2.1 Respaldando la base de datos desde la CLI
Podemos respaldar la base de datos fácilmente ejecutando el siguiente comando:
docker exec -t postgres_lnbits pg_dump -U lnbits_user lnbits_db | gzip > lnbits_backup_$(date +%Y%m%d_%H%M%S).sql.gz
Esto creará el archivo en el directorio actual desde donde se ejecutó el comando.
Ya tenemos el respaldo. Vamos nuevamente al archivo docker-compose.yml y buscamos el servicio lnbits.
nano docker-compose.yml
lnbits:
image: lnbits/lnbits:v1.4.0
container_name: app_lnbits
restart: unless-stopped
volumes:
- ./app-data/lnd/:/app/.lnd/:ro
- ./app-data/lnbits/data/:/app/data
- ./app-data/lnbits/.env:/app/.env
Vemos que la versión de la imagen que estamos usando es la v1.4.0 y hay una nueva versión v1.5.3 en el repositorio github del proyecto, siempre es recomendable ver las notas de lanzamiento de la nueva versión para saber si hay que realizar algún paso extra antes de actualizar.
Cambiamos la versión v1.4.0 por la v1.5.3 en la línea image:
lnbits:
image: lnbits/lnbits:v1.5.3
container_name: app_lnbits
restart: unless-stopped
volumes:
- ./app-data/lnd/:/app/.lnd/:ro
- ./app-data/lnbits/data/:/app/data
- ./app-data/lnbits/.env:/app/.env
Guardamos y salimos del archivo ctrl+s y ctrl+x.
Recreamos el contenedor con el siguiente comando:
docker-compose up --force-recreate lnbits -d
Este comando descarga la nueva imagen, elimina el contenedor anterior y lo recrea con la nueva imagen.
8.3 Actualizando el Mint de Cashu
cashu. LND y LNbits deben seguir corriendo. Si hay un melt en vuelo (el usuario ya quemó los tokens pero el pago Lightning aún no confirmó) y la migración falla, restaurar un respaldo anterior podría permitir un doble gasto.Orden recomendado antes de actualizar:
docker-compose stop cashu- Esperar ~1 minuto para que los pagos en vuelo se liquiden.
- Realizar el respaldo (ver a continuación).
- Actualizar y recrear el contenedor. No interrumpir la migración de base de datos.
- Si la migración falla, restaurar el respaldo y recrear con la versión anterior.
Antes de actualizar el Mint de Cashu debemos respaldar su base de datos. Al ser SQLite, el proceso es simple: solo copiamos el archivo mint.sqlite3.
Nos movemos hacia el directorio de cashu localizado en app-data/cashu/
cd app-data/cashu
Creamos un directorio backup en caso de no existir.
mkdir -p backup
Copiamos la base de datos del mint.
cp data/mint/mint.sqlite3 backup/
Luego de respaldar la base de datos vamos al archivo docker-compose.yml:
nano docker-compose.yml
cashu:
image: cashubtc/nutshell:0.19.2
container_name: app_cashu
restart: unless-stopped
volumes:
- ./app-data/cashu/.env:/app/.env
- ./app-data/cashu/data:/app/data
- ./app-data/cashu/certs:/app/certs
- ./app-data/cashu/certs/server_private.pem:/app/server_private.pem
- ./app-data/cashu/certs/server_cert.pem:/app/server_cert.pem
- ./app-data/cashu/certs/ca_cert.pem:/app/ca_cert.pem
- ./app-data/cashu/certs/client_cert.pem:/app/client_cert.pem
- ./app-data/cashu/certs/client_private.pem:/app/client_private.pem
- ./app-data/cashu/backup:/app/backup
command: ["poetry", "run", "mint"]
depends_on:
- lnbits
Vamos a migrar de la versión 0.19.2 a la 0.20.0, como hicimos en los anteriores servicios cambiamos la versión en la línea image: quedando de la siguiente manera:
cashu:
image: cashubtc/nutshell:0.20.0
container_name: app_cashu
restart: unless-stopped
volumes:
- ./app-data/cashu/.env:/app/.env
- ./app-data/cashu/data:/app/data
- ./app-data/cashu/certs:/app/certs
- ./app-data/cashu/certs/server_private.pem:/app/server_private.pem
- ./app-data/cashu/certs/server_cert.pem:/app/server_cert.pem
- ./app-data/cashu/certs/ca_cert.pem:/app/ca_cert.pem
- ./app-data/cashu/certs/client_cert.pem:/app/client_cert.pem
- ./app-data/cashu/certs/client_private.pem:/app/client_private.pem
- ./app-data/cashu/backup:/app/backup
command: ["poetry", "run", "mint"]
depends_on:
- lnbits
Guardamos y salimos del archivo ctrl+s y ctrl+x.
No olvidemos realizar el respaldo antes de continuar. Consultemos las notas de la versión: la imagen siguiente muestra un mensaje de aviso informando que hay cambios en la estructura de la base de datos tras la actualización, y que es necesario respaldarla para evitar corrupción de datos ante una actualización fallida.
Imagen 3: Mensaje de aviso sobre cambios en la estructura de la base de datos.
Solo nos queda ejecutar el comando:
docker-compose up --force-recreate cashu -d
Este comando descarga la nueva imagen, elimina el contenedor anterior y lo recrea con la nueva imagen.
8.4 Resto de los servicios de la infraestructura
Es posible que nos preguntemos por qué no cubrimos el resto de los servicios. La razón es que todos ellos (Tor, Lightning Terminal, Nginx Proxy Manager, Redis, Postgres y Orchard) son soporte de la infraestructura: añaden funcionalidades o permiten gestionar los demás servicios. El procedimiento es siempre el mismo: editar docker-compose.yml y cambiar la versión.
8.5 Solución de problemas
Se irán añadiendo en la medida que la comunidad los vaya reportando.