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.
Effective config — produção atual
Section titled “Effective config — produção atual”| Var | Valor atual (staging) | O que faz |
|---|---|---|
APP_ENV | production | Sentry/log gating |
APP_PORT | 8000 | Porta uvicorn |
BUBBLE_DATA_API_URL | https://eventos.blueprintt.co/version-test/api/1.1/obj | Staging Bubble. Trocar pra prod URL quando subir. |
USE_OMIE_MOCK | true | Mock in-process (sem hit Omie real) |
OMIE_BASE_URL | https://app.omie.com.br/api/v1 | Endpoint real (só usado se USE_OMIE_MOCK=false) |
DATABASE_URL | sqlite:////data/blu_omie.db | SQLite no volume /srv/blu-omie-api/data (persiste entre deploys) |
ENABLE_TEST_API | YES | /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.
Switch Omie: mock ↔ real
Section titled “Switch Omie: mock ↔ real”Backend usa SDK in-process (omie-sdk-mock). Não bate na Omie. Boa pra demo, integration tests, dev Bubble experimentando.
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 bate na Omie real via SDK. Requer app produtivo AABC com OMIE_APP_KEY_AABC + OMIE_APP_SECRET_AABC válidos (Confluence 3812884488).
-
Editar
backend/config/deploy.yml— flipUSE_OMIE_MOCK: "false"e confirmarOMIE_BASE_URL: "https://app.omie.com.br/api/v1".env:clear:USE_OMIE_MOCK: "false"OMIE_BASE_URL: "https://app.omie.com.br/api/v1" -
Exportar credenciais reais:
Terminal window export OMIE_APP_KEY_AABC=...export OMIE_APP_SECRET_AABC=...export KAMAL_REGISTRY_PASSWORD=$(gh auth token) -
Redeploy —
cd backend && kamal redeploy(~3 min). -
Verificar mode no ar:
Terminal window curl https://blu-omie-api.fonsecagabriel.com.br/health/full | jq '.omie_mode'# → "real"
⚠ Rate-limit Omie real: HTTP 425 = ban 31min, REDUNDANT = wait hint + 5s. Backend SDK já tem throttle + recovery (Lane A em PR #11). Mesmo assim — não martelar em produção sem necessidade.
⚠ Aplicativo Teste de Demonstração (alternativa pra smoke seguro): grátis, 7d renovável via ajuda@omie.com.br, dados fictícios pré-populados. Use OMIE_APP_KEY_* desse app pra rodar make smoke-real sem afetar app produtivo.
LNG está fora do escopo Versão Atual (Confluence 3813310465). Não usar em runtime. Variáveis existem só pra não quebrar config schema.
Decisão: ADR-1 em Decisions.
Switch Bubble: staging ↔ produção
Section titled “Switch Bubble: staging ↔ produção”# backend/config/deploy.yml — clearBUBBLE_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.
Switch DB: sqlite ↔ postgres
Section titled “Switch DB: sqlite ↔ postgres”env: clear: DATABASE_URL: sqlite:////data/blu_omie.dbvolumes: - "/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 volume > sqlite confortável (~10GB+ ou multi-region), provisionar Postgres como Kamal accessory:
accessories: db: image: postgres:16 host: 62.171.145.76 port: "127.0.0.1:5432:5432" env: secret: - POSTGRES_PASSWORD volumes: - /var/lib/postgresql/data:/var/lib/postgresql/data
env: clear: DATABASE_URL: postgresql+psycopg://blu_omie:${POSTGRES_PASSWORD}@127.0.0.1:5432/blu_omieComandos:
kamal accessory boot db # provisiona container postgres no VPSkamal accessory exec db psql # shell SQLMigrar sqlite → postgres: dump → restore via alembic upgrade head no novo target. Não há automation pronta.
Smoke local com ngrok (Bubble dev)
Section titled “Smoke local com ngrok (Bubble dev)”Pra apontar Bubble staging pro backend local (dev), sem redeploy:
-
Rodar backend local —
cd backend && make dev(uvicorn em:8000comUSE_OMIE_MOCK=truepor default em.env). -
Expor via ngrok —
ngrok http 8000. Copy URLhttps://abc123.ngrok-free.app. -
Trocar base URL no Bubble API Connector — substituir
https://blu-omie-api.fonsecagabriel.com.brpela URL ngrok. -
Disparar pedido de teste no Bubble staging. Backoffice pessoal evita poluir tickets reais.
-
Observar logs — terminal do
uvicornmostra request entrando. Postgres local persiste em sqlite tmp (dev). -
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.
Sandbox / ambiente demo Omie
Section titled “Sandbox / ambiente demo Omie”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.
✅ Provado vivo (2026-06-04)
Section titled “✅ Provado vivo (2026-06-04)”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.brantes do vencimento) - Dados: pré-populados (CRM, Vendas/NF-e, Serviços/NFS-e, Compras, Finanças, Painel Contador)

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

