Skip to content

Setup — environment & toggles

Backend lê config de env vars. Toggle Omie mock × real, Bubble staging × prod, DB sqlite × postgres — tudo em runtime via env vars. Esta página: o que mudar, onde, como redeploy.

VarValor atual (staging)O que faz
APP_ENVproductionSentry/log gating
APP_PORT8000Porta uvicorn
BUBBLE_DATA_API_URLhttps://eventos.blueprintt.co/version-test/api/1.1/objStaging Bubble. Trocar pra prod URL quando subir.
USE_OMIE_MOCKtrueMock in-process (sem hit Omie real)
OMIE_BASE_URLhttps://app.omie.com.br/api/v1Endpoint real (só usado se USE_OMIE_MOCK=false)
DATABASE_URLsqlite:////data/blu_omie.dbSQLite no volume /srv/blu-omie-api/data (persiste entre deploys)
ENABLE_TEST_APIYES/v1/test/* ativo (NÃO ativar em prod produtiva)

Secrets (não exibidos): BUBBLE_API_KEY, BUBBLE_TO_API_BEARER, OMIE_APP_KEY_AABC, OMIE_APP_SECRET_AABC, OMIE_APP_KEY_LNG, OMIE_APP_SECRET_LNG.

Backend usa SDK in-process (omie-sdk-mock). Não bate na Omie. Boa pra demo, integration tests, dev Bubble experimentando.

backend/config/deploy.yml
env:
clear:
USE_OMIE_MOCK: "true"

Sem necessidade de OMIE_APP_KEY_* ou OMIE_APP_SECRET_* válidos (mock ignora). Os placeholders mock-key-aabc etc estão setados via .kamal/secrets.

Redeploy: cd backend && kamal redeploy.

# backend/config/deploy.yml — clear
BUBBLE_DATA_API_URL: https://eventos.blueprintt.co/version-test/api/1.1/obj # staging
# BUBBLE_DATA_API_URL: https://eventos.blueprintt.co/api/1.1/obj # produção (when ready)

BUBBLE_API_KEY é secret separado. Geralmente staging + prod usam keys diferentes — trocar via export BUBBLE_API_KEY=<prod-key> antes do kamal redeploy.

env:
clear:
DATABASE_URL: sqlite:////data/blu_omie.db
volumes:
- "/srv/blu-omie-api/data:/data"

Persiste no host VPS em /srv/blu-omie-api/data/blu_omie.db. Não dropa em redeploy. Backup via ssh root@62.171.145.76 'cat /srv/blu-omie-api/data/blu_omie.db' > backup.db.

Pra apontar Bubble staging pro backend local (dev), sem redeploy:

  1. Rodar backend localcd backend && make dev (uvicorn em :8000 com USE_OMIE_MOCK=true por default em .env).

  2. Expor via ngrokngrok http 8000. Copy URL https://abc123.ngrok-free.app.

  3. Trocar base URL no Bubble API Connector — substituir https://blu-omie-api.fonsecagabriel.com.br pela URL ngrok.

  4. Disparar pedido de teste no Bubble staging. Backoffice pessoal evita poluir tickets reais.

  5. Observar logs — terminal do uvicorn mostra request entrando. Postgres local persiste em sqlite tmp (dev).

  6. Voltar pra staging Kamal — após terminar, trocar base URL de volta. Sem isso, clientes reais ficam batendo no seu laptop.

Ver também: Bubble Dev — Passo a passo.

TL;DR: não existe sandbox global na Omie. Toggle Homologação cobre só envelope NFS-e. Caminho oficial pra dev/smoke isolado = Aplicativo Teste de Demonstração (gratis, 7d renovável). Plano completo: BLU-765 (Backlog).

Por que não basta apontar pra app.omie.com.br/api/v1

Section titled “Por que não basta apontar pra app.omie.com.br/api/v1”

Conta luiz.ribeiro@devmagic.com.br tem 2 apps produtivos: AABC (CNPJ 50.162.682/0001-07) + LNG (fora do escopo Versão Atual). Cliente/Projeto/OS/faturamento via API são lançamentos reais — vão pro banco da empresa. Toggle Homologação só protege envelope NFS-e; e tem pegadinha: algumas Prefeituras não suportam homologação → NFS-e “homologação” cai em produção real.

Criamos um sandbox via Playwright headed end-to-end na conta luiz.ribeiro@devmagic.com.br. Sandbox ativo agora:

  • Nome: Blueprintt Integration Sandbox
  • URL ERP: https://app.omie.com.br/gestao/blueprintt-erd42e40/
  • Validade: 7 dias (renovar via ajuda@omie.com.br antes do vencimento)
  • Dados: pré-populados (CRM, Vendas/NF-e, Serviços/NFS-e, Compras, Finanças, Painel Contador)

Portal Omie · Meus Aplicativos · sandbox criado

Click em “Acessar” abre o ERP completo com identidade BLUEPRINTT INTEGRATION SANDBOX (TRIAL):

ERP do sandbox ativo

Caminho oficial — Aplicativo Teste de Demonstração

Section titled “Caminho oficial — Aplicativo Teste de Demonstração”
ItemValor
CustoR$ 0
Validade7 dias (renovável via ajuda@omie.com.br)
DadosPré-populados (clientes/produtos/contas/serviços fictícios)
CNPJNão requer CNPJ próprio
APICompleta: app_key + app_secret
NFS-eFunciona em modo homologação (sem valor fiscal)
Vars sugeridasOMIE_APP_HML_KEY + OMIE_APP_HML_SECRET
Link oficialComo criar — Omie Ajuda
  1. Pedir o app demo — quem faz: ops/responsável Omie do time. Onde: portal Omie → Aplicativos → Criar Aplicativo de Teste. Resposta imediata.
  2. Capturar app_key + app_secret — exportar como OMIE_APP_HML_KEY + OMIE_APP_HML_SECRET. Não commitar.
  3. Configurar NFS-e em homologação — via UI da empresa demo (Configurações → Notas Fiscais → Ambiente). Como trocar ambiente NFS-e.
  4. Validar conectividadePOST /geral/clientes/ com ListarClientes deve retornar 200. Se 425 → bypass abuse detection (esperar 31min).
  5. Verificar com contador — confirmar que a Prefeitura do CNPJ fictício suporta homologação NFS-e antes do primeiro smoke (pegadinha).
  6. Documentar processo de renovação — calendar event a cada 6 dias enviando mail pra ajuda@omie.com.br solicitando renovação por mais 7d. Definir responsável.

Roteiro de smoke E2E (10 passos do BLU-765)

Section titled “Roteiro de smoke E2E (10 passos do BLU-765)”
  1. Criar app de teste na Omie (sem CNPJ próprio)
  2. Validar conectividade — POST ListarClientes
  3. Configurar NFS-e em homologação na empresa fictícia
  4. Cliente — POST /geral/clientes/ (criar via Customer Service)
  5. OS — POST /servicos/os/
  6. Faturamento — via Billing Service
  7. Emissão NFS-e — POST /servicos/osp/ em modo homologação
  8. Cancelamento NFS-e — POST /servicos/nfse/ action cancelar
  9. Idempotência — repetir steps 4+5 com mesma chave, esperar dedup
  10. Regra dia 25 — mock now = dia 26 + agendamento imediato
CaminhoCustoTrade-off
App Teste de DemonstraçãoR$ 07d renovação manual; recomendado (BLU-765)
Toggle Homologação no app AABC produtivoR$ 0Cobre só envelope NFS-e; Cliente/OS/Faturamento ainda hit real
omie-sdk-mock (in-process) ✅ default atualR$ 0Não vai pra Omie; ótimo pra unit/integration mas não cobre quirks reais
CNPJ próprio + plano Omie permanente$$$ pagoCusto não documentado; só faz sentido pós-go-live
Plano Empresarial / Multi-CNPJ BlueprinttdependeVerificar se cobre CNPJ extra sem custo (pendência alinhamento Luiz)
Sandbox API standalone OmieNão existe. Documentação oficial confirma
  • Backend (blu-omie-api.fonsecagabriel.com.br) roda com USE_OMIE_MOCK=true — não bate na Omie real. Seguro.
  • Pra ativar Omie real: criar app demo (BLU-765), exportar OMIE_APP_HML_KEY/SECRET, flip USE_OMIE_MOCK=false, redeploy.
  • Credenciais AABC produtivas já registradas no Confluence: Ambientes, Credenciais e Configuração (Versão Atual) 3812818975. Usar quando for produção real.
Terminal window
# Mudou env clear (sem rebuild image)
cd backend && kamal env push && kamal app boot
# Mudou env secret (re-export antes)
export OMIE_APP_KEY_AABC=...
cd backend && kamal env push && kamal app boot
# Mudou Dockerfile / código
cd backend && kamal deploy
# Rollback pra versão anterior
cd backend && kamal rollback <versão_sha>

kamal app details mostra versão atual rodando. kamal app logs -f tail dos logs.

GET /health/full retorna:

{
"status": "ok",
"app_env": "production",
"omie_mode": "mock",
"omie_base_url": "https://app.omie.com.br/api/v1",
"bubble_url": "https://eventos.blueprintt.co/version-test/api/1.1/obj",
"db": "sqlite",
"test_api_enabled": true,
"version": "v0.1.0"
}

Use isto pra confirmar o estado depois de qualquer kamal env push ou redeploy — sem precisar SSH no VPS.

Três incidentes mais prováveis em produção, com triagem rápida. Sintoma → Diagnóstico → Ação.

  • Sintoma — backend logs com error_type=BanError. Requests subsequentes ao Omie falham mesmo após retry.
  • Diagnóstico — bucket de abuse detection estourou: 10ª request incorreta (4xx/5xx) no mesmo IP+AppKey+Método em janela curta dispara ban de 31min na Omie.
  • AçãoNUNCA retentar antes de 31min (extende o ban). Filtrar Sentry por error_type=BanError pra entender qual call disparou. Verificar se Gap 5 (BanError → 503 com Retry-After header) está implementado no backend; sem isso, Bubble não sabe quando voltar.
  • SintomaPOST /webhooks/pagarme retorna 401 Unauthorized. Pagar.me dashboard mostra entregas falhando.

  • DiagnósticoPAGARME_WEBHOOK_SECRET foi rotated no dashboard Pagar.me mas backend ainda usa o secret antigo. HMAC computa hash diferente → handler rejeita.

  • Ação — recuperar secret atual e atualizar env do backend:

    Terminal window
    bw get password 'pagarme-webhook-secret-staging'
    export PAGARME_WEBHOOK_SECRET=...
    cd backend && kamal env push && kamal app boot
  • Sintomahttps://blu-omie-api.fonsecagabriel.com.br/health/live retorna 502 Bad Gateway. kamal app details mostra container restartando.

  • Diagnóstico — duas causas frequentes: (a) Alembic migration falhou no boot, (b) volume /srv/blu-omie-api/data sem permissão de escrita (sqlite não consegue criar/abrir DB).

  • Ação — SSH no VPS pra inspecionar:

    Terminal window
    ssh root@62.171.145.76
    docker logs <container_id> --tail 100
    # Se erro de permissão no volume:
    chmod 777 /srv/blu-omie-api/data

    Depois redeploy: cd backend && kamal redeploy.