Deploy e Infraestrutura¶
📋 Visão Geral¶
O Motor de Pricing é deployado como um container Docker na infraestrutura Google Cloud (Cloud Run / App Engine), utilizando Gunicorn como servidor WSGI.
🐳 Docker¶
Dockerfile¶
FROM python:3.11-slim AS base
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1
WORKDIR /app
RUN apt-get update \
&& apt-get install -y --no-install-recommends build-essential \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt ./
RUN pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt \
&& pip install --no-cache-dir gunicorn==23.0.0
COPY . ./
EXPOSE 8000
CMD ["gunicorn", "app:server", "--bind", "0.0.0.0:8000", \
"--timeout", "300", "--workers", "2", "--threads", "4", \
"--worker-class", "gthread"]
Detalhes da Configuração¶
| Parâmetro | Valor | Justificativa |
|---|---|---|
| Imagem base | python:3.11-slim |
Imagem leve, apenas o essencial |
| Servidor | Gunicorn 23.0.0 | Servidor WSGI de produção |
| Workers | 2 | Processos separados para lidar com requisições |
| Threads | 4 | Threads por worker (total: 8 threads) |
| Worker class | gthread |
Thread-based para I/O concorrente |
| Timeout | 300s (5 min) | Timeout alto para operações BigQuery/Dataform |
| Porta | 8000 | Porta exposta para o serviço |
PYTHONDONTWRITEBYTECODE=1
Evita criação de arquivos .pyc dentro do container, reduzindo tamanho da imagem.
☁️ Google Cloud¶
A aplicação detecta automaticamente o ambiente GCP via variáveis de ambiente:
if not (os.getenv('GAE_ENV') or os.getenv('CLOUD_RUN_SERVICE') or os.getenv('GOOGLE_CLOUD_PROJECT')):
load_dotenv() # Apenas em desenvolvimento local
| Variável | Detecta |
|---|---|
GAE_ENV |
Google App Engine |
CLOUD_RUN_SERVICE |
Cloud Run |
GOOGLE_CLOUD_PROJECT |
Qualquer serviço GCP |
Variáveis de Ambiente Necessárias¶
| Variável | Obrigatória | Descrição |
|---|---|---|
ENVIRONMENT |
Sim | dev para desenvolvimento, outro valor para produção |
GCP_PROJECT_ID |
Dev only | ID do projeto GCP (produção usa default) |
GCP_DATASET_ID |
Dev only | Dataset BigQuery (produção usa gold_pricing) |
BUCKET_NAME |
Sim | Bucket GCS para armazenamento |
GOOGLE_APPLICATION_CREDENTIALS |
Dev only | Caminho para JSON de credenciais |
SERVICE_ACCOUNT_EMAIL |
Referência | Email da service account |
Credenciais em Produção
Em produção (Cloud Run/GAE), as credenciais são gerenciadas automaticamente pela service account do serviço. O arquivo google_credentials.json é necessário apenas para desenvolvimento local.
⚙️ Ambientes¶
Desenvolvimento Local¶
# Configuração
ENVIRONMENT=dev
# Logging
logging: DEBUG level
# Servidor
python app.py → Dash dev server (porta 8000, debug=True)
Produção¶
# Configuração
ENVIRONMENT=prod (ou qualquer valor != "dev")
# Logging
logging: INFO level
# Servidor
gunicorn app:server --bind 0.0.0.0:8000
Diferenças por Ambiente¶
| Aspecto | Desenvolvimento | Produção |
|---|---|---|
| Servidor | Dash dev server | Gunicorn |
| Debug | Ativado (hot reload) | Desativado |
| Logging | DEBUG | INFO |
| Credenciais | Arquivo .env + google_credentials.json |
Service account automática |
| GCP Project | Via GCP_PROJECT_ID |
driven-strength-374020 |
| Dataset | Via GCP_DATASET_ID |
gold_pricing |
🔒 Segurança¶
Arquivos Sensíveis¶
Os seguintes arquivos não devem ser commitados (configurados no .gitignore):
.env— Variáveis de ambiente e secretsgoogle_credentials.json— Credenciais GCP*.pyce__pycache__/— Bytecode Python
Templates Disponíveis¶
| Arquivo | Uso |
|---|---|
.env-example |
Modelo para criar o .env local |
google_credentials-example.json |
Modelo para o arquivo de credenciais |
📊 Performance¶
Configuração do Gunicorn¶
| Aspecto | Valor | Impacto |
|---|---|---|
| Workers × Threads | 2 × 4 = 8 | 8 requisições simultâneas |
| Timeout | 300s | Suporta operações longas (Dataform pipelines) |
| Flask-Compress | Ativado | Compressão gzip nas respostas |
Otimizações da Aplicação¶
| Otimização | Descrição |
|---|---|
| Pre-loading paralelo | 18 tabelas carregadas em paralelo após login (8 threads) |
| Cache em memória | dcc.Store(storage_type='memory') para dados frequentes |
| Filtros client-side | Filtragem opera sobre cache, sem chamadas à API |
| ThreadPoolExecutor | Fetches paralelos para BigQuery |
Última atualização: Março 2026 | Versão 1.0