Caminho oficial — Aplicativo Teste de Demonstração
Section titled “Caminho oficial — Aplicativo Teste de Demonstração”| Item | Valor |
|---|---|
| Custo | R$ 0 |
| Validade | 7 dias (renovável via ajuda@omie.com.br) |
| Dados | Pré-populados (clientes/produtos/contas/serviços fictícios) |
| CNPJ | Não requer CNPJ próprio |
| API | Completa: app_key + app_secret |
| NFS-e | Funciona em modo homologação (sem valor fiscal) |
| Vars sugeridas | OMIE_APP_HML_KEY + OMIE_APP_HML_SECRET |
| Link oficial | Como criar — Omie Ajuda |
- Pedir o app demo — quem faz: ops/responsável Omie do time. Onde: portal Omie → Aplicativos → Criar Aplicativo de Teste. Resposta imediata.
- Capturar
app_key+app_secret— exportar comoOMIE_APP_HML_KEY+OMIE_APP_HML_SECRET. Não commitar. - Configurar NFS-e em homologação — via UI da empresa demo (Configurações → Notas Fiscais → Ambiente). Como trocar ambiente NFS-e.
- Validar conectividade —
POST /geral/clientes/comListarClientesdeve retornar 200. Se 425 → bypass abuse detection (esperar 31min). - Verificar com contador — confirmar que a Prefeitura do CNPJ fictício suporta homologação NFS-e antes do primeiro smoke (pegadinha).
- Documentar processo de renovação — calendar event a cada 6 dias enviando mail pra
ajuda@omie.com.brsolicitando 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)”- Criar app de teste na Omie (sem CNPJ próprio)
- Validar conectividade —
POST ListarClientes - Configurar NFS-e em homologação na empresa fictícia
- Cliente —
POST /geral/clientes/(criar via Customer Service) - OS —
POST /servicos/os/ - Faturamento — via Billing Service
- Emissão NFS-e —
POST /servicos/osp/em modo homologação - Cancelamento NFS-e —
POST /servicos/nfse/action cancelar - Idempotência — repetir steps 4+5 com mesma chave, esperar dedup
- Regra dia 25 — mock
now = dia 26+ agendamento imediato
Riscos / pegadinhas
Section titled “Riscos / pegadinhas”Alternativas avaliadas
Section titled “Alternativas avaliadas”| Caminho | Custo | Trade-off |
|---|---|---|
| App Teste de Demonstração ✅ | R$ 0 | 7d renovação manual; recomendado (BLU-765) |
| Toggle Homologação no app AABC produtivo | R$ 0 | Cobre só envelope NFS-e; Cliente/OS/Faturamento ainda hit real |
omie-sdk-mock (in-process) ✅ default atual | R$ 0 | Não vai pra Omie; ótimo pra unit/integration mas não cobre quirks reais |
| CNPJ próprio + plano Omie permanente | $$$ pago | Custo não documentado; só faz sentido pós-go-live |
| Plano Empresarial / Multi-CNPJ Blueprintt | depende | Verificar se cobre CNPJ extra sem custo (pendência alinhamento Luiz) |
| Sandbox API standalone Omie | ∅ | Não existe. Documentação oficial confirma |
Status atual da integração
Section titled “Status atual da integração”- Backend (
blu-omie-api.fonsecagabriel.com.br) roda comUSE_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, flipUSE_OMIE_MOCK=false, redeploy. - Credenciais AABC produtivas já registradas no Confluence: Ambientes, Credenciais e Configuração (Versão Atual)
3812818975. Usar só quando for produção real.
Reload runtime — kamal redeploy
Section titled “Reload runtime — kamal redeploy”# 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ódigocd backend && kamal deploy
# Rollback pra versão anteriorcd backend && kamal rollback <versão_sha>kamal app details mostra versão atual rodando. kamal app logs -f tail dos logs.
Endpoint pra checar config no ar
Section titled “Endpoint pra checar config no ar”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.
Incident triage — runbook
Section titled “Incident triage — runbook”Três incidentes mais prováveis em produção, com triagem rápida. Sintoma → Diagnóstico → Ação.
Omie HTTP 425 (ban 31min)
Section titled “Omie HTTP 425 (ban 31min)”- 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étodoem janela curta dispara ban de 31min na Omie. - Ação — NUNCA retentar antes de 31min (extende o ban). Filtrar Sentry por
error_type=BanErrorpra entender qual call disparou. Verificar se Gap 5 (BanError → 503 comRetry-Afterheader) está implementado no backend; sem isso, Bubble não sabe quando voltar.
Pagar.me HMAC mismatch
Section titled “Pagar.me HMAC mismatch”-
Sintoma —
POST /webhooks/pagarmeretorna401 Unauthorized. Pagar.me dashboard mostra entregas falhando. -
Diagnóstico —
PAGARME_WEBHOOK_SECRETfoi 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
Backend container restart loop
Section titled “Backend container restart loop”-
Sintoma —
https://blu-omie-api.fonsecagabriel.com.br/health/liveretorna502 Bad Gateway.kamal app detailsmostra container restartando. -
Diagnóstico — duas causas frequentes: (a) Alembic migration falhou no boot, (b) volume
/srv/blu-omie-api/datasem 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.76docker logs <container_id> --tail 100# Se erro de permissão no volume:chmod 777 /srv/blu-omie-api/dataDepois redeploy:
cd backend && kamal redeploy.