Files
whatsapp/GUIA_HESTIA_SSE.md
T
2026-01-27 15:04:51 -05:00

271 lines
6.0 KiB
Markdown

# 🚀 Configuración SSE para HestiaCP
## ✅ Pasos para Activar SSE en tu Servidor HestiaCP
### 1. Verificar que el código esté en el servidor
```bash
# Subir por FTP/SFTP o Git
cd /home/tu-usuario/web/tu-dominio.com/public_html/
ls -la api/sse_events.php # Debe existir
```
### 2. Configurar Apache para SSE (si usas Apache)
**Opción A: Editar .htaccess en la raíz**
```apache
# Agregar al final de .htaccess
<IfModule mod_headers.c>
# SSE Headers
<FilesMatch "sse_events\.php$">
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set X-Accel-Buffering "no"
SetEnv no-gzip 1
</FilesMatch>
</IfModule>
```
**Opción B: Crear .htaccess específico en /api/**
```bash
cd /home/tu-usuario/web/tu-dominio.com/public_html/api/
nano .htaccess
```
Contenido:
```apache
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set X-Accel-Buffering "no"
SetEnv no-gzip 1
</IfModule>
# Prevenir timeout en SSE
<IfModule mod_fcgid.c>
FcgidIOTimeout 300
</IfModule>
```
### 3. Ajustar PHP-FPM (Recomendado)
Editar configuración PHP-FPM en HestiaCP:
1. **Panel HestiaCP****Web****tu dominio****Edit**
2. **Backend Template**: PHP-FPM
3. **PHP Version**: 8.x
Luego editar el archivo de configuración (vía SSH):
```bash
# Ubicación típica en HestiaCP
sudo nano /etc/php/8.2/fpm/pool.d/tu-usuario.conf
# Agregar o modificar:
request_terminate_timeout = 300s
pm.max_requests = 500
```
Reiniciar PHP-FPM:
```bash
sudo systemctl restart php8.2-fpm
```
### 4. Verificar Nginx (si usas Nginx)
Si tu dominio usa Nginx como proxy, editar la configuración:
```bash
sudo nano /etc/nginx/conf.d/domains/tu-dominio.com.conf
```
Agregar dentro del bloque `location ~ \.php$`:
```nginx
# Configuración especial para SSE
location ~ ^/api/sse_events\.php$ {
fastcgi_buffering off;
proxy_buffering off;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
}
```
Reiniciar Nginx:
```bash
sudo systemctl restart nginx
```
### 5. Probar SSE desde el servidor
```bash
# Conectar por SSH a tu servidor
ssh usuario@tu-dominio.com
# Probar SSE
curl -N -m 5 'https://tu-dominio.com/api/sse_events.php?token=demo_token'
```
**Respuesta esperada:**
```
event: connected
data: {"timestamp":1706300000,"user_id":"token_12345678","mode":"authenticated","status":"ready"}
: heartbeat
```
Si ves esto, **SSE está funcionando**
### 6. Probar desde el navegador
1. Abrir tu sitio: `https://tu-dominio.com/conversations.php`
2. Abrir Consola del navegador (F12 → Console)
3. Buscar:
```
Conectando a SSE para eventos en tiempo real...
SSE URL: https://tu-dominio.com/api/sse_events.php?token=...
✅ SSE conectado (🔐 autenticado): {...}
```
### 7. Solución de Problemas
#### Error: "Failed to fetch" o timeout
**Causa**: Firewall o mod_security bloqueando
**Solución**:
```bash
# Desactivar mod_security para SSE (temporal)
sudo a2dismod security2
sudo systemctl restart apache2
# O agregar excepción en .htaccess:
<IfModule mod_security2.c>
SecRuleEngine Off
</IfModule>
```
#### Error: "EventSource's response has a MIME type"
**Causa**: Headers incorrectos
**Solución**: Verificar que sse_events.php tenga:
```php
header('Content-Type: text/event-stream');
```
#### Error: Conexión se cierra cada 30 segundos
**Causa**: Timeout de proxy
**Solución**: Aumentar timeouts en nginx.conf o apache2.conf:
```
# Apache
Timeout 300
KeepAliveTimeout 300
# Nginx
proxy_read_timeout 300s;
```
### 8. Configuración de Seguridad (Producción)
#### A. Token seguro en vez de demo_token
Editar `api/sse_events.php`:
```php
// Generar token en login
$_SESSION['sse_token'] = bin2hex(random_bytes(32));
// Validar token en SSE
$token = $_GET['token'] ?? null;
if ($token && isset($_SESSION['sse_token']) && $token === $_SESSION['sse_token']) {
$authenticated = true;
}
```
En `conversations.php`:
```javascript
// Usar token de sesión
const token = '<?php echo $_SESSION['sse_token'] ?? 'demo_token'; ?>';
const sseUrl = `${baseUrl}/api/sse_events.php?token=${token}&t=${Date.now()}`;
```
#### B. Restringir acceso por IP (opcional)
En `.htaccess`:
```apache
<FilesMatch "sse_events\.php$">
# Solo permitir desde localhost o IPs específicas
Require ip 127.0.0.1
Require ip tu.ip.publica
</FilesMatch>
```
### 9. Monitoreo
Ver conexiones SSE activas:
```bash
# Ver procesos PHP activos
ps aux | grep sse_events
# Ver logs de errores
tail -f /var/log/php8.2-fpm.log
tail -f /var/log/apache2/error.log
tail -f /var/log/nginx/error.log
```
### 10. Performance
Para muchos usuarios simultáneos:
```bash
# Aumentar límites PHP-FPM
sudo nano /etc/php/8.2/fpm/pool.d/tu-usuario.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
```
---
## 🎯 Checklist de Verificación
- [ ] Archivo `api/sse_events.php` subido al servidor
- [ ] `.htaccess` configurado con headers SSE
- [ ] PHP-FPM timeout aumentado a 300s
- [ ] Nginx/Apache configurado (si aplica)
- [ ] Test con curl funciona (muestra "event: connected")
- [ ] Test desde navegador funciona (console.log muestra "✅ SSE conectado")
- [ ] Token de seguridad configurado (no usar demo_token en producción)
- [ ] Firewall/mod_security permite conexiones largas
---
## 📞 Soporte HestiaCP
Si tienes problemas:
1. **Panel HestiaCP**: https://tu-dominio.com:8083
2. **Logs**: Panel → Log Files
3. **SSH**: Usuario y contraseña en el panel
4. **Documentación**: https://docs.hestiacp.com/
---
## ✅ Resultado Esperado
Una vez configurado correctamente:
```
ANTES (desarrollo local):
http://localhost:8000/api/sse_events.php
❌ Timeout (servidor PHP built-in no soporta SSE)
AHORA (producción HestiaCP):
https://tu-dominio.com/api/sse_events.php
✅ Conectado - eventos en tiempo real < 1 segundo
```
**¡Tu sistema de notificaciones en tiempo real estará funcionando!** 🚀