- Add production manual (docs/MANUAL_PRODUCCION.md) - Fix seed script to work without OpenAI API key (zero-vector fallback) - Fix alembic env to use database_url_str - Fix pyproject.toml hatch build config
15 KiB
Manual de Producción — SKEEN CRM AI Agent
Versión: 1.0
Fecha: 29 de abril de 2026
VM: 192.168.10.100 (Ubuntu 24.04 LTS)
Stack: Python 3.13, FastAPI, PostgreSQL 16 + pgvector, Redis 7, Celery, Docker
1. Resumen Ejecutivo
Este documento describe la instalación, configuración y operación del SKEEN CRM AI Agent, un agente de inteligencia artificial para WhatsApp Business API integrado con ERPNext Healthcare.
Servicios desplegados en la VM
| Servicio | Puerto | Tecnología | Estado |
|---|---|---|---|
| FastAPI (Agente) | 8000 | Python 3.13 + Uvicorn | Systemd |
| Celery Worker | — | Python 3.13 + Celery | Systemd |
| Celery Beat | — | Python 3.13 + Celery | Systemd |
| PostgreSQL | 5432 (interno) | Docker (ankane/pgvector) | Docker |
| Redis | 6379 (interno) | Docker (redis:7-alpine) | Docker |
| Gitea (Git) | 3000 | Docker (gitea/gitea) | Docker |
| Meta Webhook | 8000/api/v1/webhooks/whatsapp | FastAPI | Activo |
2. Arquitectura del Sistema
┌─────────────────────────────────────────────────────────────────────────┐
│ PACIENTE │
│ (WhatsApp Móvil) │
└───────────────────────────────┬─────────────────────────────────────────┘
│
┌───────────▼───────────┐
│ Meta WhatsApp API │
│ (WhatsApp Business) │
└───────────┬───────────┘
│ Webhook
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ SKEEN CRM AI AGENT │
│ ┌─────────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ FastAPI │ │ Celery │ │ PostgreSQL + pgvector │ │
│ │ • Webhooks │ │ • Workers │ │ • Conversaciones │ │
│ │ • API REST │ │ • Scheduler │ │ • Mensajes │ │
│ │ • Auth │ │ • Colas │ │ • Knowledge Base (RAG) │ │
│ └────────┬────────┘ └──────┬───────┘ └────────────┬─────────────┘ │
│ │ │ │ │
│ ┌────────▼────────┐ ┌──────▼───────┐ ┌────────────▼─────────────┐ │
│ │ OpenAI GPT-4o │ │ Redis │ │ ERPNext Healthcare │ │
│ │ • Chat │ │ • Cache │ │ • Pacientes │ │
│ │ • Embeddings │ │ • Broker │ │ • Citas │ │
│ │ • Functions │ │ • Rate Limit│ │ • Doctores │ │
│ └─────────────────┘ └──────────────┘ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
│
┌───────────▼───────────┐
│ Gitea (Git Server) │
│ http://192.168.10.100:3000
└───────────────────────┘
3. Accesos y URLs
| Servicio | URL Interna | URL Externa (si aplica) |
|---|---|---|
| Gitea | http://192.168.10.100:3000 | Pendiente de dominio |
| API Health | http://192.168.10.100:8000/health | Pendiente de dominio |
| API Docs | http://192.168.10.100:8000/docs | Solo desarrollo |
| Webhook Meta | http://192.168.10.100:8000/api/v1/webhooks/whatsapp | Configurar en Meta Developers |
| Prometheus | http://192.168.10.100:8000/metrics | Métricas raw |
Credenciales Gitea
- Usuario:
skeen-admin - Contraseña:
skeen-admin-2024 - Email:
admin@skeen.mx - Token API:
5ef0f75cefb665136896b63db05680d70647c894
4. Estructura de Archivos en la VM
/root/Skeen-CRM/
├── .env # Variables de entorno (PROTEGER)
├── .venv/ # Entorno virtual Python
├── docker-compose.yml # Infraestructura Docker
├── src/ # Código fuente
│ ├── main.py # Entry point FastAPI
│ ├── config.py # Configuración Pydantic
│ ├── api/v1/ # Endpoints REST
│ ├── use_cases/ # Lógica de negocio
│ ├── infrastructure/ # Clientes externos
│ │ ├── whatsapp/ # Meta WhatsApp API
│ │ ├── ai/ # OpenAI + RAG
│ │ ├── erpnext/ # ERPNext Frappe API
│ │ ├── db.py # PostgreSQL
│ │ └── redis.py # Redis
│ ├── domain/models/ # Entidades SQLAlchemy
│ └── workers/ # Celery
├── alembic/ # Migraciones DB
├── scripts/
│ ├── validate_setup.py # Validación de servicios
│ └── seed_knowledge.py # Seed del catálogo
├── tests/ # Tests automatizados
└── docs/ # Documentación
5. Guía de Instalación (Ya completada)
Los pasos 1-5 ya fueron ejecutados en la VM. Este es el registro para referencia futura o reinstalación.
Paso 1: Requisitos de la VM
# CPU: 4 cores, RAM: 15 GB, Disk: 29 GB
# OS: Ubuntu 24.04 LTS
# IP: 192.168.10.100
Paso 2: Instalar Docker
apt-get update
apt-get install -y ca-certificates curl gnupg lsb-release
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable docker
systemctl start docker
Paso 3: Levantar PostgreSQL + Redis
cd /root/Skeen-CRM
docker compose up -d postgres redis
Paso 4: Instalar dependencias Python
pip install uv
uv venv .venv
source .venv/bin/activate
uv pip install -r pyproject.toml --extra dev
Paso 5: Ejecutar migraciones y seed
source .venv/bin/activate
alembic upgrade head
python scripts/seed_knowledge.py
Paso 6: Instalar Gitea (Git Server)
docker run -d --name gitea \
--env GITEA__database__DB_TYPE=sqlite3 \
--env GITEA__database__PATH=/data/gitea/gitea.db \
--env GITEA__server__DOMAIN=192.168.10.100 \
--env GITEA__server__HTTP_PORT=3000 \
--env GITEA__server__ROOT_URL=http://192.168.10.100:3000/ \
--env GITEA__server__SSH_PORT=222 \
--env GITEA__security__INSTALL_LOCK=true \
-p 3000:3000 -p 222:22 -v gitea_data:/data \
gitea/gitea:latest
# Crear admin
docker exec gitea sh -c "su git -c 'gitea admin user create --username skeen-admin --password skeen-admin-2024 --email admin@skeen.mx --admin'"
# Generar token
docker exec gitea sh -c "su git -c 'gitea admin user generate-access-token --username skeen-admin --token-name setup-token --scopes write:repository,write:user'"
Paso 7: Configurar systemd services
Archivos creados:
/etc/systemd/system/skeen-api.service/etc/systemd/system/skeen-worker.service/etc/systemd/system/skeen-scheduler.service
systemctl daemon-reload
systemctl enable skeen-api skeen-worker skeen-scheduler
6. Configuración de Credenciales (PENDIENTE POR EL CLIENTE)
Editar /root/Skeen-CRM/.env con las credenciales reales:
Meta / WhatsApp Business API
Obtener de: https://developers.facebook.com/apps
META_ACCESS_TOKEN=EAAxxxxxxxxxxxxxxxxxxxxxxxxxxxx
META_PHONE_NUMBER_ID=123456789012345
META_BUSINESS_ACCOUNT_ID=987654321098765
META_WEBHOOK_VERIFY_TOKEN=tu-token-seguro-aleatorio
META_APP_SECRET=tu-app-secret-de-meta
OpenAI
Obtener de: https://platform.openai.com/api-keys
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
ERPNext
ERPNEXT_BASE_URL=https://tu-instancia.erpnext.com
ERPNEXT_API_KEY=xxxxxxxxxxxxxxxx
ERPNEXT_API_SECRET=xxxxxxxxxxxxxxxx
IMPORTANTE: Después de configurar las credenciales:
- Regenerar embeddings:
python scripts/seed_knowledge.py - Validar conexiones:
python scripts/validate_setup.py - Reiniciar servicios:
systemctl restart skeen-api skeen-worker
7. Operación Diaria
Comandos útiles
# Ver estado de todos los servicios
systemctl status skeen-api skeen-worker skeen-scheduler
docker ps
# Ver logs en tiempo real
journalctl -u skeen-api -f
journalctl -u skeen-worker -f
# Reiniciar servicios
systemctl restart skeen-api skeen-worker skeen-scheduler
# Validar conexiones externas
cd /root/Skeen-CRM && source .venv/bin/activate && python scripts/validate_setup.py
# Ver métricas Prometheus
curl http://localhost:8000/metrics
# Acceder a PostgreSQL
docker exec -it skeen-postgres psql -U skeen -d skeen_crm
# Acceder a Redis
docker exec -it skeen-redis redis-cli
Configuración del Webhook en Meta
- Ir a https://developers.facebook.com/apps/[TU_APP_ID]/whatsapp-business/waba-de-configuracion/
- En Webhooks, configurar:
- Callback URL:
http://192.168.10.100:8000/api/v1/webhooks/whatsapp - Verify Token: El valor de
META_WEBHOOK_VERIFY_TOKENen.env - Subscription:
messages
- Callback URL:
- Si la VM no tiene IP pública estática, usar ngrok o Cloudflare Tunnel para exponer el puerto 8000.
Backup de la base de datos
# Backup PostgreSQL
docker exec skeen-postgres pg_dump -U skeen skeen_crm > /root/backups/skeen_crm_$(date +%Y%m%d_%H%M%S).sql
# Backup Redis
docker exec skeen-redis redis-cli BGSAVE
cp /var/lib/docker/volumes/skeen-crm_redis_data/_data/dump.rdb /root/backups/redis_$(date +%Y%m%d_%H%M%S).rdb
# Backup Gitea
docker exec gitea sh -c "su git -c 'gitea dump -c /data/gitea/conf/app.ini -f /data/gitea-dump.zip'"
cp /var/lib/docker/volumes/gitea_data/_data/gitea-dump.zip /root/backups/gitea_$(date +%Y%m%d_%H%M%S).zip
8. Integraciones
ERPNext Healthcare
El agente se conecta a ERPNext via API REST de Frappe. Doctypes utilizados:
| Doctype | Operación | Endpoint |
|---|---|---|
| Patient | CRUD | /api/resource/Patient |
| Healthcare Practitioner | Listar | /api/resource/Healthcare Practitioner |
| Patient Appointment | CRUD | /api/resource/Patient Appointment |
| Clinical Procedure Template | Listar | /api/resource/Clinical Procedure Template |
| Patient Wallet | Consultar | /api/resource/Patient Wallet |
OpenAI GPT-4o
- Modelo:
gpt-4o - Temperatura: 0.3
- Max tokens: 1500
- Embeddings:
text-embedding-3-small(1536 dimensiones) - Function Calling: 6 tools disponibles
Meta WhatsApp Business API
- Versión: v18.0
- Endpoint base:
https://graph.facebook.com/v18.0/ - Phone Number ID: Configurado en
.env - Tipos de mensaje soportados: Texto, Template, Botones interactivos, Listas interactivas
- Verificación: HMAC-SHA256 en webhooks (producción)
9. Troubleshooting
El agente no responde mensajes de WhatsApp
- Verificar que el webhook está configurado correctamente en Meta
- Revisar logs:
journalctl -u skeen-api -n 100 - Validar token de Meta:
python scripts/validate_setup.py - Verificar que Celery worker está corriendo:
systemctl status skeen-worker
Error de conexión a ERPNext
- Verificar URL y credenciales en
.env - Probar conexión:
curl -u "api_key:api_secret" https://tu-erpnext.com/api/method/frappe.auth.get_logged_user - Revisar firewall entre VM y ERPNext
RAG no encuentra resultados
- Verificar que
OPENAI_API_KEYestá configurado - Regenerar embeddings:
python scripts/seed_knowledge.py - Verificar tabla
knowledge_chunksen PostgreSQL
PostgreSQL no responde
docker compose ps
docker compose logs postgres
docker compose restart postgres
Out of Memory
La VM tiene 15 GB RAM. Si hay problemas:
- Reducir
CELERY_WORKER_CONCURRENCYa 2 - Reducir workers de Uvicorn a 1
- Verificar con
free -hyhtop
10. Seguridad
.envcontiene secretos. Nunca commitear.- El archivo ya está en
.gitignore. - Webhooks validan firma HMAC-SHA256 en producción (
APP_ENV=production). - Logs no exponen datos PHI (solo últimos 4 dígitos de teléfono).
- Gitea está configurado con acceso privado.
- Se recomienda configurar firewall
ufw:
ufw default deny incoming
ufw allow 22/tcp # SSH
ufw allow 8000/tcp # API (o restringir a IPs de Meta)
ufw allow 3000/tcp # Gitea
ufw enable
11. Próximos pasos recomendados
- Configurar credenciales reales en
.env - Configurar webhook en Meta Developers
- Configurar dominio y HTTPS (Caddy o Nginx + Let's Encrypt)
- Configurar backups automatizados (cron diario)
- Configurar monitoreo (Grafana + Prometheus)
- Integrar pasarela de pagos (Stripe/MercadoPago webhooks)
- Entrenar al equipo de SKEEN en el uso del agente
12. Contacto y soporte
- Repositorio: http://192.168.10.100:3000/skeen-admin/Skeen-CRM
- Documentación: En este repositorio, carpeta
docs/ - Admin Gitea:
skeen-admin/skeen-admin-2024
Documento generado automáticamente por SKEEN Development Team.