Este documento detalha o empacotamento em containers e a orquestração utilizando o Docker e Docker Compose para o projeto BrasilnaCopaAI. Esta abordagem permite que o projeto seja executado de forma idêntica em qualquer sistema operacional (Linux, Windows, macOS), encapsulando dependências e isolando a execução de forma profissional.
O projeto é dividido em dois containers principais mapeados em uma rede isolada do Docker Compose:
[Usuário] ──> [Porta 8501] ──> [brasil-copa-frontend (Streamlit)]
│
│ (Rede Interna Docker)
▼
[Porta 8000] ──> [brasil-copa-backend (FastAPI)]
- Imagem Base:
python:3.12-slim. - Healthcheck: Configurado para verificar periodicamente a integridade do endpoint
/healthviacurl. - Inicialização Inteligente: Utiliza um script de entrypoint Python (
docker/entrypoint.py) que gerencia a preparação do ambiente no container de forma automática. - Volumes de Persistência:
chroma-data: Persiste a base de dados vetorial ChromaDB.model-data: Persiste os modelos de embeddings locais (se ativados).raw-dataeprocessed-data: Persiste os arquivos JSON brutos e higienizados.
- Imagem Base:
python:3.12-slim. - Comunicação: Conecta-se diretamente ao container do backend utilizando o DNS interno do Docker (
http://backend:8000).
A grande vantagem da dockerização do projeto é que o pipeline de inicialização (download de modelos, coleta de dados da Wikipedia e indexação do ChromaDB) é executado de forma 100% autônoma no primeiro boot!
- Ter o Docker e o Docker Compose instalados em sua máquina.
- Ter a chave de API do Gemini em mãos.
Crie um arquivo .env na raiz do projeto contendo suas chaves. Exemplo:
GEMINI_API_KEY=sua_chave_aqui
USE_LOCAL_EMBEDDINGS=trueExecute o comando a seguir na raiz do projeto:
docker compose up --build- O Docker compilará as imagens do backend e frontend.
- O backend iniciará e o script
docker/entrypoint.pyentrará em ação. - Se
USE_LOCAL_EMBEDDINGS=true, ele baixará o modelo ONNX e tokenizer do Hugging Face. - Se o banco vetorial estiver vazio, ele iniciará a coleta da Wikipédia e fará a indexação no ChromaDB.
- O backend FastAPI subirá.
- O frontend Streamlit detectará que o backend está saudável (via healthcheck) e iniciará.
O chatbot estará acessível em: http://localhost:8501.
- Subir em segundo plano (detached mode):
docker compose up -d
- Visualizar logs em tempo real:
docker compose logs -f
- Visualizar logs apenas do backend ou do frontend:
docker compose logs -f backend docker compose logs -f frontend
- Parar e remover os containers mantendo os dados persistidos:
docker compose down
- Limpar os dados indexados e reiniciar do zero (deletando volumes):
docker compose down -v docker compose up --build
- Variáveis de Ambiente: Nenhuma chave de API está embutida nas imagens Docker. Elas são injetadas dinamicamente via arquivo
.env(que está no.gitignore). - Execução sem Root: Em ambientes de produção reais, recomenda-se configurar usuários não-root nos Dockerfiles para limitar os privilégios dentro do container.
- Isolamento de Portas: Apenas as portas de rede necessárias (
8000para a API Swagger e8501para o Streamlit) são expostas para o host externo. A comunicação interna ocorre em uma rede bridge segura e privada criada pelo compose.