- Frontend React (SKEEN Brand) con Vite, TypeScript, Tailwind - Frontend Homenest (versión alternativa) - Módulos Odoo 17 custom (citas, pacientes, monedero, pagos, ventas, inventario, whatsapp) - WACRM fork (Next.js 16 + Supabase) - Hermes + Bridge + Skills (Qwen3.6 via Nan Builders) - Scripts de migración y operación - Documentación extensiva en docs/
12 KiB
12 KiB
Configuración — SKEEN Derma Experts
Versión: 2.0
Fecha: 16 de julio de 2026
1. Variables de Entorno
1.1 Bridge SKEEN (/root/skeen-roadmap-hermes/hermes/.env)
# Nan Builders (IA)
NAN_API_KEY=sk-gJ8OWbZVGeWy9ns_H00cxA
NAN_BASE_URL=https://api.nan.builders/v1
NAN_MODEL=qwen3.6
# WACRM
WACRM_URL=http://localhost:3000
WACRM_API_KEY=wacrm_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# Bridge
BRIDGE_PORT=8090
NODE_ENV=production
1.2 WACRM (/root/skeen-wacrm/.env.local)
# Supabase (self-hosted on localhost)
NEXT_PUBLIC_SUPABASE_URL=http://localhost:8000
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiYW5vbiIsImlzcyI6InN1cGFiYXNlIiwiaWF0IjoxNjQxNzY5MjAwLCJleHAiOjE3OTk1MzU2MDB9.pnl22qqc0WMyNRwqdXq7cEq1hw_YTrdTgWHd0TPsHPU
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaXNzIjoic3VwYWJhc2UiLCJpYXQiOjE2NDE3NjkyMDAsImV4cCI6MTc5OTUzNTYwMH0.XA05Pgn-gkEKaZEaHYFc9DAyP45uNJdsl8DL9axUxbc
# Encryption key for WACRM (64 hex chars)
ENCRYPTION_KEY=8bbf201d9d60488a1e86e5396b31e22d8bbf201d9d60488a1e86e5396b31e22d
# WhatsApp / Meta (pending client data)
WHATSAPP_PHONE_NUMBER_ID=PENDING_PHONE_ID
WHATSAPP_BUSINESS_ACCOUNT_ID=PENDING_WABA_ID
WHATSAPP_ACCESS_TOKEN=PENDING_TOKEN
WHATSAPP_VERIFY_TOKEN=skeen_webhook_verify_2026
# Meta App Secret for webhook signature verification
META_APP_SECRET=skeen_meta_app_secret_2026_demo
# Application
NEXT_PUBLIC_APP_URL=http://localhost:3000
NODE_ENV=production
1.3 Odoo (/root/skeen-odoo/odoo.conf)
[options]
addons_path = /root/skeen-odoo/addons,/root/skeen-odoo/odoo/addons
admin_passwd = skeen_admin_2026
csv_internal_sep = ,
data_dir = /var/lib/odoo
db_host = localhost
db_maxconn = 64
db_name = skeen_odoo
db_password = skeen_dev_2026
db_port = 5432
db_sslmode = prefer
db_user = skeen
demo = {}
email_from = False
geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb
http_enable = True
http_interface =
http_port = 8069
import_partial =
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 60
limit_time_real = 120
limit_time_real_cron = -1
list_db = True
log_db = False
log_db_level = warning
log_handler = :INFO
log_level = info
logfile =
longpolling_port = 8072
max_cron_threads = 2
osv_memory_age_limit = False
osv_memory_count_limit = False
pg_path =
pidfile =
proxy_mode = True
reportgz = False
screencasts =
screenshots = /tmp/odoo_screenshots
server_wide_modules = base,web
smtp_password = False
smtp_port = 25
smtp_server = localhost
smtp_ssl = False
smtp_ssl_certificate_filename = False
smtp_ssl_private_key_filename = False
smtp_user = False
test_file =
test_tags = None
translate_modules = ['all']
unaccent = False
upgrade_path =
without_demo = False
workers = 0
1.4 Scripts de Inicio (/root/skeen-start-all.sh)
export SUPABASE_URL="http://localhost:8000"
export SUPABASE_SERVICE_ROLE_KEY="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaXNzIjoic3VwYWJhc2UiLCJpYXQiOjE2NDE3NjkyMDAsImV4cCI6MTc5OTUzNTYwMH0.XA05Pgn-gkEKaZEaHYFc9DAyP45uNJdsl8DL9axUxbc"
2. Credenciales y Accesos
| Servicio | URL | Usuario | Contraseña | Notas |
|---|---|---|---|---|
| Odoo | http://localhost:8069 | admin | skeen_admin_2026 | DB: skeen_odoo |
| Frontend | http://localhost:5173 | admin | SkeenAdmin2026! | Usuario seed |
| WACRM | http://localhost:3000 | ivan@horuxfin.com | (definida por usuario) | Registro manual |
| Supabase Studio | http://localhost:8000 | supabase | (definida en .env) | Dashboard |
| PostgreSQL Odoo | localhost:5432 | skeen | skeen_dev_2026 | DB: skeen_odoo |
| PostgreSQL Supabase | localhost:5433 | postgres | (definida en .env) | Docker |
3. Endpoints Importantes
3.1 Odoo REST API (skeen_whatsapp)
| Endpoint | Método | Descripción | Auth |
|---|---|---|---|
/skeen/api/v1/available_slots |
POST | Slots disponibles | API Key |
/skeen/api/v1/create_appointment |
POST | Crear cita | API Key |
/skeen/api/v1/patient_balance |
POST | Saldo paciente | API Key |
/skeen/api/v1/wallet_redeem |
POST | Redimir puntos | API Key |
/skeen/api/v1/cancel_appointment |
POST | Cancelar cita | API Key |
3.2 Odoo Frontend API (skeen/frontend/v1/*)
| Endpoint | Método | Descripción | Auth |
|---|---|---|---|
/skeen/frontend/v1/health |
GET | Health check | None |
/skeen/frontend/v1/auth/login |
POST | Login | None |
/skeen/frontend/v1/auth/me |
GET | Usuario actual | JWT |
/skeen/frontend/v1/appointments |
GET/POST | Citas | JWT |
/skeen/frontend/v1/appointments/<id> |
GET/PUT/DELETE | Cita individual | JWT |
/skeen/frontend/v1/services |
GET/POST | Servicios | JWT |
/skeen/frontend/v1/services/<id> |
PUT | Actualizar servicio | JWT |
/skeen/frontend/v1/patients |
GET/POST | Pacientes | JWT |
/skeen/frontend/v1/patients/<id> |
GET/PUT | Paciente individual | JWT |
/skeen/frontend/v1/wallets |
GET | Monederos | JWT |
/skeen/frontend/v1/sales |
GET/POST | Ventas | JWT |
/skeen/frontend/v1/inventory |
GET | Inventario | JWT |
/skeen/frontend/v1/wacrm/contacts |
GET | Contactos WACRM | JWT |
/skeen/frontend/v1/wacrm/conversations |
GET | Conversaciones WACRM | JWT |
/skeen/frontend/v1/wacrm/messages |
GET | Mensajes WACRM | JWT |
/skeen/frontend/v1/wacrm/deals |
GET | Deals WACRM | JWT |
/skeen/frontend/v1/wacrm/sync |
POST | Sincronizar WACRM→Odoo | JWT |
3.3 WACRM API (/api/v1/*)
| Endpoint | Método | Descripción | Auth |
|---|---|---|---|
/api/v1/messages |
POST | Enviar mensaje | Bearer Token |
/api/v1/messages/simulate |
POST | Simular mensaje (demo) | Bearer Token |
/api/v1/contacts |
GET/POST | Contactos | Bearer Token |
/api/v1/conversations |
GET | Conversaciones | Bearer Token |
/api/v1/webhooks |
GET/POST | Webhooks | Bearer Token |
/api/whatsapp/webhook |
POST | Webhook Meta | Verify Token |
3.4 Bridge SKEEN (:8090)
| Endpoint | Método | Descripción |
|---|---|---|
/health |
GET | Health check |
/webhook/wacrm |
POST | Webhook WACRM → Hermes |
4. Configuración de Hermes
4.1 Gateway
# Ver estado
hermes gateway status
# Iniciar
hermes gateway run
# Instalar como servicio
hermes gateway install
sudo hermes gateway install --system
4.2 Serve (Dashboard/API)
hermes serve --host 0.0.0.0 --port 9119 --skip-build
4.3 Skills Instalados
hermes skills list
Skills disponibles:
skeen-ragskeen-agendarskeen-pagosskeen-monederoskeen-recordatorios
5. Configuración de Meta WhatsApp Cloud API
5.1 Crear App en Meta Developers
- Ir a https://developers.facebook.com
- Crear app tipo "Business"
- Agregar producto "WhatsApp"
- Obtener:
- Phone Number ID
- WhatsApp Business Account ID (WABA ID)
- Access Token (permanente, System User)
- App Secret
5.2 Configurar Webhook en Meta
| Campo | Valor |
|---|---|
| Callback URL | https://crm.skeen.mx/api/whatsapp/webhook |
| Verify Token | skeen_webhook_verify_2026 |
| Subscription fields | messages, message_template_status_update |
5.3 Configurar WACRM
En WACRM Dashboard → Settings → WhatsApp:
| Campo | Valor |
|---|---|
| Phone Number ID | De Meta Developers |
| Access Token | Token permanente |
| Business Account ID | WABA ID |
| Verify Token | skeen_webhook_verify_2026 |
5.4 Templates de WhatsApp
Templates a subir y aprobar en Meta Business Manager:
| Template | Categoría | Uso |
|---|---|---|
bienvenida_skeen |
UTILITY | Primer contacto |
confirmacion_cita |
UTILITY | Confirmación de agendamiento |
recordatorio_cita |
UTILITY | Recordatorio 24h antes |
followup_tratamiento |
UTILITY | Seguimiento post-tratamiento |
reengage_skeen |
MARKETING | Re-engagement pacientes inactivos |
comprobante_pago |
UTILITY | Confirmación de pago recibido |
6. Configuración de Supabase
6.1 Docker Compose
cd /root/skeen-supabase/docker
docker compose up -d
docker compose ps
6.2 Variables de Entorno Clave
POSTGRES_PASSWORD=your_password
JWT_SECRET=your_jwt_secret
ANON_KEY=your_anon_jwt
SERVICE_ROLE_KEY=your_service_role_jwt
DASHBOARD_USERNAME=supabase
DASHBOARD_PASSWORD=your_dashboard_password
6.3 Acceso a Base de Datos
# Desde host
psql -h localhost -p 5433 -U postgres -d postgres
# Desde contenedor
docker exec supabase-db psql -U postgres -d postgres
7. Configuración de nginx
7.1 Frontend React
server {
listen 80;
server_name skeen.consultoria-as.com;
root /var/www/skeen-frontend;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /api/odoo {
proxy_pass http://localhost:8069;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /api/wacrm {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
7.2 WACRM (subdominio)
server {
listen 80;
server_name skeencrm.consultoria-as.com;
location / {
proxy_pass http://localhost:3000;
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;
}
}
8. Configuración de Cloudflare Tunnel
Para exponer servicios sin abrir puertos en el firewall:
# Instalar cloudflared
curl -fsSL https://pkg.cloudflare.com/cloudflared.repo | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install cloudflared
# Autenticar
cloudflared tunnel login
# Crear tunnel
cloudflared tunnel create skeen-tunnel
# Configurar DNS
cloudflared tunnel route dns skeen-tunnel skeen.consultoria-as.com
# Ejecutar tunnel
cloudflared tunnel run --token YOUR_TUNNEL_TOKEN
Nota: El tunnel ya está configurado en esta VM con el token proporcionado.
9. Configuración de systemd (Producción)
9.1 Odoo
[Unit]
Description=Odoo 17 SKEEN
After=network.target postgresql.service
[Service]
Type=simple
User=root
Environment=SUPABASE_URL=http://localhost:8000
Environment=SUPABASE_SERVICE_ROLE_KEY=your_key
ExecStart=/root/odoo-venv/bin/python /root/skeen-odoo/odoo-bin -c /root/skeen-odoo/odoo.conf
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
9.2 WACRM
[Unit]
Description=WACRM SKEEN
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/skeen-wacrm
Environment=NODE_ENV=production
ExecStart=/usr/bin/npm start
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
9.3 Bridge SKEEN
[Unit]
Description=Bridge Webhook SKEEN
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root/skeen-roadmap-hermes/hermes
Environment=NODE_ENV=production
ExecStart=/usr/bin/node webhook-bridge.js
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
10. Configuración de Backups
# Backup PostgreSQL Odoo
pg_dump -U skeen -h localhost skeen_odoo > /root/backups/odoo_$(date +%Y%m%d_%H%M%S).sql
# Backup PostgreSQL Supabase
docker exec supabase-db pg_dump -U postgres postgres > /root/backups/supabase_$(date +%Y%m%d_%H%M%S).sql
# Backup archivos
tar -czf /root/backups/skeen-files_$(date +%Y%m%d_%H%M%S).tar.gz \
/root/skeen-frontend \
/root/skeen-wacrm \
/root/skeen-odoo/addons/skeen_* \
/root/skeen-roadmap-hermes \
/root/migracion
11. Checklist de Configuración para Go-Live
- Número WhatsApp Business verificado por Meta
- Meta App ID + Secret configurados
- Access Token permanente generado
- Phone Number ID y WABA ID configurados en WACRM
- Templates de WhatsApp aprobados por Meta
- Dominio skeen.mx apuntando a la VM
- SSL certificado instalado (Let's Encrypt)
- Firewall configurado (solo 80, 443, 22)
- Backups automatizados configurados
- Monitoreo Uptime Kuma activo
- API keys de WACRM generadas y configuradas
- Variables de entorno en producción
- systemd services habilitados
- Logs rotando correctamente