Saltar a contenido

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:

  1. Conectar al CT110.
  2. Actualizar codigo (git pull si CT110 tiene credenciales Git, o switch de release si no).
  3. 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 current suele 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 symlink deploy/.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)#

  1. API responde:
  2. GET / -> {"status":"ok"}
  3. GET /binance/status -> OK
  4. CORS correcto (desde el browser):
  5. Origin: https://sdp.perlatec.net debe devolver Access-Control-Allow-Origin: https://sdp.perlatec.net
  6. UI carga tarjetas de Binance:
  7. /binance muestra balance/estado demo.
  8. Jobs en verde:
  9. GET /jobs/status y verificar market_sync.
  10. Evidencia:
  11. storage/logs/e2e_runs/ y storage/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 de storage/.
  • signaldashpro-web-auth-smoke.timer: smoke autenticado de login/API protegida (cada 15 min) con evidencia en storage/logs/ops/.
  • Por defecto valida URLs internas del stack Docker (http://frontend:3000, http://backend:8096).
  • Puedes forzar URLs publicas con AUTH_SMOKE_FRONTEND_URL y AUTH_SMOKE_API_URL.
  • Credenciales/overrides runtime: crear /opt/signaldashpro/env/.env.web-auth-smoke con:
    • AUTH_SMOKE_EMAIL=...
    • AUTH_SMOKE_PASSWORD=...
    • opcional AUTH_SMOKE_FRONTEND_URL=... y AUTH_SMOKE_API_URL=...
  • run_ops_daily_brief.py incluye bloque LLM 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=true
  • ALERT_MARKET_SYNC_SYMBOLS=EURUSDT,PAXGUSDT
  • ALERT_MARKET_SYNC_TIMEFRAME=M1
  • ALERT_MARKET_SYNC_MAX_LAG_MINUTES=45
  • ALERT_DEGRADATION_ENABLED=true
  • ALERT_DEGRADATION_MIN_WIN_RATE=0.45
  • ALERT_DEGRADATION_MAX_DRAWDOWN=100.0
  • ALERT_DEGRADATION_MAX_QUEUE_FAILED=0
  • ALERT_FEED_ENABLED=true
  • ALERT_FEED_MACRO_MAX_AGE_MINUTES=720
  • ALERT_FEED_NEWS_MAX_AGE_MINUTES=360
  • ALERT_FEED_ALIGNMENT_MAX_AGE_MINUTES=120
  • ALERT_FEED_CHECK_MACRO=false (si macro feed esta deshabilitado en runtime)
  • ALERT_FEED_CHECK_NEWS=true
  • ALERT_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=true
  • OPS_DAILY_BRIEF_AUTO_RUN=true
  • MARKET_SYNC_AUTO_RUN=true
  • ALERT_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_trade explicito cuando no hay confluencia.
  • Activar:
  • clasificador de regimen en auto-run (si aplica).
  • politica de bloqueo por contradiccion (runtime/audit).
  • Verificar:
  • razones en autopilot_decisions y 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_only como 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.