Despliegue y operación

Servicios

Servicios

Una instancia de lazyit es un pequeño conjunto de contenedores en un servidor. Esta página explica qué hace cada uno, para que sepas qué registros leer y qué es seguro reiniciar. El proxy inverso es el único servicio que publica puertos al servidor; todo lo demás vive en una red interna de Docker.

Los contenedores

Servicio Función Notas
caddy Proxy inverso + HTTPS automático El único servicio público. Enruta / a la web y /api/* a la API.
web La aplicación web (Next.js) Sirve la interfaz; gestiona el inicio de sesión en el servidor.
api La API (NestJS) Toda la lógica de negocio. También ejecuta los trabajos en segundo plano.
db PostgreSQL — la base de datos de la aplicación El sistema de registro. Guarda todos tus datos.
migrate Trabajo puntual de migración + semilla Se ejecuta una vez por despliegue y termina. Aplica las migraciones antes de que arranque la API.
valkey Intermediario de trabajos en segundo plano Respalda los trabajos asíncronos (p. ej. la importación de documentos, el motor de flujos).
meilisearch Motor de búsqueda Da soporte a la búsqueda transversal. Reconstruible desde la base de datos.
zitadel El proveedor de identidad incluido Gestiona el inicio de sesión. Tiene su propia base de datos.
zitadel_db PostgreSQL del proveedor de identidad Separada de la base de datos de la aplicación.

Con el proveedor de identidad incluido, un par de pequeños ayudantes puntuales se ejecutan en el primer arranque para configurar el inicio de sesión automáticamente: se completan y terminan. Con tu propio proveedor de identidad, los servicios de Zitadel se eliminan (consulta Proveedor de identidad).

Cómo encajan las piezas

  • El navegador solo habla con Caddy por HTTPS. Caddy reenvía las peticiones de página a web y las peticiones de API a api por la red interna. Como la web llama a la API en la ruta relativa /api, una misma imagen funciona en cualquier dominio.
  • api lee y escribe en db (PostgreSQL), envía trabajos en segundo plano a valkey y mantiene meilisearch sincronizado a medida que cambian los datos.
  • migrate se ejecuta primero en cada despliegue: aplica las migraciones y una pequeña semilla idempotente, luego termina. La API espera a que finalice con éxito antes de arrancar.
  • El inicio de sesión pasa por zitadel (o por tu propio proveedor). La API y la web validan los tokens que emite.

Dos bases de datos — ambas importan

La pila ejecuta dos bases de datos PostgreSQL: la de la aplicación (db) y la propia del proveedor de identidad (zitadel_db). Están separadas a propósito para poder respaldarlas de forma independiente y para que cambiar a tu propio proveedor de identidad sea una eliminación limpia.

Esta separación es lo más importante que hay que entender para la recuperación ante desastres: respaldar solo la base de datos de la aplicación deja a todo el mundo sin poder iniciar sesión, porque las cuentas viven en la base de datos del proveedor de identidad. Consulta Copias de seguridad y restauración.

Qué es y qué no es objetivo de copia de seguridad

  • db y zitadel_db guardan estado real: respalda ambas.
  • meilisearch es reconstruible: su índice se rehace desde las bases de datos con un comando de reindexado, así que sus datos no necesitan copia.
  • valkey solo guarda el estado de los trabajos en curso (PostgreSQL es el sistema de registro), así que tampoco es objetivo de copia. Sus datos sobreviven a los reinicios para no perder trabajos en cola.
  • caddy vuelve a obtener sus certificados automáticamente, por lo que su estado no necesita copia.

Límites de recursos y registros

Cada contenedor de larga duración tiene un tope modesto de memoria y CPU y una política de rotación de registros, de modo que un servicio descontrolado no pueda agotar el servidor y los registros no llenen el disco con el tiempo. Ajusta los límites a tu máquina si un servicio se queda corto — vigila docker stats. La guía completa de dimensionamiento está en el runbook de despliegue autoalojado.

Relacionado