- 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>
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
# 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
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
cp .env.example .env
nano .env
Variables requeridas:
# 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:
# Generar password DB
openssl rand -base64 32
# Generar JWT secret
openssl rand -base64 64
4. Construir e Iniciar
# Construir imágenes
docker compose build
# Iniciar servicios
docker compose up -d
# Ver logs
docker compose logs -f
5. Inicializar Base de Datos
# 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
# 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
# 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
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
#!/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
# 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
# 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
# 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
# Estado de contenedores
docker compose ps
# Uso de recursos
docker stats
Verificar Servicios
# 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
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
# 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
# Ver logs detallados
docker compose logs <servicio>
# Verificar configuración
docker compose config
Error de conexión a PostgreSQL
# 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
# 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
# Verificar build
docker compose logs frontend
# Reconstruir frontend
docker compose build frontend
docker compose up -d frontend
Comandos Útiles
# 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
# 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
# Instalar
sudo apt install fail2ban
# Configurar para nginx
sudo nano /etc/fail2ban/jail.local
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 3
bantime = 3600
Actualizaciones de Seguridad
# 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:
# docker-compose.override.yml
services:
whatsapp-core:
deploy:
replicas: 3
volumes:
- whatsapp_sessions:/app/sessions
Alta Disponibilidad
Para producción de alta disponibilidad:
- Load Balancer externo (HAProxy, AWS ALB)
- PostgreSQL en cluster (Patroni) o managed (RDS)
- Redis en cluster o managed (ElastiCache)
- Storage compartido para sesiones (NFS, EFS)
Contacto
Para soporte técnico, contactar al equipo de desarrollo.