Deploy Kubernetes de producao¶
Este documento descreve a preparacao e a operacao do ambiente flow-prd.
Produção já estava ativa no cluster na conferência de 14/10/2026. As seções
de preparação inicial, bootstrap e virada de domínio são referências históricas;
não reaplicá-las como parte de cada release. Para rotina, seguir publicação,
deploy, verificação e rollback de aplicação conforme a pipeline.
Os manifests podem ser revisados e mergeados sem implantar workloads. O primeiro
deploy permanece bloqueado ate que PRODUCTION_DEPLOY_ENABLED=true seja
configurado no ambiente protegido production do GitLab.
Arquitetura e isolamento¶
- namespace:
flow-prd; - URL publica:
https://flow.ecomsmart.com.br; - overlay:
deploy/kubernetes/overlays/production; - PostgreSQL 16 interno em
merchants-db.flow-prd.svc.cluster.local; - PVC de 20 GiB com tres replicas Longhorn e politica
Retain; - kubeconfig exclusivo e limitado ao namespace;
- secrets exclusivos de producao;
- serializacao de deploy e rollback pelo
resource_groupflow-prd; - imagens imutaveis com tags formais
X.Y.Ze Git tagsvX.Y.Z; - PVCs dos StatefulSets retidos quando o StatefulSet for removido ou reduzido;
- duas replicas para landing, painel, gateway e frontend-entrypoint, protegidas por PodDisruptionBudgets.
Uma réplica PostgreSQL adicional foi observada no cluster em 14/10/2026, mas não está definida neste overlay. Seu gerenciamento, failover e backups precisam ser confirmados com a infraestrutura antes de tratá-la como alta disponibilidade.
Redis, MinIO e Weaviate continuam com uma replica. Isso preserva o modelo ja validado em HML, mas nao representa alta disponibilidade desses componentes. Backup e restauracao devem estar validados antes da liberacao do primeiro deploy.
Preparacao pelo administrador do cluster¶
O administrador deve aplicar uma unica vez:
kubectl apply -f deploy/kubernetes/bootstrap/gitlab-deployer-production-rbac.yaml
Depois, deve gerar um kubeconfig para o ServiceAccount gitlab-deployer do
namespace flow-prd. Esse kubeconfig nao deve possuir permissoes em outros
namespaces e sera armazenado no GitLab como variavel File.
O manifesto concede somente os recursos usados pelo deploy dentro de
flow-prd. Ele nao cria ClusterRole nem ClusterRoleBinding.
Variaveis do GitLab¶
Cadastre em Settings > CI/CD > Variables. Todas devem ser protegidas e ter
escopo de ambiente production quando a edicao do GitLab permitir:
| Variavel | Tipo | Valor inicial |
|---|---|---|
KUBE_CONFIG_PRODUCTION |
File | kubeconfig limitado a flow-prd |
K8S_PRODUCTION_SECRETS |
File | copia preenchida de production.env.example |
KUBE_CONTEXT_PRODUCTION |
Variable | opcional, contexto do kubeconfig |
PRODUCTION_DEPLOY_ENABLED |
Variable | false durante a preparacao |
PRODUCTION_DATABASE_BOOTSTRAP_ENABLED |
Variable | false; habilitar apenas para criar o banco inicial |
PRODUCTION_DATABASE_READY |
Variable | false ate restaurar e validar o banco |
DEPLOY_PRODUCTION_INGRESS |
Variable | false antes da virada de DNS |
VERIFY_PRODUCTION_PUBLIC_HEALTH |
Variable | false antes da virada de DNS |
K8S_REGISTRY_USER e K8S_REGISTRY_PASSWORD tambem precisam estar disponiveis
para o ambiente de producao. Nao copie automaticamente secrets de staging.
Em Settings > CI/CD > Protected environments, proteja production e
restrinja o deploy aos Maintainers responsaveis. Se a edicao oferecer approvals,
exija ao menos uma aprovacao adicional.
Checklist antes de habilitar¶
- Executar
production_access_checkem uma pipeline manual damain. - Aplicar a StorageClass de producao e executar o bootstrap do PostgreSQL.
- Gerar um dump consistente da VPS, restaurar e validar no cluster.
- Executar
production_database_access_check. - Confirmar backup externo e um procedimento de restauracao do PostgreSQL.
- Confirmar backup dos volumes de MinIO e Weaviate.
- Confirmar que o banco e as integracoes de producao nao apontam para HML.
- Revisar os efeitos das migrations pendentes.
- Confirmar capacidade do cluster para as novas replicas e volumes.
- Manter o DNS atual durante o primeiro deploy sem trafego publico.
- Somente entao definir
PRODUCTION_DATABASE_READY=trueePRODUCTION_DEPLOY_ENABLED=true.
PostgreSQL de producao¶
Um administrador do cluster aplica uma unica vez a StorageClass com retencao:
kubectl apply -f deploy/kubernetes/bootstrap/flow-prd-storage-class.yaml
Depois, com PRODUCTION_DATABASE_BOOTSTRAP_ENABLED=true, execute manualmente
production_database_bootstrap na main. O job cria apenas o Secret, Services,
StatefulSet e PVC do banco. Ele nao restaura dados, nao roda migrations da
aplicacao e nao inicia os demais workloads.
Mantenha PRODUCTION_DATABASE_READY=false ate concluir a restauracao descrita
em production-database-migration.md. Ao
terminar o bootstrap, retorne PRODUCTION_DATABASE_BOOTSTRAP_ENABLED=false.
As tres replicas Longhorn protegem os blocos contra perda de um disco ou no, mas o PostgreSQL continua com uma unica instancia. Isso permite reagendamento com o mesmo volume; nao representa alta disponibilidade do processo e nao substitui backup externo.
Primeiro deploy¶
- No modo trunk atual, abra um MR de qualquer branch para
maincom título SemVer válido. No modopromotion, somentedeveloporigina esse MR. - Aguarde testes, revisao e merge.
- No modo trunk, confirme primeiro
flow_build_all_imagesverde para o SHA integrado damain. Depois confira quepublish_production_versionpublicou a Git tagvX.Y.Ze as imagens correspondentes com a tagX.Y.Z. - Execute manualmente
deploy_production. - O job aplica infraestrutura, executa a migration, aplica as aplicacoes e valida o gateway dentro do cluster.
verify_production_stabilityinicia cinco minutos depois e verifica replicas, imagens, reinicios e o health interno.
O Ingress nao e aplicado enquanto DEPLOY_PRODUCTION_INGRESS=false.
Virada de dominio¶
Depois de validar os workloads sem trafego publico:
- defina
DEPLOY_PRODUCTION_INGRESS=true; - execute novamente
deploy_productionpara aplicar Ingress e Certificate; - confirme certificado valido e endereco do Ingress;
- altere Cloudflare/DNS de
flow.ecomsmart.com.brpara o Ingress do cluster; - valide
/health,/,/login, onboarding e APIs; - defina
VERIFY_PRODUCTION_PUBLIC_HEALTH=true.
Nao remova imediatamente o destino legado. Mantenha-o como contingencia ate a nova publicacao completar a janela de observacao.
Rollback de aplicacao¶
Inicie uma pipeline manual da main informando:
ROLLBACK_IMAGE_TAG=X.Y.Z
Execute rollback_production. O job exige a tag formal da imagem, reaplica as imagens,
aguarda os rollouts e executa smoke test interno. Ele deliberadamente nao
reverte migrations do banco; portanto a versao escolhida precisa ser compativel
com o schema atual.
Rollback destrutivo de banco nao e automatizado. Ele exige backup, plano especifico para a migration e janela de manutencao aprovada.