Skip to content

hotfix(deploy): remove endpoint Https sem certificado + corrige rollback mudo - #333

Merged
elson-vinicius-lopes merged 2 commits into
developfrom
hotfix/kestrel-https-crash-loop-e-rollback-mudo
Sep 8, 2026
Merged

elson-vinicius-lopes merged 2 commits into
developfrom
hotfix/kestrel-https-crash-loop-e-rollback-mudo

Conversation

@elson-vinicius-lopes

Copy link
Copy Markdown
Collaborator

Incidente de produção (2026-09-07)

Após ativar MIGRATE_CONFIG_TO_REPO=true (issue #112) e disparar um deploy, produção
ficou fora do ar: o Windows Service mostrava "Running", mas a porta 5000 não respondia
nada (Unable to connect to the remote server).

Causa raiz: a migração copiou o appsettings.json inteiro do repo pro servidor pela
primeira vez — trazendo junto Kestrel:Endpoints:Https:Url, uma chave que nunca tinha
chegado lá antes
(o arquivo era preservado, não versionado, até agora). Sem certificado
configurado em produção, o Kestrel falhava ao subir em loop de crash:

System.InvalidOperationException: Unable to configure HTTPS endpoint. No server
certificate was specified, and the default developer certificate could not be found
or is out of date.

Mitigado manualmente em produção (edição direta do appsettings.json removendo a seção
Https + restart do serviço — confirmado: readiness voltou a 200).

Achado colateral durante a investigação: rollback automático nunca funcionaria

O smoke test pós-deploy (PR #114, incidente de 2026-08-15) existe exatamente pra reverter
automaticamente uma versão que falha o readiness check. Ele nunca chegou a tentar isso
neste incidente
— e possivelmente nunca funcionou em nenhuma falha anterior.

Motivo: todo Write-Error dentro do bloco de rollback (linhas ~1319-1396) é sempre
terminante
, porque $ErrorActionPreference = "Stop" está setado no topo do step. O
script abortava no primeiro Write-Error — antes mesmo de entrar no try que restaura o
backup.

Fix

  1. appsettings.json: remove a seção Kestrel:Endpoints:Https — a API roda
    loopback-only atrás do BFF (ver security.md), não usa terminação HTTPS nesta camada.
  2. deploy.yml: troca os 4 Write-Error do bloco de rollback por Write-Host
    (não-terminante), deixando o fluxo chegar de fato no rollback, no resumo do
    GITHUB_STEP_SUMMARY e no alerta por e-mail que já existiam.

Build validado localmente (dotnet build, 0 erros, JSON válido).

⚠️ Requer revisão humana antes do merge

Mexe em config de produção e no mecanismo de rollback do deploy. Recomendo mergear e
confirmar com um deploy real (ou pelo menos revisar o próximo smoke-test-fail simulável)
antes de considerar o mecanismo de rollback validado de fato.

🤖 Generated with Claude Code

…ack mudo

Incidente de producao (2026-09-07, apos ativar MIGRATE_CONFIG_TO_REPO na
issue #112): o deploy que migrou appsettings.json inteiro pro servidor
introduziu Kestrel:Endpoints:Https:Url pela primeira vez em producao (nunca
tinha chegado la antes - appsettings.json era preservado, nao versionado).
Sem certificado configurado, o Kestrel falhava ao subir em loop de crash:
"Unable to configure HTTPS endpoint. No server certificate was specified".
O Windows Service ficava "Running" (processo vivo, reiniciando sozinho) mas
a porta 5000 nunca respondia - servico efetivamente fora do ar.

Fix 1: remove a secao Https do appsettings.json versionado. A API roda
loopback-only atras do BFF (ver security.md) - nao usa terminacao HTTPS
nesta camada. Mitigado manualmente em producao via edicao direta do
appsettings.json + restart do servico (confirmado: readiness 200 de volta).

Fix 2 (achado durante a investigacao): o rollback automatico do smoke test
(PR #114, incidente de 2026-08-15) nunca teria executado neste caso, e
possivelmente nunca executou em nenhum deploy falho anterior. Toda chamada
Write-Error dentro do bloco de rollback (linhas ~1319-1396) e SEMPRE
terminante com $ErrorActionPreference="Stop" (topo do step) - o script
abortava no primeiro Write-Error, antes de sequer tentar restaurar o
backup. Trocadas por Write-Host (nao-terminante), deixando o fluxo chegar
no rollback de verdade e no resumo/e-mail de alerta que ja existiam.

Sem os dois fixes, o proximo deploy que reintroduzisse qualquer chave
"so no repo" arriscada (nao so Https) ficaria preso do mesmo jeito, sem
rollback nenhum tirando producao do estado quebrado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@elson-vinicius-lopes
elson-vinicius-lopes merged commit e7c9f93 into develop Sep 8, 2026
3 checks passed
@elson-vinicius-lopes
elson-vinicius-lopes deleted the hotfix/kestrel-https-crash-loop-e-rollback-mudo branch September 8, 2026 00:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant