# Publicação e ambientes > Do commit ao ambiente de Dev pelo Workspace e pela Central de Ativações; promoção para HML e Produção, réplicas, domínios personalizados e diagnóstico. Publicação e promoção são **serviços homologados da Plataforma** — o App consome o fluxo existente e não o reimplementa. O runtime local não publica nem promove. ## Fluxo ```txt commit (código + manifestos + lockfiles + .ooncore) → Workspace "Publicar em Dev" → workflow publish-dev (oon-publish/request-dev) → Central de Ativações autoriza a release → delivery: build + validação da imagem → deploy em Desenvolvimento → homologação → promoção HML → Produção ``` O scaffold traz a ponte de publicação: ```yaml title=".github/workflows/publish-dev.yml" name: publish-dev on: workflow_dispatch: inputs: oon_workspace_operation: { type: string, required: false } oon_workspace_generation: { type: string, required: false } jobs: request: permissions: contents: read id-token: write uses: oondemand/oon-publish/.github/workflows/request-dev.yml@main ``` O workflow valida `oon.deploy.json` (`appCode`, `schemaVersion`), lê as dimensões arquiteturais e capabilities funcionais do `central.app.json`, autentica-se por **OIDC do GitHub** e solicita a release à Central. O resultado aparece no resumo do job: ```txt Publicação Dev aceita: release=rel-minha-central-- etapa=despachada ``` ## oon.deploy.json ```json title="oon.deploy.json" { "schemaVersion": "1.0.0", "appCode": "minha-central", "runtime": "ooncore-node-react", "components": { "backend": { "path": "backend" }, "frontend": { "path": "frontend" } }, "resourceProfile": "small", "capabilities": {}, "health": { "livePath": "/health/live", "readyPath": "/api/health/ready", "versionPath": "/api/health/version" } } ``` ## Ambientes | Ambiente | `APP_ENVIRONMENT` | Uso | |---|---|---| | Desenvolvimento | `desenvolvimento` | Validação funcional da jornada | | Homologação | `homologacao` | Aceite técnico e de negócio | | Produção | `producao` | Operação | Promoção transporta declaração e imagem; segredos (`core.secrets`) recebem chave independente no destino. Publicação, promoção, rollback e aceite técnico de HML são exclusivos do proprietário com permissão técnica. ## Runtime publicado - **Banco de Produção retido:** ao promover de novo um App cuja Produção foi excluída, o banco MongoDB retido é reaproveitado; o usuário do banco é recriado com a mesma permissão e senha nova, sem tocar nos dados (0.7.38–0.7.40). - **Réplicas** de 1 a 10, rollout com `maxUnavailable: 0`/`maxSurge: 1`, distribuição por nó e `PodDisruptionBudget`. - **Desligamento sem perda:** `preStop` de 5 s, `terminationGracePeriodSeconds: 40`, `SIGTERM` tratado por `start()` (para de aceitar conexões, espera requisições, para o worker de e-mail, drena a fila de recálculo e fecha o banco). `start({ handleSignals: false })` desliga esse tratamento. - **Índices no boot:** cria os que faltam e informa os não declarados, sem removê-los (`OON_SYNC_INDEXES=drop` mantém o comportamento antigo; `false` desliga). - **Modo de performance** por ambiente (`min`, `normal`, `ultra`) → `maxPoolSize` 4, 8 ou 16. - **Domínios personalizados** com certificado HTTP-01 automático. - **Exclusão de dados de licença encerrada** há mais de 30 dias, executada pelo runtime com trava entre réplicas. ## Diagnóstico pós-publicação ```bash curl --fail-with-body https://SEU-APP-DEV/api/health/ready curl --fail-with-body https://SEU-APP-DEV/api/health/version ``` `/health/version` informa versão do Core, commit, `releaseId`, data do build e ambiente. Para uma ação privada, reproduza pela página com `useOonApi` autenticado e registre método, caminho, status, código e correlação — sem segredos. - HTML 404 indica rota, proxy ou empacotamento — não é rejeição da API externa. - Readiness não prova execução do handler de domínio. - Confira se `/api` foi acrescentado apenas na URL pública e se o commit é o publicado. > [!TIP] > Este site é publicado exatamente assim: um App Oon com `publish-dev` disparado a cada fase concluída. Fonte: https://sdk.oonapps.com/docs/operacao/publicacao