Primeros Pasos

1. Primeros pasos

En este capítulo preparamos el entorno base sobre el que se construirá toda la infraestructura. Antes de ejecutar cualquier comando, verificamos que contamos con los siguientes requisitos:

1.1 Requerimientos

  • Servidor VPS con sistema operativo Debian/Ubuntu (disponibles con descuento en los siguientes enlaces de Hostinger: VPS KVM1 y VPS KVM2, recomendamos el KVM2 para producción).
  • Docker 26.0+.
  • Docker Compose 2.0+.
  • Dominio DNS válido para publicar los servicios en Internet (disponible en Namecheap, Hostinger o GoDaddy; Namecheap y Hostinger aceptan pagos con Bitcoin).

1.2 Esquema de la infraestructura

Imagen 1: Arquitectura de la infraestructura Docker.

Arquitectura de la infraestructura Docker

Descripción: El esquema muestra los contenedores de Docker (Tor, Lightning Network Daemon, Lightning Terminal, LNbits, Postgres, Cashu, Orchard y Nginx Proxy Manager). Las flechas indican la comunicación entre servicios.

1.3 Instalando los requisitos

1.3.1 Instalando Docker y Docker Compose

La mayoría de los VPS proveen acceso directo como usuario root por defecto. Si este es el caso, omitimos el uso de sudo en todos los comandos. Para confirmar el usuario actual, ejecutamos:

whoami

Si la salida del comando es root, no se requiere sudo delante de los siguientes comandos:

sudo apt update && sudo apt upgrade
# Debian 12+
sudo apt install docker.io docker-compose
# Ubuntu 24.04+
sudo apt install docker.io docker-compose-v2

1.3.2 Agregando nuestro usuario al grupo Docker

Si la salida del comando whoami que ejecutamos anteriormente fue root, omitimos este paso; en caso contrario, ejecutamos el siguiente comando:

sudo usermod -aG docker $(whoami)

Esto nos permitirá ejecutar el comando docker sin privilegios.

1.3.3 Clonando el repositorio del Proyecto

git clone https://github.com/cashu4community/cashu4cs-deploy.git
cd cashu4cs-deploy
Importante: A partir de ahora todos los comandos se ejecutarán desde el directorio cashu4cs-deploy.

1.4 Configuración inicial

Para poder iniciar la infraestructura se necesita configurar varios parámetros. Se recomienda guardarlos en un documento ya que serán necesarios en las siguientes secciones de este capítulo.

1.4.1 Configurando parámetros de Lightning Network Daemon

Cambiando la IP Pública del nodo Lightning

Para obtener la IP pública usaremos el script get_public_ip.sh ubicado en la raíz del directorio cashu4cs-deploy.

./get_public_ip.sh

Esto devuelve una salida como la siguiente:

72.61.27.142

Conociendo esta IP vamos a editar el archivo lnd.conf.

nano app-data/lnd/lnd.conf

Buscamos la línea externalip= y agregamos la IP obtenida 72.61.27.142.

Imagen 2: Archivo lnd.conf parámetro externalip=.

Archivo lnd.conf parámetro externalip

Guardamos y salimos del archivo ctrl+s y ctrl+x

Cambiando el alias del nodo LND

El alias es útil para poder encontrar el nodo en exploradores de la red lightning como mempool.space o amber.space. Para cambiarlo editamos nuevamente el archivo lnd.conf y buscamos la línea alias=, para este capítulo usaremos Cashu4CS como alias del nodo LND.

Imagen 3: Archivo lnd.conf parámetro alias=.

Archivo lnd.conf parámetro alias
Creando la contraseña para la billetera del nodo LND

El proceso de creación de la billetera del nodo LND que veremos más adelante nos pide una contraseña usada para cifrar la billetera y desbloquearla cada vez que se reinicia el servicio, esta debe tener al menos 12 caracteres, combinando mayúsculas, minúsculas, números y caracteres especiales (por ejemplo: *-+). Una vez creada la contraseña la introducimos en el archivo walletunlock ubicado en app-data/lnd/.

Para este tutorial usaremos +6Mn31qVwLC- como contraseña de la billetera.

nano app-data/lnd/walletunlock

Imagen 4: Archivo walletunlock con la contraseña creada anteriormente.

Archivo walletunlock con la contraseña

Guardamos y salimos del archivo ctrl+s y ctrl+x

Nota: El archivo walletunlock nos permitirá desbloquear automáticamente la billetera del nodo tras un reinicio del contenedor Docker. Esta es la razón por la que contiene la contraseña.

1.4.2 Creando la contraseña para el acceso a Lightning Terminal

Para acceder al servicio Lightning Terminal (de ahora en lo adelante LIT) se necesita una contraseña, esta debe tener los mismos requisitos de complejidad que la usada en la billetera LND. Una vez generada la guardamos en el archivo lit.conf ubicado en app-data/lit/.

Creada la contraseña editamos el archivo lit.conf.

nano app-data/lit/lit.conf

Buscamos la línea uipassword= e introducimos la contraseña, usaremos +dFskhU8d35* como ejemplo para el tutorial quedando así:

Imagen 5: Archivo lit.conf con la contraseña creada para acceder a la web de LIT.

Archivo lit.conf con la contraseña

Guardamos y salimos del archivo ctrl+s y ctrl+x

1.4.3 Estableciendo los parámetros de configuración de LNbits

El servicio LNbits necesita la clave AUTH_SECRET_KEY definida en el archivo .env y la contraseña de la base de datos PostgreSQL para funcionar.

