Implantação e Lançamento do Projeto — Do Desenvolvimento à Produção
Lançar um produto é como lançar um foguete—as primeiras 24 lições cobrem design e fabricação, e esta lição é sobre a contagem regressiva e o lançamento. Há uma longa checklist antes do lançamento, e você não pode acender os motores até que cada item seja verificado. Lançar sem checklist é um jogo de azar.
1. O Que Você Vai Aprender
- Checklist de Ambiente de Produção: Avaliação Tridimensional de Segurança, Performance e Monitoramento
- Estratégias de Release Gradual: Abordagens de Implementação para Implantação Blue-Green e Implantação Canary
- Segurança de Migração de Banco de Dados: Melhores Práticas Alembic para Migração Zero Downtime
- Agregação de Logs: Logs Estruturados + Integração ELK / Loki
- Alice: O Capítulo Final—PriceTracker é Oficialmente Lançado
2. A História Real da Alice
(1) Dor: Incidentes Frequentes Durante a Implantação
O PriceTracker enfrentou problemas durante suas duas primeiras implantações: a primeira vez, esqueceram de configurar HTTPS; a segunda vez, um lock de tabela durante uma migração de banco de dados causou 10 minutos de interrupção do serviço; e a terceira vez, os logs não estavam agregados, então após um problema surgir, Charlie gastou duas horas peneirando logs em cinco servidores. Alice precisa de um processo de implantação sistemático para garantir que cada implantação seja segura e controlável.
(2) Solução com Checklist de Implantação
Implantação não é apenas "empurrar o código e pronto"; é uma série de checklists: hardening de segurança, validação de performance, estratégia de migração, release gradual e verificação de monitoramento—você só pode avançar para o próximo passo após verificar cada item.
(3) Resultado
Terceira implantação: Todos os itens da checklist foram verificados; HTTPS foi configurado; a migração foi concluída com zero downtime; um release gradual foi iniciado roteando primeiro 10% do tráfego para validação; e os logs foram automaticamente agregados ao Loki—todo o processo de implantação ocorreu sem problemas, e o dashboard de monitoramento do Charlie permaneceu verde o tempo todo.
3. Checklist de Ambiente de Produção
(1) Processo de Lançamento
flowchart TD
A[Code Freeze] --> B[Auditoria de Segurança]
B --> C[Teste de Carga]
C --> D[Implantação Staging]
D --> E[Teste de Fumaça]
E --> F[Release Canary 10%]
F --> G{Métricas OK?}
G -->|Sim| H[Release Completo 100%]
G -->|Não| I[Rollback]
I --> J[Investigar]
J --> A
H --> K[Monitorar 1h]
K --> L[✓ No Ar]
(2) Checklist Tridimensional
| Dimensão | Item de Verificação | Status |
|---|---|---|
| Segurança | Certificado HTTPS Configurado | ☐ |
| CORS permite apenas domínios de produção | ☐ | |
| Rate Limiting Habilitado | ☐ | |
| JWT SECRET_KEY foi alterado | ☐ | |
| Sem chaves hardcoded | ☐ | |
| Scan de segurança passou | ☐ | |
| Performance | Uvicorn Workers ≥ 4 | ☐ |
| Tamanho adequado do pool de conexões DB | ☐ | |
| Cache Redis Habilitado | ☐ | |
| Compressão GZip habilitada | ☐ | |
| Teste de carga passou (QPS alvo) | ☐ | |
| Monitoramento | Endpoint /health está normal | ☐ |
| Coleta de Métricas Prometheus | ☐ | |
| Dashboard Grafana Pronto | ☐ | |
| Configuração de Regras de Alerta | ☐ | |
| Agregação de Logs Rodando | ☐ |
4. Estratégia de Release Gradual
(1) Implantação Blue-Green
flowchart LR
LB[Load Balancer] -->|100% tráfego| Blue[Blue v1]
subgraph Deploy
Green[Green v2]
end
LB -.->|Trocar| Green
style Blue fill:#4caf50
style Green fill:#2196f3
| Passo | Ação | Rollback |
|---|---|---|
| 1 | Implantar ambiente Green (v2) | - |
| 2 | Executar testes de fumaça no Green | - |
| 3 | LB Trocar para Green | Trocar de volta para Blue |
| 4 | Monitorar Green por 30 minutos | Trocar de volta para Blue |
| 5 | Estabilidade confirmada, Blue desativado | - |
(1) ▶ Exemplo: Configuração Blue-Green no Nginx
# nginx/conf.d/pricetracker.conf
upstream pricetracker_blue {
server api-blue:8000;
}
upstream pricetracker_green {
server api-green:8000;
}
# Atualmente servindo Blue
server {
listen 80;
server_name api.pricetracker.example.com;
location / {
proxy_pass http://pricetracker_blue;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# Trocar para Green alterando o alvo do proxy_pass
# Depois: docker compose -f docker-compose.green.yml up -d
Saída:
// Execução Bem-sucedida
(2) Release Canary
| Estratégia | Distribuição de Tráfego | Período de Observação | Rollback |
|---|---|---|---|
| 10% | 1 v2 + 9 v1 | 15 min | Trocar de volta para v1 |
| 30% | 3 v2 + 7 v1 | 15 min | Trocar de volta para v1 |
| 50% | 5 v2 + 5 v1 | 15 min | Trocar de volta para v1 |
| 100% | Tudo v2 | 30 min | Rollback da versão da imagem |
5. Migração de Banco de Dados Zero Downtime
(1) Princípios de Migração Segura
| Princípio | Descrição | Exemplo |
|---|---|---|
| Apenas Adicionar, Não Deletar | Adicionar uma nova coluna primeiro; não deletar a coluna antiga | ALTER TABLE ADD COLUMN new_col |
| Compatibilidade de escrita dupla | Código novo e antigo funcionam | Código novo escreve em duas colunas; código antigo lê apenas a coluna antiga |
| Limpeza Adiada | Deletar colunas antigas apenas após estabilidade confirmada | Deletar colunas antigas 7 dias após implantar v2 |
| Migração Incremental | Alterar apenas uma coisa por vez | Não adicionar colunas ou alterar tipos de dados em uma única migração |
(1) ▶ Exemplo: Migração Segura de Adição de Coluna
# alembic/versions/xxx_add_wholesale_price.py
"""Adicionar coluna wholesale_price aos produtos
Migração segura: ADD COLUMN é não-bloqueante no PostgreSQL
"""
def upgrade():
op.add_column(
"products",
sa.Column("wholesale_price", sa.Float(), nullable=True),
)
# Definir padrão para linhas existentes (instrução separada para performance)
op.execute("UPDATE products SET wholesale_price = base_price * 0.6 WHERE wholesale_price IS NULL")
# Tornar não-nulável na próxima migração após código implantado
def downgrade():
op.drop_column("products", "wholesale_price")
Saída:
# Função definida com sucesso
(2) Migração Arriscada vs. Migração Segura
| Tipo de Migração | Segurança | Risco de Lock de Tabela | Recomendações |
|---|---|---|---|
| ADD COLUMN | Segura | Nenhum | Pode ser executada online |
| CREATE INDEX | Relativamente segura | Possível | Usar CREATE INDEX CONCURRENTLY |
| DROP COLUMN | Risco | Sim | Certificar-se de que o código não a usa mais primeiro |
| ALTER COLUMN TYPE | Risco | Alto | Migração faseada (adicionar nova coluna → migrar dados → deletar coluna antiga) |
| RENAME COLUMN | Perigo | Médio | Renomear após habilitar compatibilidade de escrita dupla |
6. Agregação de Logs
(1) Logs Estruturados
(1) ▶ Exemplo: Configuração de Log Estruturado
# app/core/logging.py
import logging
import json
from datetime import datetime
class JSONFormatter(logging.Formatter):
def format(self, record):
log_entry = {
"timestamp": datetime.utcnow().isoformat(),
"level": record.levelname,
"message": record.getMessage(),
"module": record.module,
"function": record.funcName,
"line": record.lineno,
}
# Adicionar contexto de requisição se disponível
if hasattr(record, "request_id"):
log_entry["request_id"] = record.request_id
if hasattr(record, "user_id"):
log_entry["user_id"] = record.user_id
return json.dumps(log_entry)
# Configurar logging
logger = logging.getLogger("pricetracker")
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logger.addHandler(handler)
logger.setLevel(logging.INFO)
Saída:
# Função definida com sucesso
(2) Comparação de Soluções de Agregação de Logs
| Solução | Vantagens | Desvantagens | Cenários Recomendados |
|---|---|---|---|
| ELK (Elasticsearch + Logstash + Kibana) | Recursos abrangentes, capacidades de busca poderosas | Alto consumo de recursos | Projetos de grande escala |
| Loki+Grafana+Promtail | Leve, integrado com Grafana | Capacidades de busca limitadas | Projetos de pequeno e médio porte |
| CloudWatch Logs | Zero-Manutenção | Lock-in AWS | Implantação AWS |
(2) ▶ Exemplo: Adicionando Loki ao Docker Compose
# Adicionar ao docker-compose.yml
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
volumes:
- loki_data:/loki
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log:ro
- ./docker/promtail.yml:/etc/promtail/config.yml
depends_on:
- loki
Saída:
CONTAINER ID IMAGE STATUS PORTS
abc123 nginx:latest Up 2 hours 0.0.0.0:80->80/tcp
7. PriceTracker é Oficialmente Lançado
(1) Marcos de Conclusão do Projeto
gantt
title Linha do Tempo de Desenvolvimento do PriceTracker
dateFormat YYYY-MM-DD
section Fase 1
Introdução FastAPI :p1a, 2026-01-01, 1d
Instalação & UV :p1b, after p1a, 1d
Parâmetros Path & Query :p1c, after p1b, 1d
Corpo da Requisição & Pydantic :p1d, after p1c, 1d
Modelos de Resposta :p1e, after p1d, 1d
Capstone Fase 1 :p1f, after p1e, 2d
section Fase 2
Middleware :p2a, after p1f, 1d
Injeção de Dependência :p2b, after p2a, 1d
Banco de Dados SQLAlchemy :p2c, after p2b, 2d
Operações CRUD :p2d, after p2c, 1d
Autenticação JWT :p2e, after p2d, 2d
Capstone Fase 2 :p2f, after p2e, 2d
section Fase 3
WebSocket :p3a, after p2f, 1d
Celery :p3b, after p3a, 2d
Upload de Arquivo :p3c, after p3b, 1d
Testes :p3d, after p3c, 1d
Cache :p3e, after p3d, 1d
OpenAPI :p3f, after p3e, 1d
section Fase 4
Docker :p4a, after p3f, 1d
Performance :p4b, after p4a, 1d
Monitoramento :p4c, after p4b, 1d
CI/CD :p4d, after p4c, 1d
section Fase 5
Design de Projeto :p5a, after p4d, 1d
Desenvolvimento de Projeto :p5b, after p5a, 2d
Implantação de Projeto :p5c, after p5b, 1d
(2) Checklist de Verificação de Implantação
| Item de Verificação | Método de Verificação | Critério de Aprovação |
|---|---|---|
| Disponibilidade da API | curl /health |
{"status": "healthy"} |
| Integração Front-end | Bob Chama a API do Front End | Todos os Endpoints Funcionando Corretamente |
| Autenticação | Login JWT + Endpoints Protegidos | Login bem-sucedido; retorna 401 se não autenticado |
| Permissão | Rate Limiting Free/Pro/Enterprise | Limitado corretamente de acordo com o plano |
| WebSocket | Conexão + Feed de Preços | Receber Atualizações em Tempo Real |
| Cache | Taxa de Hit do Cache para Produtos Populares | > 80% |
| Monitoramento | Dashboard Grafana | Métricas Exibidas Normalmente |
| Alerta | Simulação de Pico P99 | Notificação de Alerta Disparada |
| Logs | Consultar Loki | Logs Estruturados Pesquisáveis |
| CI/CD | Implantação acionada por push de tag | Implantação automática bem-sucedida |
❓ Perguntas Frequentes
weight (server v2:8000 weight=1; server v1:8000 weight=9;), enquanto o K8s usa o Deployment canary para ajustar o número de réplicas.CREATE INDEX CONCURRENTLY (para criar índices sem bloquear tabelas) e evite executar instruções DDL durante horários de pico. Migre tabelas grandes em lotes.📖 Resumo
- Três Dimensões da Checklist de Implantação: Segurança (HTTPS/CORS/RateLimit), Performance (Workers/Pool de Conexões/Cache), Monitoramento (Métricas/Alertas/Logs)
- Implantação Blue-Green: Troca entre dois ambientes com rollback em segundos; Implantação Canary: Escalonamento gradual—10% → 30% → 50% → 100%
- Princípios de Migração Zero Downtime: Apenas Adicionar, Nunca Deletar; Compatibilidade de Escrita Dupla; Limpeza Adiada; Migração Incremental
- Logs JSON estruturados + agregação Loki/Grafana, com requisições rastreadas por
request_id - PriceTracker Oficialmente Lançado: Integração frontend do Bob bem-sucedida, sistema de monitoramento do Charlie dando sinal verde, e milhões de dados de preços fluindo de forma estável.
📝 Exercícios
- Exercício Básico (Dificuldade: ⭐): Crie uma checklist de implantação do PriceTracker (5 itens cada para segurança, performance e monitoramento) e use-a para verificar seu ambiente de implantação item por item. Dica: Consulte a tabela de checklist neste artigo.
- Problema Avançado (Dificuldade ⭐⭐): Implemente logging JSON estruturado (incluindo timestamp, level, message e request_id); adicione um middleware de logging para injetar o request_id em cada requisição; e configure Docker Compose e Loki para agregar os logs. Dica: JSONFormatter +
logging.getLogger("pricetracker") - Desafio (Dificuldade: ⭐⭐⭐): Complete o processo de implantação—escreva um script de migração seguro (siga o princípio "apenas adicionar, não deletar"), configure implantação blue-green no Nginx, configure regras de alerta do Grafana (P99 > 500 ms + taxa de erro > 5%), e realize verificação de release canary (primeiro roteie 10% do tráfego para v2, depois faça a troca completa). Dica:
CREATE INDEX CONCURRENTLY+ Troca de upstream Nginx
---| Voltar ao Sumário



