feat: sitio comercial FSPM con micro CRM interno
Sitio público orientado a venta consultiva e implementación de las recomendaciones de la auditoría de marca y mercado: - Inicio con tres rutas (industria, riesgo, cumplimiento) y clasificador de riesgo en el héroe, contra el hallazgo de que el visitante tenía que inferir qué solución le correspondía. - Cinco páginas por segmento prioritario y catálogo comparable por clase de fuego, capacidad y agente. - Los claims sin evidencia por modelo quedan aislados y se presentan como compromiso de documentación, nunca como característica del producto. - SEO técnico completo: metadatos por página, sitemap derivado de los datos, JSON-LD, iconos y tarjeta social generadas. Micro CRM: - Captura por formulario embebido y por widget de WhatsApp que registra antes de abrir la conversación. - Atribución de primer toque que sobrevive a la navegación. - Deduplicación de contacto; un mismo contacto acumula oportunidades. - Motor de asignación por reglas con reparto por turno de respaldo. - Panel con dos roles de alcance distinto, tablero analítico, bitácora, pedidos y reglas. No enlazado desde el sitio público y con noindex. Empaquetado en Docker multietapa con la base de demostración horneada en la imagen y el volumen de datos separado, para que los leads capturados sobrevivan a los redespliegues. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
122e06a4bb
commit
01b817d098
@@ -0,0 +1,63 @@
|
||||
# =============================================================================
|
||||
# Prueba local de la imagen de producción.
|
||||
#
|
||||
# docker compose up --build
|
||||
# → http://localhost:3000
|
||||
#
|
||||
# No es el archivo con el que se despliega en Coolify: allá la plataforma
|
||||
# construye la imagen y administra el volumen. Esto sirve para comprobar, antes
|
||||
# de subir, que la imagen arranca, que la base sobrevive a un reinicio y que la
|
||||
# sonda de salud responde. Ver docs/DESPLIEGUE.md.
|
||||
# =============================================================================
|
||||
|
||||
services:
|
||||
web:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
# Estas dos se hornean en el bundle durante `next build`: pasarlas solo
|
||||
# como environment no tendría efecto en el sitio.
|
||||
args:
|
||||
NEXT_PUBLIC_SITE_URL: "http://localhost:3000"
|
||||
NEXT_PUBLIC_WHATSAPP: "525540348395"
|
||||
|
||||
image: fspm-web:local
|
||||
container_name: fspm-web
|
||||
|
||||
ports:
|
||||
- "3000:3000"
|
||||
|
||||
environment:
|
||||
# Ruta absoluta dentro del contenedor. Debe caer dentro del volumen.
|
||||
DATABASE_URL: "file:/app/data/fspm.db"
|
||||
# Solo para la prueba local. En producción se genera uno nuevo:
|
||||
# openssl rand -base64 48
|
||||
AUTH_SECRET: "secreto-de-prueba-local-cambialo-en-produccion-por-favor"
|
||||
# Repetidas aquí para que el servidor las tenga; el bundle del navegador
|
||||
# ya las trae horneadas desde build.args.
|
||||
NEXT_PUBLIC_SITE_URL: "http://localhost:3000"
|
||||
NEXT_PUBLIC_WHATSAPP: "525540348395"
|
||||
# Acceso rápido de demostración en /admin/login. En un despliegue real
|
||||
# que alguien vaya a ver, ponlo en "false".
|
||||
DEMO_ACCESO_RAPIDO: "true"
|
||||
|
||||
volumes:
|
||||
# Volumen nombrado: es lo que hace que los leads capturados sobrevivan a
|
||||
# `docker compose up --build`. Si esta línea se borra, cada
|
||||
# reconstrucción empieza otra vez con la base de demostración.
|
||||
- fspm-datos:/app/data
|
||||
|
||||
restart: unless-stopped
|
||||
|
||||
# La sonda del Dockerfile ya cubre esto; se repite aquí para que
|
||||
# `docker compose ps` muestre el estado sin depender de la imagen.
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://127.0.0.1:3000/api/salud || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
start_period: 60s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
fspm-datos:
|
||||
name: fspm-datos
|
||||
Reference in New Issue
Block a user