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]>
64 lines
2.3 KiB
YAML
64 lines
2.3 KiB
YAML
# =============================================================================
|
|
# 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
|