Actualmente en pruebas: el código de GitHub se abrirá al finalizar.

Despliegue del servidor Ticketing

Entorno
Shell
Modo
bash
Ejemplo de conexión del cliente
rust
Prueba rápida con nc
bash

Variables de entorno

La configuración del servidor se hace exclusivamente mediante variables de entorno. Las claves no distinguen mayúsculas de minúsculas, un valor vacío cuenta como no definido, y los valores de tipo indicador solo son verdaderos con 1/true/yes/on. La imagen de Docker se basa en scratch, así que la configuración se inyecta únicamente mediante variables de entorno, sin ningún archivo de configuración.

Variable de entornoValor por defectoDescripción
PORT5225Puerto de escucha en modo único. Se ignora en modo clúster, donde se usa en su lugar el puerto de CLUSTER_SELF
SOCKET_BIND0.0.0.0Dirección de escucha
CLIENT_TOKENS(ninguno)Lista de tokens de autenticación de clientes separados por comas. Si no está definida, se permite un token vacío
CLUSTER_SELF(ninguno)La dirección anunciada de este nodo, host:port. Su presencia activa el modo clúster
CLUSTER_PEERS(ninguno)Lista separada por comas de la dirección anunciada de cada nodo. Exactamente 3 o 5, mismo orden en todos los nodos, debe incluir self
CLUSTER_TOKENS(ninguno)Lista de tokens de autenticación entre pares separados por comas
TLS_CERT / TLS_KEY(ninguno)Rutas a los archivos PEM del certificado y la clave privada — defínelos juntos para activar TLS
TLS_CA(ninguno)CA para verificar los certificados de los pares — recurre al almacén de confianza del sistema si no está definida
TLS_SKIP_VERIFYfalseOmite la verificación del certificado del par — solo para pruebas
DOCKERfalseFija los puertos de escucha internos en 5225/6225 en modo clúster — activado por defecto en la imagen oficial
DEBUGsegún la compilación1/true activa el registro de depuración

Para las reglas completas (derivación de puertos, direcciones anunciadas, rotación de tokens sin tiempo de inactividad, etc.) consulta Configuración (variables de entorno).

Único vs. clúster

  • Único (1 nodo): sin CLUSTER_*, el nodo funciona de forma independiente. El más rápido, pero hay un breve corte al reiniciar, y el estado está en memoria, así que se pierde al reiniciar (lease es la red de seguridad).
  • Clúster (sin interrupciones): 3 o 5 nodos. Los nodos comparten un único estado de bloqueo mediante consenso Raft — solo el líder atiende las solicitudes, y cada cambio de estado solo se confirma tras un commit de mayoría. Si el líder muere, se elige uno nuevo en 0,5-1 segundo, y mientras siga viva una mayoría, el estado del bloqueo y el servicio siguen funcionando. Consulta Cómo funciona y Protocolo (clúster) para la explicación completa.
  • Cada nodo del clúster escucha en el puerto de cliente además de un puerto Raft (puerto de cliente + 1000) — abre ambos puertos en tu firewall.

Los despliegues de clúster en Kubernetes usan un StatefulSet + Service headless. Dale a cada pod un nombre DNS estable (ticketing-0.ticketing…, ticketing-1.ticketing…), pon esos nombres en CLUSTER_PEERS, e inyecta automáticamente el CLUSTER_SELF de cada pod mediante la downward API (metadata.name).

Reinicio sin interrupciones (progresivo)

Hay una regla central — siempre debe seguir viva una mayoría (como máximo 1 de 3 caído a la vez).

  1. Reinicia primero los seguidores, uno a uno. En cuanto un nodo reiniciado se pone al día mediante replicación o un snapshot, pasa al siguiente.
  2. Por último, baja el líder — se elige uno nuevo en 0,5-1 segundo, y los clientes cambian de forma transparente.
  3. Volver a levantar un nodo caído lo reincorpora como seguidor.

Consulta Procedimiento de reinicio progresivo para los pasos detallados.

Referencia