404 Not Found

404 Not Found


nginx

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


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

100%
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

100%
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
# 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:

TEXT
// 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

PYTHON
# 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:

TEXT
# 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

PYTHON
# 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:

TEXT
# 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

YAML
# 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:

TEXT
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

100%
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

P A implantação blue-green requer o dobro de servidores?
R Sim, dois conjuntos de ambientes são necessários durante a troca. Para ambientes K8s, rolling updates podem ser usados em vez, sem necessidade de recursos adicionais.
P Como o release canary distribui o tráfego?
R O Nginx usa o parâmetro 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.
P O que fazer se ocorrer lock de tabela durante uma migração de banco de dados?
R Use 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.
P Qual é a diferença entre logs estruturados e logs comuns?
R Logs estruturados estão em formato JSON, com cada entrada de log contendo campos fixos (timestamp, level, message, request_id); podem ser parseados e pesquisados por máquinas. Logs comuns são texto legível por humanos que é difícil para máquinas parsearem.
P O que monitorar durante a primeira hora após a implantação?
R Monitore as três métricas core no dashboard Grafana: QPS (está normal?), latência P99 (teve pico?), e taxa de erro (é > 1%). Verifique também o agregador de logs por mensagens ERROR.
P Quanto tempo leva um rollback?
R Um rollback Docker leva cerca de 30 segundos (trocar de volta para a versão de imagem antiga e reiniciar). Rollbacks de banco de dados dependem da complexidade da migração; exclusões simples de coluna levam poucos segundos, enquanto migrações complexas podem exigir reparo de dados.

📖 Resumo


📝 Exercícios

  1. 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.
  2. 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")
  3. 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

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%