Files
WhatsAppCentralizado/docs/deployment/README.md
Claude AI a92a7efccc 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>
2026-01-29 09:29:57 +00:00

540 lines
10 KiB
Markdown

# 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.