Despliegue (Actual)#
Este documento describe el despliegue actual Binance-first tanto en local como en el VPS/Proxmox.
Para el estado operativo exacto (dominios, CTs, comandos de retoma): ../HANDOFF.md.
Entornos#
| Entorno | Frontend | API | BD | Comentarios |
|---|---|---|---|---|
| local | http://127.0.0.1:3000 |
http://127.0.0.1:8096 |
localhost:5433 |
Desarrollo y pruebas rapidas. |
| externo (demo 30d) | https://sdp.perlatec.net |
https://api.sdp.perlatec.net |
192.168.100.7:5432 |
Operacion 24/7 via reverse proxy (NPM). |
Requisitos#
- Docker + Docker Compose (recomendado para externo).
- Python 3.13 (para ejecucion local sin contenedores).
- PostgreSQL 15 (externo: CT107).
- Credenciales Binance (demo/testnet o live segun entorno):
BINANCE_API_KEY,BINANCE_API_SECRET.
Variables principales (alto nivel)#
| Grupo | Variable | Descripcion |
|---|---|---|
| DB | DATABASE_URL |
Cadena SQLAlchemy completa. |
| Binance | BINANCE_API_KEY, BINANCE_API_SECRET, BINANCE_BASE_URL |
Trading y account endpoints. |
| Binance | BINANCE_TRADE_DAYS, BINANCE_TRADE_START_HOUR_UTC, BINANCE_TRADE_END_HOUR_UTC |
Ventana permitida de trading (UTC). Para Spot Demo 24/7 usar 1..7 y 0/0. |
| Web | CORS_ALLOW_ORIGINS |
Origenes permitidos, comma-separated. |
| Jobs | *_AUTO_RUN |
Flags de jobs/loops (MARKET_SYNC_AUTO_RUN, etc.). |
| Alertas | ALERT_BACKEND_BASE_URL |
Alertas operativas locales (logs + state file). |
| Ops | OPS_READ_TOKEN |
Token lectura para /ops/* via header X-Ops-Token. |
| LLM shadow | OPENAI_API_KEY, OPENAI_MODEL, AI_LLM_ADVISER_ENABLED, AI_LLM_ADVISER_MODEL, AI_LLM_ADVISER_TIMEOUT_SECONDS |
Adviser OpenAI en modo auditoria (no ejecuta ordenes). |
| LLM alertas | ALERT_LLM_* |
Umbrales de alertas para coverage/parse/latency/tokens del adviser. |
| Market sync alertas | ALERT_MARKET_SYNC_* |
Alertas por velas stale/ausentes (frescura de market_sync). |
| Degradacion alertas | ALERT_DEGRADATION_* |
Alertas KPI semanal fuera de umbral (win_rate, drawdown, queue_failed). |
| Feed freshness alertas | ALERT_FEED_* |
Alertas de degradacion de feeds (macro_events, market_news, alignment) via /ops/data/freshness. |
Nombres completos y plantilla: env/.env.example.
Despliegue externo (CT110 con Docker Compose)#
El CT110 corre el stack con este compose:
- en CT110: /opt/signaldashpro/current/deploy/docker-compose.ct110.yml
- en repo: deploy/docker-compose.ct110.yml
Pasos:
- Conectar al CT110.
- Actualizar codigo (git pull si CT110 tiene credenciales Git, o switch de release si no).
- Rebuild/restart.
cd /opt/signaldashpro/current/deploy
docker compose --env-file ../.env -f docker-compose.ct110.yml up -d --build
docker compose --env-file ../.env -f docker-compose.ct110.yml ps
docker compose --env-file ../.env -f docker-compose.ct110.yml logs -f --tail=200 backend
Deploy recomendado desde local (helper con retry)#
Cuando hay inestabilidad SSH hacia PVE/CT110, usar el wrapper con reintentos:
# backend + frontend con verificacion productiva
scripts/ct110_deploy_retry.sh --max-attempts=4 --initial-backoff-seconds=20 --verify-profile=prod backend frontend
# solo frontend (iteraciones UX)
scripts/ct110_deploy_retry.sh --max-attempts=4 --initial-backoff-seconds=20 --verify-profile=fast frontend
Notas:
- scripts/ct110_deploy_retry.sh reintenta ct110_deploy_release.sh con backoff exponencial.
- Desde el segundo intento aplica --skip-gc automaticamente para reducir puntos de fallo.
- Evidencia de corrida:
- log_file=/tmp/ct110_deploy_<ts>.log
- phase_log=/tmp/ct110_deploy_phase_<ts>-<sha>.log
Nota (releases):
- En CT110
currentsuele ser un symlink a/opt/signaldashpro/releases/<timestamp>-<sha>. storage/y el env de Binance viven fuera del release y se linkean para persistencia.- Si NO usas
--env-file ../.env, asegura que exista el symlinkdeploy/.env -> ../.env(si falta,DATABASE_URL/NEXT_PUBLIC_*quedan vacios).
Reverse proxy:
- Se gestiona en Nginx Proxy Manager (CT103).
- Debe forwardear sdp.perlatec.net -> 192.168.100.10:3000 y api.sdp.perlatec.net -> 192.168.100.10:8096.
- Debe forwardear docs.sdp.perlatec.net -> 192.168.100.10:8001.
Fix de canonical en docs (NPM/OpenResty)#
Contexto: con mkdocs serve, el HTML puede publicar canonical interno (http://0.0.0.0:8001/...).
La mitigacion operativa recomendada es en proxy (CT103), sin tocar runtime de app.
Snippet de Advanced en el host docs.sdp.perlatec.net (NPM):
sub_filter_once off;
sub_filter_types text/html;
sub_filter 'href="http://0.0.0.0:8001/docs/' 'href="https://docs.sdp.perlatec.net/docs/';
sub_filter 'href="http://127.0.0.1:8001/docs/' 'href="https://docs.sdp.perlatec.net/docs/';
Validacion recomendada post-cambio:
curl -sS https://docs.sdp.perlatec.net/docs/matvard/ | grep -i canonical
Chequeo automatizable en CT110:
bash deploy/ops/docs_canonical_check.sh
Checklist de despliegue (externo)#
- API responde:
GET /->{"status":"ok"}GET /binance/status-> OK- CORS correcto (desde el browser):
Origin: https://sdp.perlatec.netdebe devolverAccess-Control-Allow-Origin: https://sdp.perlatec.net- UI carga tarjetas de Binance:
/binancemuestra balance/estado demo.- Jobs en verde:
GET /jobs/statusy verificarmarket_sync.- Evidencia:
storage/logs/e2e_runs/ystorage/logs/evidence/se siguen poblando.
Automatizacion 30 dias (CT110)#
En el deploy externo (CT110) se usan systemd timers (preferido vs cron) para checks, alertas y backups.
signaldashpro-daily.timer: smoke + evidencia diaria.signaldashpro-alerts.timer: evaluacion de alertas operativas cada 5 min.signaldashpro-storage-backup.timer: backup diario destorage/.signaldashpro-web-auth-smoke.timer: smoke autenticado de login/API protegida (cada 15 min) con evidencia enstorage/logs/ops/.- Por defecto valida URLs internas del stack Docker (
http://frontend:3000,http://backend:8096). - Puedes forzar URLs publicas con
AUTH_SMOKE_FRONTEND_URLyAUTH_SMOKE_API_URL. - Credenciales/overrides runtime: crear
/opt/signaldashpro/env/.env.web-auth-smokecon:AUTH_SMOKE_EMAIL=...AUTH_SMOKE_PASSWORD=...- opcional
AUTH_SMOKE_FRONTEND_URL=...yAUTH_SMOKE_API_URL=...
run_ops_daily_brief.pyincluye bloqueLLM Adviser (Shadow, 24h)consumiendo/ops/ai/llm-adviser/summary.
Comandos utiles:
systemctl list-timers --all | grep signaldashpro
journalctl -u signaldashpro-daily.service -n 200 --no-pager
Validacion rapida LLM shadow (desde CT110):
cd /opt/signaldashpro/current
source .env
curl -sS -H "X-Ops-Token: ${OPS_READ_TOKEN}" \
"http://127.0.0.1:8096/ops/ai/llm-adviser/summary?hours=24&limit=5000"
Alertas nuevas (config recomendada en F0/F5):
ALERT_MARKET_SYNC_ENABLED=trueALERT_MARKET_SYNC_SYMBOLS=EURUSDT,PAXGUSDTALERT_MARKET_SYNC_TIMEFRAME=M1ALERT_MARKET_SYNC_MAX_LAG_MINUTES=45ALERT_DEGRADATION_ENABLED=trueALERT_DEGRADATION_MIN_WIN_RATE=0.45ALERT_DEGRADATION_MAX_DRAWDOWN=100.0ALERT_DEGRADATION_MAX_QUEUE_FAILED=0ALERT_FEED_ENABLED=trueALERT_FEED_MACRO_MAX_AGE_MINUTES=720ALERT_FEED_NEWS_MAX_AGE_MINUTES=360ALERT_FEED_ALIGNMENT_MAX_AGE_MINUTES=120ALERT_FEED_CHECK_MACRO=false(si macro feed esta deshabilitado en runtime)ALERT_FEED_CHECK_NEWS=trueALERT_FEED_CHECK_ALIGNMENT=true
Validacion periodica (operacion 30 dias)#
Referencia: ../guides/binance_demo_30d.md y ../cron_jobs.md.
Smoke autenticado web/API (login + endpoints protegidos)#
Script recomendado desde local:
AUTH_SMOKE_EMAIL="<usuario>" AUTH_SMOKE_PASSWORD="<password>" \
uv run python scripts/run_web_auth_smoke.py \
--frontend-url https://sdp.perlatec.net \
--api-url https://api.sdp.perlatec.net
Valida:
- GET /login (frontend)
- GET /status (API)
- POST /auth/login
- GET /auth/me, GET /jobs/status, GET /ops/queue/health, GET /analytics/case-reviews/actions/summary con Authorization: Bearer.
Auditoria rapida de hardening authz#
AUTHZ_AUDIT_EMAIL="<usuario>" AUTHZ_AUDIT_PASSWORD="<password>" \
uv run python scripts/audit_authz_matrix.py --base-url https://api.sdp.perlatec.net
Verifica matriz base:
- sin auth: endpoints protegidos deben devolver 401.
- con bearer: endpoints protegidos deben devolver 200.
Runbook por fases (F0-F6)#
Este bloque resume activaciones por fase (ver checklist maestro en ../TODO.md).
F0 (operacion base)#
- Objetivo: estabilidad 24/7 + evidencia + alertas.
- Activar:
OPS_EVIDENCE_AUTO_RUN=trueOPS_DAILY_BRIEF_AUTO_RUN=trueMARKET_SYNC_AUTO_RUN=trueALERT_LLM_ENABLED=true
F1 (macro/intermarket)#
- Objetivo: fuentes confiables de contexto.
- Activar:
- job de import macro (segun proveedor configurado).
- flags/credenciales de proveedor macro/intermarket.
- Verificar:
- frescura de eventos y proxies en
/ops.
F2 (regimen/confluencia)#
- Objetivo:
no_tradeexplicito cuando no hay confluencia. - Activar:
- clasificador de regimen en auto-run (si aplica).
- politica de bloqueo por contradiccion (runtime/audit).
- Verificar:
- razones en
autopilot_decisionsy panel/control-tower.
F3 (flujo no-indicador)#
- Objetivo: usar microestructura de Binance (agresor/imbalance/absorcion).
- Activar:
- ingesta de tape/orderflow (si esta habilitada en backend).
- Verificar:
- coverage de features en logs/reportes.
F4 (decision adaptativa)#
- Objetivo: gestion de salida estable + extension condicionada.
- Activar:
- parametros de gestion adaptativa y enforcement progresivo.
- mantener
AI_LLM_ADVISER_ENFORCEMENT_MODE=reduce_size_onlycomo default inicial.
F5 (degradacion/autopausa)#
- Objetivo: autoproteccion automatica.
- Activar:
- umbrales de degradacion semanales.
- modo defensivo/autopausa con rollback.
F6 (30 dias)#
- Objetivo: ejecucion continua con criterios Go/No-Go.
- Activar:
- timers productivos.
- reportes semanales + postmortem de incidentes.