Appearance
Infraestructura y Deployment
Opciones de Infraestructura
Opción 1: VPS Compartido (Recomendado para MVP)
Stack requerido:
- Ubuntu 22.04 LTS
- Apache con mod_proxy (o Nginx)
- PHP 8.2-FPM
- PostgreSQL 14+
- Node.js 18+ (solo para build, NO en runtime)
- Redis (opcional - cache y rate limiting)
Ventajas:
- Costo bajo
- Control total
- Simple de configurar
Desventajas:
- Escalabilidad limitada
- Requiere mantenimiento manual
Opción 2: Contenedores (Docker)
Servicios:
- Backend: PHP-FPM + Slim Framework
- Frontend: Nginx sirviendo archivos estáticos
- Postgres: Base de datos multi-tenant
- Redis: Cache y rate limiting
Ventajas:
- Aislamiento de servicios
- Fácil de replicar
- Escalable horizontalmente
Configuración DNS
Wildcard DNS
Permite múltiples subdominios automáticamente:
*.bautista.com → A record → 123.45.67.89Habilita:
ctacte.bautista.comempresaA.bautista.comclubXYZ.bautista.com
Dominios Personalizados
Para clientes que quieren su propio dominio:
ctacte.empresaA.com → CNAME → portal.bautista.com
portal.clubXYZ.com → CNAME → portal.bautista.comProceso:
- Cliente configura CNAME en su DNS
- Se agrega dominio a
tenant_domains - Se genera certificado SSL
- Se agrega ServerAlias en configuración de servidor
SSL/TLS
Wildcard Certificate
Un solo certificado para todos los subdominios:
*.bautista.combautista.com
Ventajas:
- Un solo certificado para mantener
- Nuevos subdominios funcionan inmediatamente
Herramienta: Let's Encrypt con certbot
Certificados Individuales
Generar certificado por cada dominio personalizado.
Cuando usar:
- Dominios personalizados de clientes (ej:
ctacte.empresaA.com)
Auto-renewal: Configurar renovación automática cada 60 días.
Servidor Web
Configuración Principal
Frontend (Vite build estático):
- Servir archivos desde
/dist/ - SPA routing: todas las rutas →
index.html - Cache busting para assets con hash
- Headers de seguridad (HSTS, CSP)
Backend (API proxy):
- Proxy
/api/*→ Backend PHP en puerto 8000 - Agregar header
X-Client-Domaincon el dominio del request - Timeout de 60 segundos
HTTP → HTTPS:
- Redirect permanente de puerto 80 a 443
Build y Deploy
Backend
Pasos:
- Instalar dependencias PHP (
composer install) - Ejecutar migraciones de base de datos
- Configurar permisos de archivos
- Reiniciar PHP-FPM
Resultado: API REST disponible en /api/*
Frontend
Pasos:
- Instalar dependencias Node.js (
npm ci) - Build con Vite (
npm run build) - Copiar archivos de
dist/al servidor - Reload servidor web
Resultado:
- Build estático en
dist/ - NO requiere Node.js en producción
- Servidor web sirve archivos directamente
Deployment con Cero Downtime
Estrategia:
- Build en directorio temporal con timestamp
- Atomic symlink swap
- Reload servidor (sin restart completo)
Beneficio: Los usuarios no ven downtime durante deploy.
Configurar Nuevo Tenant
Pasos
Alta en base de datos:
- Insertar en
tenant_domainscon:domaindatabasebranding_config(colores, logo, nombre)
- Insertar en
Configurar DNS:
- CNAME del dominio del tenant → servidor principal
Generar SSL:
- Certificado para el dominio del tenant
Configurar servidor web:
- Agregar dominio como ServerAlias
Reload servidor:
- Aplicar cambios sin downtime
Script CLI
Automatizar el proceso con script que:
- Inserta en
tenant_domains - Guía configuración DNS
- Genera certificado SSL
- Actualiza configuración del servidor
Monitoreo
Logs a Monitorear
- Apache/Nginx: Access y error logs
- PHP-FPM: Error logs
- PostgreSQL: Query logs y error logs
- Aplicación: Logs estructurados (JSON)
Health Checks
Backend API:
GET /health
Response: { "status": "ok", "database": "connected" }Frontend:
GET /
Response: 200 OKDatabase:
- Verificar conexión
- Count de tenant_domains activos
Métricas Importantes
- Tiempo de respuesta de API
- Tasa de error (5xx)
- Uso de CPU/RAM
- Conexiones a base de datos
- Rate de requests por tenant
Backup
Base de Datos
Diario:
- Backup completo de cada tenant
- Retention: 7 días
Semanal:
- Backup de todas las bases de datos
- Retention: 4 semanas
Mensual:
- Backup completo archivado
- Retention: 12 meses
Código
- Repositorio Git como backup principal
- Branches protegidos (main, develop)
Assets
- Logo y archivos de branding
- Backup semanal
Seguridad
Headers de Seguridad
Strict-Transport-Security: Forzar HTTPSContent-Security-Policy: Prevenir XSSX-Frame-Options: Prevenir clickjackingX-Content-Type-Options: Prevenir MIME sniffing
Firewall
- Puertos abiertos: 80, 443 (HTTP/HTTPS)
- Puertos cerrados: 5432 (PostgreSQL), 6379 (Redis)
- Solo backend puede acceder a DB/Redis
Rate Limiting
- Max 100 requests/minuto por IP
- Max 5 intentos de login/minuto
- Bloqueo temporal después de 3 fallos
Escalabilidad
Vertical (Más recursos)
- Aumentar CPU/RAM del servidor
- Optimizar queries de base de datos
- Agregar Redis para cache
Horizontal (Más servidores)
Frontend:
- CDN para assets estáticos
- Múltiples servidores con load balancer
Backend:
- Múltiples instancias PHP-FPM
- Load balancer (HAProxy, Nginx)
- Session sticky o JWT stateless
Database:
- Read replicas para consultas
- Connection pooling (PgBouncer)
Próximos Pasos
- Ver configuración avanzada de dominios en domains.md
- Configurar monitoreo con herramientas como Prometheus/Grafana
- Implementar CI/CD para deployment automático