Pular para conteúdo

Ambiente Local

Arquitetura local vs produção

flowchart LR
    subgraph Local["💻 PC Local (dev)"]
        Worker[worker container]
        Redis[redis container]
        MLflow[mlflow container]
        VS[VS Code]
    end

    subgraph VPS["🌐 VPS Produção"]
        API[api container]
        DB[(postgres)]
        Grafana[grafana]
    end

    Worker -->|WireGuard tunnel<br/>10.8.0.1:5432| DB
    Worker -->|local| Redis
    Worker -->|local file| MLflow
    VS -->|edit| Worker

Por que worker no PC local:

  • MetaTrader 5 só roda em Windows
  • Worker faz collect via MT5 terminal (não tem como ser headless)
  • Compute pesado de retrain fica no PC sem onerar VPS

Por que API na VPS:

  • Disponibilidade 24/7
  • Cloudflare + HTTPS
  • IP estático para webhooks Eduzz

Stack local (Docker Compose)

docker-compose.yml na raiz:

services:
  redis:        # local cache + rate limit
  mlflow:       # tracking de experiments
  worker:       # collector + ML predict loop
  # DB e API rodam na VPS, conectados via WireGuard

WireGuard setup

1. Receber config da VPS

VPS admin (você) gera config do peer:

# Na VPS
wg genkey | tee privatekey | wg pubkey > publickey

Adiciona em /etc/wireguard/wg0.conf:

[Peer]
PublicKey = <publickey>
AllowedIPs = 10.8.0.2/32   # IP do PC dev no túnel

Gera wg0-client.conf para o PC:

[Interface]
PrivateKey = <privatekey_do_pc>
Address    = 10.8.0.2/24
DNS        = 10.8.0.1

[Peer]
PublicKey  = <publickey_vps>
Endpoint   = <ip_publico_vps>:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25

2. Importar no PC

Abrir WireGuard → "Adicionar túnel" → escolher wg0-client.conf.

3. Ativar

Clicar em "Ativar" no painel WireGuard.

Testar:

ping 10.8.0.1
# Esperado: respostas <10ms

4. Acessar DB remoto

docker exec forex_db_local psql -h 10.8.0.1 -U forex -d forex -c "SELECT NOW();"

VS Code / editor

.vscode/settings.json (recomendado):

{
  "python.defaultInterpreterPath": ".venv\\Scripts\\python.exe",
  "python.analysis.typeCheckingMode": "basic",
  "editor.formatOnSave": true,
  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter",
    "editor.rulers": [100]
  }
}

Extensions úteis:

  • Python (ms-python.python)
  • Pylance
  • Black Formatter
  • Docker
  • YAML
  • SQLTools + PostgreSQL driver

Rodando testes

.venv\Scripts\python.exe -m pytest tests/ -v

Cobertura atual: ~27 testes, sem E2E.

Rebuild ciclos

Mudou Comando Tempo
app/*.py docker compose up -d --build worker api 2-3 min
requirements.txt docker compose up -d --build --no-cache worker 5-8 min
docker-compose.yml docker compose down && docker compose up -d 30s
ea/*.mq5 Compilar via MetaEditor (passo manual) 10s
docs/*.md mkdocs serve (live reload) instant
Frontend *.html refresh do browser instant

Logs

# Stream em tempo real
docker logs forex_worker --follow

# Últimas 100 linhas
docker logs forex_worker --tail 100

# Filtrar
docker logs forex_worker --tail 500 | Select-String -Pattern "ERROR|predict"

# Salvar em arquivo
docker logs forex_worker --tail 1000 > worker.log

Variáveis de ambiente importantes

# Dev mode
LOG_LEVEL=DEBUG              # mais verboso
DEBUG=true                   # FastAPI debug page
DISABLE_RATE_LIMIT=true      # desliga rate limit para dev

# Override de TFs em treino (testes rápidos)
TRAIN_TFS=H1                 # só treina H1
TRAIN_SYMBOLS=EURUSD         # só EURUSD

# Force model promotion (skip gates)
FORCE_PROMOTE=true           # bypass de quality gates (DANGER em prod)

Limpeza

# Remover containers parados
docker compose down

# Remover volumes (ATENÇÃO: apaga DB local)
docker compose down -v

# Limpar imagens não usadas
docker image prune -f

# Limpar build cache (espaço)
docker builder prune -af