# FRASA Ecosystem Ecosistema comercial de Frasa Desarrollos S.A.P.I. de C.V. ## Componentes | Componente | Ruta | Descripción | |---|---|---| | `apps/landing` | `/` | Entrada al ecosistema | | `apps/cotizador` | `/quote/` | Cotizador financiero (4 propuestas, PDF ANEXO A) | | `apps/alta-clientes` | `/client/` | Alta de clientes (wizard, firma digital, PDFs PLD) | | `apps/cobranza` | `/pay/` | Planes de enganche, vencidos, estados de cuenta | | `api-gateway` | `/api/` | Express 5 + Prisma + integración Monday.com | ## Desarrollo local Cada app es un proyecto Vite independiente: `npm install && npm run dev` (o `npm run preview` tras `npm run build`). Tests: `npx vitest run` en cada paquete. El API: `cd api-gateway && npm install && npx prisma migrate dev && npm run dev`. Variables de entorno: copiar `.env.example` a `.env` y completar (el `.env` nunca se commitea). ## Servidor actual (LXC sin Docker) Esta máquina es un contenedor LXC sin nesting: Docker no puede correr contenedores. El stack corre directo en el host: - **NGINX** (apt) sirve los `dist/` de las apps y proxifica `/api/` → `127.0.0.1:3000`. Config: `deploy/nginx-host.conf` → `/etc/nginx/sites-available/frasa`. - **API** como servicio systemd: `deploy/frasa-api.service` → `frasa-api.service` (`systemctl status frasa-api`, logs en `/var/log/frasa-api.log`). - Rebuild de apps tras cambios: `VITE_API_URL=/api npm run build` en cada app + `systemctl reload nginx` (no requiere restart). El `docker-compose.yml` queda listo para cuando el stack se mude a una VM con Docker. ## Deploy con Docker (VM futura) ```bash git clone https://git.consultoria-as.com/consultoria-as/FRASA-CAS.git /opt/frasa-ecosystem cd /opt/frasa-ecosystem cp .env.example .env && nano .env # completar secretos # SSL: webroot (funciona con nginx corriendo y renueva sin downtime) docker compose up -d nginx # primer arranque SIN ssl: ver nota abajo certbot certonly --webroot -w /var/www/certbot -d frasadesarrollos.ddns.net docker compose build && docker compose up -d docker compose logs -f api curl https://frasadesarrollos.ddns.net/api/health ``` Modo local sin SSL (LAN): `.env` con `NGINX_CONF=nginx.http.conf` hace que NGINX sirva todo por HTTP en el puerto 80. Cuando el DDNS apunte a este servidor: `certbot certonly --webroot -w /var/www/certbot -d frasadesarrollos.ddns.net`, quita `NGINX_CONF` del `.env` (vuelve `nginx.conf` con 443) y `docker compose restart nginx`. Renovación: `certbot renew --deploy-hook "docker compose -f /opt/frasa-ecosystem/docker-compose.yml restart nginx"`. Backup: `scripts/backup.sh` (cron sugerido `17 2 * * *`). ## Monday.com Workspace `Frasa-CAS`. Tableros: Contactos, Desarrollos, Unidades (inventario importado), Leads, Oportunidades, Apartado, Ventas. Los board IDs están en `.env.example`. Webhook: `POST /api/webhooks/monday` (responde el challenge de activación). ## Pendientes conocidos - Migrar Prisma de SQLite a Postgres 16 (dinero a `Decimal`). - Auth JWT, helmet, rate-limit, CORS restringido (hoy: red interna). - Self-hostear worker/wasm de tesseract.js (OCR sin internet). - Automatizaciones Monday (round-robin, recordatorios 10 días) y cron de cobranza en el API.