Voltar para o blog
post.md

Se o GitHub cair, sua aplicação continua de pé?

O incidente do GitHub mostra que uma aplicação pode continuar no ar e, mesmo assim, perder a capacidade de fazer deploy, escalar ou executar um rollback.

GitHubCI/CDDevOpsResiliênciaRollbackDisaster Recovery

Produção resiliente não é apenas manter os processos atuais rodando. É preservar a capacidade de escalar, reconstruir e voltar para uma versão estável quando uma dependência externa falha.

O que aconteceu com o GitHub

Na manhã de 17 de agosto de 2026, o GitHub começou a apresentar uma degradação ampla. O incidente foi aberto às 13h40 UTC, 10h40 no horário de Brasília, e afetou Git Operations, API Requests, Actions, Pull Requests, Issues, Pages, Webhooks e Copilot.

Durante o incidente, o GitHub informou aproximadamente 20% de erros em experiências web e tráfego de API. Downloads de arquivos brutos e arquivos compactados chegaram a cerca de 50% de erro. SAML, OIDC, SCIM e Team Sync também sofreram impacto.

Uma mitigação ampla foi registrada às 16h59 UTC, mas algumas falhas voltaram ou permaneceram de forma residual em operações Git, Issues, API e autenticação. O incidente foi encerrado às 21h15 UTC, 18h15 em Brasília: 7 horas e 35 minutos entre abertura e resolução.

Isso não significa que todo o GitHub ficou completamente fora do ar durante todo o período. Os serviços se recuperaram em momentos diferentes, e parte do impacto foi uma taxa elevada de erros, não indisponibilidade total uniforme.

Na data de publicação, o GitHub informou que identificou um componente problemático e aplicou ações corretivas, mas ainda não havia publicado a análise detalhada de causa-raiz. Atribuir a falha a ataque, DNS, banco de dados, deploy ou sobrecarga seria especulação.

A pergunta que fica depois do incidente

Ao acompanhar as atualizações, uma pergunta me pareceu mais útil do que tentar adivinhar a causa: se o GitHub ficar indisponível, sua aplicação continua de pé e ainda pode ser recuperada?

Se o código já foi compilado, os servidores estão executando e nenhum recurso é carregado diretamente do GitHub, a aplicação pode continuar atendendo usuários normalmente. Mas o que acontece se um pod precisar ser substituído, uma nova instância tiver que subir ou a equipe precisar voltar para a versão anterior?

Uma produção aparentemente saudável pode ter perdido sua capacidade de recuperação. Esse é o risco menos visível — e mais interessante — de uma falha desse tipo.

Ilustração de um repositório indisponível, um artefato protegido e servidores de produção que continuam operando.
Separar código-fonte, artefatos e runtime preserva um caminho de recuperação quando uma plataforma externa falha.

Quatro níveis de dependência do GitHub

1. Colaboração

Pull Requests, Issues e revisão ficam indisponíveis. A equipe trabalha com mais atrito, mas ainda pode criar commits localmente e esperar a plataforma voltar. O impacto inicial é interno.

2. Entrega

Actions, webhooks, APIs ou OIDC param de funcionar. A versão atual continua executando, mas mudanças urgentes não chegam a produção. O risco passa do desenvolvimento para a operação.

3. Recuperação

Imagens, manifests, pacotes ou o repositório de GitOps não podem ser obtidos. Rollback, autoscaling, substituição de pods e reconstrução de ambiente podem falhar. Um segundo incidente fica mais difícil de conter.

4. Runtime

A aplicação consulta APIs, usa GitHub OAuth, serve conteúdo por Pages ou baixa arquivos brutos durante a requisição. A indisponibilidade chega diretamente ao usuário.

Onde o acoplamento aparece sem ser percebido

  • GitHub Actions é o único caminho autorizado de deploy.
  • Imagens de produção existem apenas no GHCR.
  • Pacotes privados estão somente no GitHub Packages.
  • Argo CD ou Flux leem manifests diretamente do GitHub.
  • A aplicação baixa configuração por raw.githubusercontent.com.
  • O pipeline depende do OIDC do GitHub para receber credenciais temporárias.
  • Webhooks acionam processos sem fila, redelivery ou reconciliação.
  • O procedimento de rollback começa abrindo a aba Actions.

Nenhuma dessas ferramentas é ruim por si só. O problema aparece quando uma dependência de desenvolvimento passa a ocupar um caminho que deveria sobreviver a uma falha externa.

Backup de código não é continuidade operacional

Uma resposta comum é criar um mirror do repositório. Isso é útil: o Git permite clonar todas as refs com git clone --mirror, atualizar o espelho e enviar o conteúdo para outro servidor. Git bundles também podem preservar histórico e refs sem um servidor ativo.

O mirror, porém, preserva o repositório Git. Ele não replica automaticamente Pull Requests, Issues, secrets, ambientes, histórico do Actions, caches, artefatos de workflows, Packages, regras organizacionais e integrações.

Também é preciso definir o atraso aceitável de sincronização e como o espelho será promovido sem criar duas fontes de verdade. Um failover bidirecional improvisado pode gerar divergência quando o GitHub voltar.

