Initial commit: Documentación completa del proyecto WhatsApp Centralizado
- README principal con descripción del proyecto - Documento de diseño completo (arquitectura, DB, flujos) - Documentación de API REST y WebSocket - Guía del Flow Builder (30+ tipos de nodos) - Documentación de integración con Odoo - Guía de despliegue con Docker - Esquema de base de datos - Estructura de carpetas del proyecto - Archivo .env.example con todas las variables Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
539
docs/deployment/README.md
Normal file
539
docs/deployment/README.md
Normal file
@@ -0,0 +1,539 @@
|
||||
# Guía de Despliegue
|
||||
|
||||
## Requisitos del Servidor
|
||||
|
||||
### Hardware Mínimo
|
||||
- **CPU:** 2 cores
|
||||
- **RAM:** 4 GB
|
||||
- **Disco:** 50 GB SSD
|
||||
|
||||
### Hardware Recomendado
|
||||
- **CPU:** 4 cores
|
||||
- **RAM:** 8 GB
|
||||
- **Disco:** 100 GB SSD
|
||||
|
||||
### Software
|
||||
- Ubuntu 22.04 LTS (recomendado) o Debian 12
|
||||
- Docker 24.0+
|
||||
- Docker Compose 2.20+
|
||||
- Git
|
||||
|
||||
---
|
||||
|
||||
## Instalación
|
||||
|
||||
### 1. Preparar Servidor
|
||||
|
||||
```bash
|
||||
# Actualizar sistema
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# Instalar Docker
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sudo sh get-docker.sh
|
||||
|
||||
# Agregar usuario al grupo docker
|
||||
sudo usermod -aG docker $USER
|
||||
|
||||
# Instalar Docker Compose
|
||||
sudo apt install docker-compose-plugin -y
|
||||
|
||||
# Verificar instalación
|
||||
docker --version
|
||||
docker compose version
|
||||
```
|
||||
|
||||
### 2. Clonar Repositorio
|
||||
|
||||
```bash
|
||||
cd /opt
|
||||
sudo git clone https://git.consultoria-as.com/tu-usuario/WhatsAppCentralizado.git
|
||||
sudo chown -R $USER:$USER WhatsAppCentralizado
|
||||
cd WhatsAppCentralizado
|
||||
```
|
||||
|
||||
### 3. Configurar Variables de Entorno
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
nano .env
|
||||
```
|
||||
|
||||
**Variables requeridas:**
|
||||
|
||||
```bash
|
||||
# Base de datos
|
||||
DB_USER=whatsapp_admin
|
||||
DB_PASSWORD=<password_seguro_32_caracteres>
|
||||
|
||||
# JWT Secret (generar aleatorio)
|
||||
JWT_SECRET=<secreto_aleatorio_64_caracteres>
|
||||
|
||||
# Dominio
|
||||
DOMAIN=chat.tuempresa.com
|
||||
|
||||
# Odoo (opcional, configurar después)
|
||||
ODOO_URL=https://odoo.tuempresa.com
|
||||
ODOO_DB=production
|
||||
ODOO_USER=api-whatsapp@tuempresa.com
|
||||
ODOO_API_KEY=<api_key_de_odoo>
|
||||
|
||||
# OpenAI (opcional, para AI Response)
|
||||
OPENAI_API_KEY=sk-...
|
||||
```
|
||||
|
||||
**Generar secrets:**
|
||||
```bash
|
||||
# Generar password DB
|
||||
openssl rand -base64 32
|
||||
|
||||
# Generar JWT secret
|
||||
openssl rand -base64 64
|
||||
```
|
||||
|
||||
### 4. Construir e Iniciar
|
||||
|
||||
```bash
|
||||
# Construir imágenes
|
||||
docker compose build
|
||||
|
||||
# Iniciar servicios
|
||||
docker compose up -d
|
||||
|
||||
# Ver logs
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
### 5. Inicializar Base de Datos
|
||||
|
||||
```bash
|
||||
# Aplicar migraciones
|
||||
docker compose exec api-gateway alembic upgrade head
|
||||
|
||||
# Crear usuario admin
|
||||
docker compose exec api-gateway python scripts/create_admin.py
|
||||
```
|
||||
|
||||
### 6. Configurar SSL con Let's Encrypt
|
||||
|
||||
```bash
|
||||
# Instalar certbot
|
||||
sudo apt install certbot -y
|
||||
|
||||
# Obtener certificado
|
||||
sudo certbot certonly --standalone -d chat.tuempresa.com
|
||||
|
||||
# Los certificados quedan en:
|
||||
# /etc/letsencrypt/live/chat.tuempresa.com/fullchain.pem
|
||||
# /etc/letsencrypt/live/chat.tuempresa.com/privkey.pem
|
||||
|
||||
# Copiar a directorio del proyecto
|
||||
sudo cp /etc/letsencrypt/live/chat.tuempresa.com/fullchain.pem nginx/ssl/cert.pem
|
||||
sudo cp /etc/letsencrypt/live/chat.tuempresa.com/privkey.pem nginx/ssl/key.pem
|
||||
|
||||
# Reiniciar nginx
|
||||
docker compose restart nginx
|
||||
```
|
||||
|
||||
### 7. Configurar Renovación Automática
|
||||
|
||||
```bash
|
||||
# Crear script de renovación
|
||||
sudo nano /etc/cron.d/certbot-renew
|
||||
```
|
||||
|
||||
```
|
||||
0 3 * * * root certbot renew --quiet --post-hook "cp /etc/letsencrypt/live/chat.tuempresa.com/*.pem /opt/WhatsAppCentralizado/nginx/ssl/ && docker compose -f /opt/WhatsAppCentralizado/docker-compose.yml restart nginx"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuración de Nginx
|
||||
|
||||
### nginx/nginx.conf
|
||||
|
||||
```nginx
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
upstream frontend {
|
||||
server frontend:80;
|
||||
}
|
||||
|
||||
upstream api {
|
||||
server api-gateway:8000;
|
||||
}
|
||||
|
||||
upstream websocket {
|
||||
server whatsapp-core:3001;
|
||||
}
|
||||
|
||||
# Redirect HTTP to HTTPS
|
||||
server {
|
||||
listen 80;
|
||||
server_name chat.tuempresa.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
# HTTPS Server
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name chat.tuempresa.com;
|
||||
|
||||
ssl_certificate /etc/nginx/ssl/cert.pem;
|
||||
ssl_certificate_key /etc/nginx/ssl/key.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
|
||||
ssl_prefer_server_ciphers off;
|
||||
|
||||
# Security headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
|
||||
# Frontend
|
||||
location / {
|
||||
proxy_pass http://frontend;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
# API
|
||||
location /api {
|
||||
proxy_pass http://api;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# Timeouts para operaciones largas
|
||||
proxy_read_timeout 300;
|
||||
proxy_connect_timeout 300;
|
||||
proxy_send_timeout 300;
|
||||
}
|
||||
|
||||
# Auth endpoints
|
||||
location /auth {
|
||||
proxy_pass http://api;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
|
||||
# WebSocket
|
||||
location /ws {
|
||||
proxy_pass http://websocket;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_read_timeout 86400;
|
||||
}
|
||||
|
||||
# Webhook de Odoo
|
||||
location /api/odoo/webhook {
|
||||
proxy_pass http://api;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
|
||||
# Media files
|
||||
location /media {
|
||||
alias /var/www/media;
|
||||
expires 30d;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Backups
|
||||
|
||||
### Script de Backup
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# /opt/WhatsAppCentralizado/scripts/backup.sh
|
||||
|
||||
BACKUP_DIR="/opt/backups/whatsapp"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
RETENTION_DAYS=30
|
||||
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# Backup PostgreSQL
|
||||
docker compose exec -T postgres pg_dump -U $DB_USER whatsapp_central | gzip > $BACKUP_DIR/db_$DATE.sql.gz
|
||||
|
||||
# Backup sesiones WhatsApp
|
||||
tar -czf $BACKUP_DIR/sessions_$DATE.tar.gz -C /var/lib/docker/volumes whatsapp_sessions
|
||||
|
||||
# Backup configuración
|
||||
tar -czf $BACKUP_DIR/config_$DATE.tar.gz .env docker-compose.yml nginx/
|
||||
|
||||
# Eliminar backups antiguos
|
||||
find $BACKUP_DIR -type f -mtime +$RETENTION_DAYS -delete
|
||||
|
||||
echo "Backup completado: $DATE"
|
||||
```
|
||||
|
||||
### Programar Backup
|
||||
|
||||
```bash
|
||||
# Editar crontab
|
||||
crontab -e
|
||||
```
|
||||
|
||||
```
|
||||
# Backup diario a las 3 AM
|
||||
0 3 * * * /opt/WhatsAppCentralizado/scripts/backup.sh >> /var/log/whatsapp-backup.log 2>&1
|
||||
```
|
||||
|
||||
### Restaurar Backup
|
||||
|
||||
```bash
|
||||
# Restaurar base de datos
|
||||
gunzip -c backup/db_20240115.sql.gz | docker compose exec -T postgres psql -U $DB_USER whatsapp_central
|
||||
|
||||
# Restaurar sesiones
|
||||
docker compose down
|
||||
tar -xzf backup/sessions_20240115.tar.gz -C /var/lib/docker/volumes
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Monitoreo
|
||||
|
||||
### Logs
|
||||
|
||||
```bash
|
||||
# Ver todos los logs
|
||||
docker compose logs -f
|
||||
|
||||
# Ver logs de servicio específico
|
||||
docker compose logs -f api-gateway
|
||||
docker compose logs -f whatsapp-core
|
||||
|
||||
# Ver últimas 100 líneas
|
||||
docker compose logs --tail=100 api-gateway
|
||||
```
|
||||
|
||||
### Healthchecks
|
||||
|
||||
```bash
|
||||
# Estado de contenedores
|
||||
docker compose ps
|
||||
|
||||
# Uso de recursos
|
||||
docker stats
|
||||
```
|
||||
|
||||
### Verificar Servicios
|
||||
|
||||
```bash
|
||||
# API
|
||||
curl -s https://chat.tuempresa.com/api/health | jq
|
||||
|
||||
# Frontend
|
||||
curl -I https://chat.tuempresa.com
|
||||
|
||||
# WebSocket
|
||||
wscat -c wss://chat.tuempresa.com/ws
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Actualización
|
||||
|
||||
### Proceso de Actualización
|
||||
|
||||
```bash
|
||||
cd /opt/WhatsAppCentralizado
|
||||
|
||||
# Hacer backup primero
|
||||
./scripts/backup.sh
|
||||
|
||||
# Obtener cambios
|
||||
git pull origin main
|
||||
|
||||
# Reconstruir imágenes
|
||||
docker compose build
|
||||
|
||||
# Aplicar migraciones
|
||||
docker compose exec api-gateway alembic upgrade head
|
||||
|
||||
# Reiniciar servicios
|
||||
docker compose up -d
|
||||
|
||||
# Verificar logs
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
### Rollback
|
||||
|
||||
```bash
|
||||
# Volver a versión anterior
|
||||
git checkout <commit_anterior>
|
||||
|
||||
# Reconstruir
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
|
||||
# Restaurar base de datos si es necesario
|
||||
gunzip -c backup/db_<fecha>.sql.gz | docker compose exec -T postgres psql -U $DB_USER whatsapp_central
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Problemas Comunes
|
||||
|
||||
#### Contenedor no inicia
|
||||
```bash
|
||||
# Ver logs detallados
|
||||
docker compose logs <servicio>
|
||||
|
||||
# Verificar configuración
|
||||
docker compose config
|
||||
```
|
||||
|
||||
#### Error de conexión a PostgreSQL
|
||||
```bash
|
||||
# Verificar que postgres está corriendo
|
||||
docker compose ps postgres
|
||||
|
||||
# Verificar credenciales
|
||||
docker compose exec postgres psql -U $DB_USER -d whatsapp_central
|
||||
```
|
||||
|
||||
#### WhatsApp no conecta
|
||||
```bash
|
||||
# Verificar logs de whatsapp-core
|
||||
docker compose logs whatsapp-core
|
||||
|
||||
# Verificar sesiones
|
||||
ls -la volumes/whatsapp_sessions/
|
||||
|
||||
# Reiniciar servicio
|
||||
docker compose restart whatsapp-core
|
||||
```
|
||||
|
||||
#### Frontend no carga
|
||||
```bash
|
||||
# Verificar build
|
||||
docker compose logs frontend
|
||||
|
||||
# Reconstruir frontend
|
||||
docker compose build frontend
|
||||
docker compose up -d frontend
|
||||
```
|
||||
|
||||
### Comandos Útiles
|
||||
|
||||
```bash
|
||||
# Reiniciar todo
|
||||
docker compose restart
|
||||
|
||||
# Reiniciar servicio específico
|
||||
docker compose restart api-gateway
|
||||
|
||||
# Reconstruir sin cache
|
||||
docker compose build --no-cache
|
||||
|
||||
# Limpiar volúmenes (¡CUIDADO!)
|
||||
docker compose down -v
|
||||
|
||||
# Ver uso de disco
|
||||
docker system df
|
||||
|
||||
# Limpiar imágenes no usadas
|
||||
docker image prune -a
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Seguridad
|
||||
|
||||
### Firewall
|
||||
|
||||
```bash
|
||||
# Instalar ufw
|
||||
sudo apt install ufw
|
||||
|
||||
# Configurar reglas
|
||||
sudo ufw default deny incoming
|
||||
sudo ufw default allow outgoing
|
||||
sudo ufw allow ssh
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
|
||||
# Activar
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
### Fail2ban
|
||||
|
||||
```bash
|
||||
# Instalar
|
||||
sudo apt install fail2ban
|
||||
|
||||
# Configurar para nginx
|
||||
sudo nano /etc/fail2ban/jail.local
|
||||
```
|
||||
|
||||
```ini
|
||||
[nginx-http-auth]
|
||||
enabled = true
|
||||
port = http,https
|
||||
logpath = /var/log/nginx/error.log
|
||||
maxretry = 3
|
||||
bantime = 3600
|
||||
```
|
||||
|
||||
### Actualizaciones de Seguridad
|
||||
|
||||
```bash
|
||||
# Habilitar actualizaciones automáticas
|
||||
sudo apt install unattended-upgrades
|
||||
sudo dpkg-reconfigure unattended-upgrades
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Escalamiento
|
||||
|
||||
### Múltiples Números WhatsApp
|
||||
|
||||
Para manejar muchos números, escalar whatsapp-core:
|
||||
|
||||
```yaml
|
||||
# docker-compose.override.yml
|
||||
services:
|
||||
whatsapp-core:
|
||||
deploy:
|
||||
replicas: 3
|
||||
volumes:
|
||||
- whatsapp_sessions:/app/sessions
|
||||
```
|
||||
|
||||
### Alta Disponibilidad
|
||||
|
||||
Para producción de alta disponibilidad:
|
||||
|
||||
1. **Load Balancer** externo (HAProxy, AWS ALB)
|
||||
2. **PostgreSQL** en cluster (Patroni) o managed (RDS)
|
||||
3. **Redis** en cluster o managed (ElastiCache)
|
||||
4. **Storage** compartido para sesiones (NFS, EFS)
|
||||
|
||||
---
|
||||
|
||||
## Contacto
|
||||
|
||||
Para soporte técnico, contactar al equipo de desarrollo.
|
||||
Reference in New Issue
Block a user