Stack tecnológico
Zentto usa un stack homogéneo basado en TypeScript en frontend y backend, con PostgreSQL como
único motor de datos. Esta página cubre el monorepo del ERP (zentto-web) y el mapa
del ecosistema de repositorios que lo rodea.
Frontend (modular-frontend)
| Tecnología | Versión | Uso |
|---|---|---|
| Next.js | 16.x | Framework de cada micro-app (App Router) |
| React | 19.x | UI, componentes funcionales con hooks |
| TypeScript | 5.7+ | Tipado estático en todo el monorepo |
| Tailwind CSS + MUI | 3.x / 5.x | Tailwind para layout/utilidades; MUI para componentes complejos |
| NextAuth (Auth.js) | 5 beta | Sesión del shell — el credentials provider autentica contra
zentto-auth (auth.zentto.net) y guarda el JWT en cookie httpOnly |
| @zentto/datagrid | 1.7+ | Grid estándar de todas las tablas (regla: nunca <table> HTML) |
| @zentto/report-* | 1.9.x | Report Engine: diseñador WYSIWYG + visor paginado (alternativa a Crystal Reports) |
Backend (API del ERP)
| Tecnología | Versión | Uso |
|---|---|---|
| Node.js | 20 LTS | Runtime (imagen node:20-alpine, ESM) |
| Express | 4.x | HTTP, routing por módulos, cadena de middleware |
| pg (node-postgres) | 8.x | Driver PostgreSQL — pools por tenant (pg-pool-manager) |
| Zod | 3.x | Validación de payloads en routes |
| jsonwebtoken + jose | 9.x / 5.x | JWT propio (HS256) + verificación JWKS contra zentto-auth |
| bcrypt / otplib | 6.x / 13.x | Hash de contraseñas en Node (no en SQL) · TOTP del backoffice |
| @zentto/obs | 2.x | Observabilidad (logs/audit/perf/eventos) hacia Loki |
| swagger-ui-express | 5.x | Swagger UI en /docs (solo admins autenticados) |
| mssql | 10.x | Legacy congelado — la rama SQL Server sigue en el código pero ningún despliegue la usa; no escribir código nuevo contra ella |
Base de datos
| Componente | Detalle |
|---|---|
| PostgreSQL 16 | Único motor, dev y producción. En el host (no en Docker).
BD principal zentto_prod + BDs dedicadas por tenant Enterprise + BDs por microservicio |
| Goose | Migraciones (web/api/migrations/postgres/, 480+); se ejecutan en el deploy |
| PL/pgSQL | ~370 funciones usp_* en sqlweb-pg/includes/sp/; RLS por
app.current_company_id en el modelo multi-tenant compartido |
| SQL Server | Solo como origen legacy de migraciones de clientes DatQbox (Zentto Migrador) — no recibe cambios |
Infraestructura y DevOps
| Herramienta | Uso |
|---|---|
| Docker + ghcr.io | ~70 contenedores en producción; imágenes en GitHub Container Registry |
| PM2 | Process manager de las micro-apps Next.js dentro del contenedor frontend |
| Nginx | Reverse proxy, SSL wildcard, enrutamiento por subdominio (fuente: repo zentto-infra) |
| GitHub Actions | CI/CD con runners propios (zentto-ci, en el centro de
datos dev) para deploys/tests y runners hosted para el escaneo de seguridad
(detalle) |
| Cloudflare | DNS, CDN, DDoS, wildcard *.zentto.net, túnel del ambiente dev, Cloudflare Access (esta sección) |
| Vault (HashiCorp) | Almacén central de secretos (AppRole + KV v2); los servicios llevan solo bootstrap |
| Loki + Grafana | Observabilidad central en logs.zentto.net (detalle) |
| Verdaccio | Registry npm privado (npm.zentto.net) para paquetes @zentto/* sin cuarentena |
| Proxmox VE (dellxeon) | Centro de datos dev local: runners CI, ambiente dev completo, VM legacy, gateway (detalle) |
Ecosistema de repositorios (~70 repos)
| Categoría | Repos |
|---|---|
| ERP core | zentto-web (este monorepo) |
| Microservicios de plataforma | zentto-auth (SSO / broker de identidad único),
zentto-payments, zentto-notify (email/SMS/push/OTP + DocAI),
zentto-geo, zentto-kyc, zentto-timesheet,
zentto-cache, zentto-sites, zentto-migrator,
zentto-ocr, zentto-sms (gateway SMS Android) |
| Productos standalone | zentto-crm (CRM WhatsApp-first + APK),
zentto-pulse (Work OS gerencial + MCP + APK),
zentto-store (commerce white-label),
zentto-builder ("Zentto Data", BaaS),
zentto-consumer (BNPL "Locha"), zentto-broker |
| Verticales | hotel, medical, education,
rental, tickets, inmobiliario, pos,
restaurante, trader, web3 — patrón standalone:
API Express + Next.js propios, integrados al ERP por API |
| Fiscal Venezuela (SENIAT) | zentto-fiscal-agent (.NET, impresoras fiscales) + emulador,
zentto-imprenta-seniat, zentto-seniat-compliance |
| Móvil | Dos stacks: Capacitor (wrappers de web responsive como Pulse/Panel,
y apps con bundle propio como ventas, capture, consumer, store, tickets-scanner) y
Expo/React Native (zentto-mobile: monorepo con una app por módulo) |
| Web components (Lit/TS) | zentto-datagrid, zentto-board, zentto-gantt,
zentto-gauge, zentto-floorplan, zentto-studio, zentto-app-kit |
| Docs / sitios / tooling | zentto-erp-docs (este sitio), zentto-docs,
zentto-landings, zentto-cli, zentto-infra,
zentto-dev-stack, zentto-stress, zentto-report(-studio),
zentto-help-studio (videos tutoriales generados), *-releases (distribución pública) |
Monorepo y paquetes npm
web/modular-frontend usa npm workspaces (apps/* +
packages/*, 27 paquetes). Los paquetes publicables van al scope
@zentto/* — registry privado propio (Verdaccio) o npmjs privado.
web/modular-frontend/
├── apps/ # shell, contabilidad, pos, nomina, ... (una micro-app por módulo)
└── packages/
├── shared-ui/ # Componentes comunes (usa @zentto/datagrid)
├── shared-api/ # Fetch helpers tipados, hooks, timezone
├── shared-auth/ # NextAuth + TenantGuard + hooks de sesión
├── shared-i18n/ shared-reports/ design-tokens/ erp-ux/
├── vertical-auth/ vertical-layout/ landing-kit/ editor/ geo/
└── module-*/ # Lógica de cada módulo (module-pos, module-crm, ...) Decisiones de arquitectura relevantes
- Sin ORM — funciones PL/pgSQL llamadas por
callSp(), no Prisma/TypeORM - bcrypt en Node — la verificación de contraseñas ocurre en la API, no en SQL
- Identidad central en zentto-auth — el ERP verifica JWT contra su JWKS; cookies httpOnly, nunca localStorage
- UTC-0 obligatorio — middleware normaliza entrada y localiza salida
- Módulos reutilizables como paquetes — los verticales standalone consumen
@zentto/module-*desde el registry, no copian código - Multi-tenant híbrido — RLS por company en la BD compartida + BD dedicada para Enterprise