Generando la clave AUTH_SECRET_KEY
openssl rand -hex 32

Esto nos devuelve algo como esto:

f92a03c2e12362f092b6589bde08b0433cd08f4ffe9ef894fe8e01660d18054f

Copiamos la clave y editamos el archivo .env ubicado en app-data/lnbits/.

nano app-data/lnbits/.env

Buscamos la línea AUTH_SECRET_KEY y pegamos la clave generada en el paso anterior.

Imagen 6: Archivo .env con la clave AUTH_SECRET_KEY creada anteriormente.

Archivo .env con la clave AUTH_SECRET_KEY

Guardamos y salimos del archivo ctrl+s y ctrl+x

Creando la contraseña de la base de datos PostgreSQL

Ahora necesitamos crear la contraseña que usará LNbits para conectarse a la base de datos PostgreSQL, la introduciremos en el archivo .env que editamos anteriormente y en el archivo docker-compose.yml ubicado en la raíz del directorio cashu4cs-deploy.

Editamos el archivo .env.

nano app-data/lnbits/.env

Buscamos la línea LNBITS_DATABASE_URL="postgres://lnbits_user:dbpassword_@db:5432/lnbits_db" y sustituimos dbpassword_ por nuestra contraseña. Usaremos 3Edf56gh.*FU como ejemplo.

Imagen 7: Variable LNBITS_DATABASE_URL de conexión a la base de datos usando la contraseña generada anteriormente

Variable LNBITS_DATABASE_URL

Guardamos y salimos del archivo ctrl+s y ctrl+x

Ahora editamos el archivo docker-compose.yml.

nano docker-compose.yml

Buscamos el servicio docker db: y editamos en la sección environment: la variable POSTGRES_PASSWORD, quedando así:

Imagen 8: Variable POSTGRES_PASSWORD actualizada con la contraseña generada.

Variable POSTGRES_PASSWORD

Guardamos y salimos del archivo ctrl+s y ctrl+x

1.4.4 Estableciendo los parámetros de configuración del Mint de Cashu

Para el buen funcionamiento del Mint de Cashu debemos generar la variable MINT_PRIVATE_KEY= y los certificados SSL usados para cifrar la conexión RPC desde el servicio Orchard hacia el Mint.

Creando la variable MINT_PRIVATE_KEY
openssl rand -hex 32

Esto nos devuelve algo como esto:

cf33ffb9af447b1210e052548f911ba62639a6a653f7066809bacecb7436ea4b

Igual que hicimos con AUTH_SECRET_KEY de LNbits copiamos la clave anterior y editamos el archivo .env ubicado en app-data/cashu/.

nano app-data/cashu/.env

Buscamos la línea MINT_PRIVATE_KEY= y pegamos la clave generada en el paso anterior:

Imagen 9: Variable MINT_PRIVATE_KEY actualizada en el archivo .env.

Variable MINT_PRIVATE_KEY

Guardamos y salimos del archivo ctrl+s y ctrl+x

Generando los certificados SSL para la conexión RPC

Vamos al directorio certs ubicado en app-data/cashu/

cd app-data/cashu/certs

Ejecutamos el script generate_certificates.sh

./generate_certificates.sh

Este script genera todos los certificados necesarios para la conexión RPC. Si no ocurre ningún error, los certificados estarán en este directorio.

ls .
ca_cert.pem  ca_private.pem  client_cert.pem  client_private.pem  generate_certificates.sh  server_cert.pem  server_private.pem

1.4.5 Estableciendo los parámetros de configuración de Orchard

Necesitamos generar la clave SETUP_KEY usada en la inicialización de Orchard.

openssl rand -hex 16

El resultado sería:

d5c454540c045373b5bac4a58b0b52e8

Copiamos la clave anterior y editamos el archivo .env ubicado en app-data/orchard/.

nano app-data/orchard/.env

Buscamos la línea SETUP_KEY= y pegamos la clave generada en el paso anterior.

Imagen 10: Variable SETUP_KEY actualizada en el archivo .env.

Variable SETUP_KEY

Guardamos y salimos del archivo ctrl+s y ctrl+x

1.5 Gestión de los Servicios

Comando Acción
docker-compose up -d Inicia la infraestructura completa; descarga las imágenes en la primera ejecución.
docker-compose down Detiene todos los servicios de forma controlada y elimina los contenedores.
docker-compose up --force-recreate [servicio] -d Reconstruye un contenedor específico tras realizar cambios en su configuración.
docker-compose start [servicio] Inicia el contenedor.
docker-compose stop [servicio] Detiene un contenedor.

1.5.1 Nombre de los servicios

A continuación se listan los nombres de los servicios de la infraestructura, información útil para ejecutar los comandos de inicio, parada o reconstrucción de la tabla anterior.

  • Financieros: lnd, cashu (Mint), lnbits.
  • Gestión y Red: lit (Lightning Terminal), npm (Proxy Manager), tor, orchard.
  • Persistencia: db (PostgreSQL), redis.

1.6 Iniciando la Infraestructura

Para iniciar la infraestructura ejecutamos:

docker-compose up -d

La primera vez que se ejecuta este comando se descargan las imágenes de docker de los servicios.

Imagen 11: Descarga de las imágenes en el proceso de inicio

Descarga de imágenes

Si el paso anterior se completó sin contratiempos, verificamos el estado de los contenedores ejecutando:

docker ps

Nos mostrará los contenedores en ejecución.

Imagen 12: Listado de contenedores en ejecución

Listado de contenedores