Arquitectura micro-frontends
Zentto divide su frontend en 13 aplicaciones Next.js independientes, cada una corriendo en su propio puerto. Una app shell actúa como punto de entrada y orquesta la navegación entre módulos. Todas comparten paquetes comunes via npm workspaces.
Mapa de puertos
| App | Puerto | Ruta | Descripción |
|---|---|---|---|
| shell | 3000 | / | Dashboard principal, login, navegación |
| contabilidad | 3001 | /contabilidad | Plan de cuentas, asientos, reportes |
| pos | 3002 | /pos | Punto de venta |
| cuentas-cobrar | 3003 | /cuentas-cobrar | Cuentas por cobrar, facturas, cobros |
| cuentas-pagar | 3004 | /cuentas-pagar | Cuentas por pagar, pagos, retenciones |
| inventario | 3005 | /inventario | Productos, almacenes, movimientos |
| maestros | 3006 | /maestros | Clientes, proveedores, contactos |
| fiscal | 3007 | /fiscal | Impuestos, retenciones, declaraciones |
| configuracion | 3008 | /configuracion | Empresa, usuarios, roles, permisos |
| restaurante | 3009 | /restaurante | Mesas, comandas, cocina |
| bancos | 3010 | /bancos | Conciliación bancaria, movimientos |
| nomina | 3011 | /nomina | Empleados, nómina, prestaciones |
| store | 3012 | /store | Tienda online (Zentto Store) |
Cómo el Shell orquesta las apps
La app shell es el punto de entrada único. Nginx enruta todas las solicitudes
a zentto.net/* al shell en el puerto 3000. Cuando el usuario navega a un módulo
(ej. /inventario), el shell realiza un proxy interno al puerto correspondiente.
// next.config.ts (shell)
async rewrites() {
return [
{ source: '/contabilidad/:path*', destination: 'http://localhost:3001/contabilidad/:path*' },
{ source: '/pos/:path*', destination: 'http://localhost:3002/pos/:path*' },
{ source: '/inventario/:path*', destination: 'http://localhost:3005/inventario/:path*' },
// ... demás módulos
];
}
PM2 en Docker
Dentro del contenedor Docker de frontend, PM2 gestiona las 13 aplicaciones
como procesos independientes. El archivo docker/pm2.config.cjs define cada app:
// docker/pm2.config.cjs
module.exports = {
apps: [
{ name: 'shell', script: 'apps/shell/.next/standalone/server.js', env: { PORT: 3000 } },
{ name: 'contabilidad', script: 'apps/contabilidad/.next/standalone/server.js', env: { PORT: 3001 } },
{ name: 'pos', script: 'apps/pos/.next/standalone/server.js', env: { PORT: 3002 } },
// ... demás apps
]
};
Paquetes compartidos
@zentto/shared-ui
Componentes reutilizables: DataTable, FormDialog, PageHeader, StatusChip, etc. Basados en MUI + Tailwind.
@zentto/shared-auth
Configuración NextAuth, provider de sesión, hooks de autenticación
(useSession, usePermissions).
@zentto/shared-api
Fetch helpers tipados, funciones de formato de fechas (formatDate,
formatDateTime), hook useTimezone.
Cómo agregar una nueva micro-app
- Crear la app:
cd web/modular-frontend/apps npx create-next-app@latest mi-modulo --typescript --tailwind - Configurar
next.config.tsconbasePath: '/mi-modulo'youtput: 'standalone'. - Agregar dependencias compartidas en
package.json:"dependencies": { "@zentto/shared-ui": "workspace:*", "@zentto/shared-auth": "workspace:*", "@zentto/shared-api": "workspace:*" } - Registrar en el shell — agregar rewrite en
apps/shell/next.config.ts. - Agregar a PM2 — nueva entrada en
docker/pm2.config.cjscon el puerto asignado. - Agregar al Dockerfile — incluir el build de la nueva app en
docker/Dockerfile.frontend.