Backup preserva informação. Continuidade preserva capacidade operacional.

Self-hosted runner não é independência do Actions

Mover o runner para uma máquina da empresa oferece controle sobre hardware, sistema operacional, rede e ferramentas. Isso reduz a dependência da capacidade computacional hospedada pelo GitHub, mas o runner continua conectado ao GitHub para receber atribuições de jobs.

O plano de controle permanece no Actions. Em GitHub Cloud, caches de workflow usados por self-hosted runners também ficam em armazenamento controlado pelo GitHub.

O incidente do Actions ocorrido entre 6 e 7 de agosto reforça a diferença: GitHub-hosted e self-hosted runners foram afetados pelo problema no processamento e na atribuição de jobs.

Self-hosted runner é uma escolha de execução. Não é, sozinho, um plano de continuidade para o plano de controle.

Uma arquitetura mínima de referência

Retirar o GitHub do runtime

A aplicação em execução deve consumir recursos do ambiente de produção: imagens de um registry adequado, configurações de um serviço próprio, secrets de um cofre de credenciais e assets de object storage ou CDN. Buscar código ou configuração no GitHub durante uma requisição transforma uma ferramenta de desenvolvimento em dependência de runtime.

Construir uma vez e implantar muitas

caminho-de-entrega.txttext
1código2  -> build e testes3  -> artefato imutável4  -> registry ou repositório de artefatos5  -> deploy por versão ou digest

O rollback não deveria recompilar o commit anterior. Deveria apontar para um artefato já construído, validado e armazenado. Em containers, tags ajudam humanos, mas o digest identifica exatamente o conteúdo. Para cargas críticas, o registry pode ser independente do GitHub e replicado antes da falha.

Manter o pipeline portável

Quanto mais lógica existe apenas no YAML do GitHub Actions, maior o custo de executar o processo em outro lugar. Build, testes, empacotamento e deploy podem ficar em scripts, Makefile ou Taskfile. O Actions continua como orquestrador principal, mas chama comandos que outro sistema também consegue executar.

Separar entrega de recuperação

Um deploy normal pode exigir todos os gates. Um rollback de emergência tem outra finalidade: restaurar uma versão já aprovada. O caminho precisa saber qual versão está em produção, onde está o último artefato estável, quem pode autorizar a operação e como registrar a evidência depois.

Credencial de emergência não deve significar token administrativo permanente. O acesso precisa ser limitado, auditado e, quando possível, temporário.

Tratar webhooks como eventos que falham

O GitHub informa que entregas de webhook com falha não são reenviadas automaticamente. Uma integração confiável precisa de processamento idempotente, fila persistente, retries com backoff, dead-letter queue, redelivery e reconciliação periódica de estado.

Um plano prático em três horizontes

Agora

  • Mapear chamadas para GitHub, API, raw content, GHCR, Packages e OIDC.
  • Confirmar onde estão os últimos artefatos estáveis.
  • Verificar se rollback exige um novo build.
  • Documentar o caminho manual de recuperação.
  • Assinar os alertas do GitHub Status.

Nos próximos 30 dias

  • Criar mirror dos repositórios realmente críticos.
  • Guardar imagens de produção em registry adequado e avaliar replicação.
  • Retirar a lógica principal de dentro do YAML do pipeline.
  • Configurar proxy para pacotes necessários.
  • Criar reconciliação para webhooks importantes.
  • Preparar um caminho reduzido de deploy ou rollback independente do Actions.

Trimestralmente

  • Simular indisponibilidade do GitHub.
  • Tentar escalar ou recriar uma instância durante o teste.
  • Executar rollback sem usar a interface do GitHub.
  • Medir RTO e RPO reais.
  • Revisar credenciais de emergência e trilhas de auditoria.
  • Atualizar o runbook com o que falhou no exercício.

Um plano que nunca foi executado é apenas uma hipótese bem formatada.

O custo da redundância também importa

Nem todo projeto precisa de dois provedores Git, dois pipelines, dois registries e failover automático. Essa complexidade tem custo financeiro, operacional e de segurança. RTO define quanto tempo a operação pode ficar indisponível; RPO define quanto estado recente pode ser perdido.

Um blog pessoal pode aceitar aguardar o fornecedor voltar. Um sistema de pagamento pode precisar de rollback e reconstrução durante a falha de uma plataforma externa. A arquitetura deve seguir a criticidade, não o medo do incidente do dia.

Conclusão

O incidente chama atenção porque o GitHub está no centro do trabalho de muitas equipes. Mas o aprendizado vai além de um fornecedor específico. Qualquer plataforma pode virar um single point of failure quando passa a controlar sozinha o código, o pipeline, o artefato, a identidade e o caminho de recuperação.

Uma aplicação resiliente não precisa fingir que dependências externas nunca falham. Ela precisa continuar previsível quando elas falham.

Se o GitHub cair e sua produção continuar atendendo, isso é um bom começo. Se você ainda conseguir escalar, recuperar e voltar para uma versão estável, aí existe uma estratégia de resiliência de verdade.