Implantação, Docker e Documentação

O Menthor é implantado como uma API FastAPI conteinerizada, projetada para rodar em Máquinas Virtuais Linux utilizando Docker Engine e NGINX.

Esta aplicação utiliza uma arquitetura Docker-out-of-Docker (DooD), o que permite que a API principal instancie contêineres efêmeros isolados (Sandbox) para a execução dinâmica e segura de códigos Python.

Nota

Os valores de porta e IPs utilizados nesta documentação (como 8000 e 127.0.0.0) são exemplificativos. Deve-se utilizar parâmetros de acordo com a sua infraestrutura.

Ambiente de Servidor

  • Runtime: Uvicorn (dentro do container).

  • Orquestração: Docker Compose e Docker Engine.

  • Proxy Reverso: NGINX (recomendado para gerir SSL e porta 80/443).

Fluxo de Implantação (Step-by-Step)

1. Construir a Imagem do Sandbox

Antes de iniciar a API, é obrigatório construir a imagem do ambiente isolado localmente no host. Na raiz do repositório, execute:

docker build -f Dockerfile.sandbox -t mia-sandbox:py312-sci --no-cache .

Nota

Proteção contra rotinas de limpeza no servidor (Prune): Caso o servidor execute scripts periódicos de limpeza automática do Docker (ex: docker system prune), a imagem do sandbox pode ser removida por ser considerada sem uso. Para ancorar a imagem e evitar sua exclusão acidental, crie um contêiner âncora com o comando:

docker create --name ancora_mia_sandbox mia-sandbox:py312-sci

2. Configuração de Volumes (Atenção ao Caminho Absoluto)

Para que o Docker Host consiga repassar os arquivos gerados pela API (como scripts e .json de resultados) para o Sandbox, o contêiner da API precisa estar sincronizado fisicamente com o servidor.

No seu arquivo docker-compose.yml, o mapeamento do projeto deve utilizar caminhos absolutos idênticos nos dois lados do volume.

Exemplo estrutural:

services:
  fastapi-api:
    # ...
    volumes:
      # Habilita o DooD (Comunicação com o Docker Host)
      - /var/run/docker.sock:/var/run/docker.sock

      # Sincronização Absoluta: Substitua pelo caminho real do servidor
      - /root/menthor:/root/menthor

3. Subir a Aplicação

Com o sandbox preparado e os caminhos absolutos ajustados no compose, inicie a infraestrutura:

docker-compose up -d --build

Para acompanhar a execução e eventuais erros na inicialização da API:

docker-compose logs -f fastapi-api

Manutenção e Monitorização

Caso precise reiniciar o ambiente, limpar o cache ou investigar os arquivos gerados pela API diretamente por dentro do contêiner, utilize os comandos de apoio abaixo:

Derrubar a infraestrutura: Encerra e remove o contêiner da API e a rede criada de forma segura.

docker-compose down

Limpeza Profunda (Reconstrução Limpa): Se precisar forçar a recriação da imagem do zero (útil após alterar bibliotecas no requirements.txt ou instruções no Dockerfile), derrube a estrutura, remova a imagem local e suba novamente.

docker-compose down
docker rmi menthor_fastapi-api:latest
docker-compose up -d --build

Inspecionar por dentro do contêiner: Para abrir um terminal interativo (bash) diretamente dentro da aplicação e validar caminhos ou arquivos temporários, execute:

docker exec -it menthor-fastapi-app bash

Dica

Ao acessar o terminal do contêiner, você pode navegar pelos diretórios espelhados (ex: cd /root/menthor/sandboxes) e utilizar o comando ls -la para verificar a persistência, integridade e as permissões dos arquivos gerados pelo código (.py e .json) antes de eles serem enviados ao Sandbox pelo Host.

Considerações de NGINX

Certifique-se de que a configuração do NGINX aponta o proxy_pass para o host/porta corretos e que o firewall do servidor permite o tráfego necessário.

Abaixo, um exemplo de bloco (server) para mapeamento de um subdomínio para a aplicação rodando no servidor:

server {
    server_name menthor.seudominio.com.br;

    location / {
        proxy_pass http://127.0.0.0:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Geração e Compilação com Sphinx

A documentação técnica do sistema é gerada como um site estático HTML utilizando o Sphinx.

Compilação do HTML

Navegue até o diretório docs e execute o fluxo de compilação:

cd docs
make clean
make html

Os arquivos estáticos serão gerados no diretório docs/build/html/index.html.

Correção de Caracteres e Esquema OpenAPI

Se houver falhas com encoding ou caracteres especiais ao compilar endpoints da API, obtenha um arquivo openapi.json limpo extraído diretamente da API em execução:

# 1. Certifique-se de que a API está rodando
uvicorn projects.menthor.main_menthor:app --port 8000

# 2. Baixe o esquema OpenAPI atualizado
curl http://127.0.0.0:8000/openapi.json -o openapi.json

Publicação da Documentação no NGINX

A publicação do site estático da documentação no servidor de produção é realizada servindo diretamente o diretório gerado pelo Sphinx através de um bloco dedicado no NGINX.

1. Aplicar Permissões de Leitura e Travessia

O usuário do NGINX (geralmente www-data) precisa de permissão de travessia nos diretórios até a pasta de build:

# Permissão de travessia no caminho
chmod +x /root /root/menthor /root/menthor/docs /root/menthor/docs/build

# Permissão de leitura recursiva no HTML gerado
chmod -R 755 /root/menthor/docs/build/html

2. Bloco do NGINX para o Subdomínio de Docs

Adicione a configuração ao arquivo de site do NGINX (ex: /etc/nginx/sites-available/default):

server {
    server_name docs.menthor.aplicacoesmia.com.br;

    root /root/menthor/docs/build/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    listen 80;
}

3. Reiniciar o Serviço NGINX

sudo systemctl restart nginx

Nota

Sempre que o comando make html for executado no servidor, a documentação pública em docs.menthor.aplicacoesmia.com.br será atualizada automaticamente sem a necessidade de reiniciar o NGINX.