Seção 8: Stack de IA (Ollama + LiteLLM + Open WebUI + OpenClaw + OpenClaude)¶
A stack de IA roda na ai-desktop-vm. Todos os serviços estão em docker/stacks/ai/docker-compose.yml.
Arquitetura¶
Open WebUI ─┐
OpenClaw ───┤──► LiteLLM (proxy:4000) ──► Ollama (local, porta 11434)
OpenClaude ─┤ └──► APIs externas (Gemini, OpenAI, Anthropic)
- Ollama: Executa modelos LLM locais. Baixe modelos com
ollama pull llama3.2,ollama pull phi3, etc. - LiteLLM: Proxy OpenAI-compatible. Roteia requisições entre Ollama e APIs externas com fallback automático.
- Open WebUI: Interface web para chat com LLMs. Acessível em
https://openwebui.seudominio.com(Traefik dacore-services-vm+ Authelia, routeropenwebui-dynamicemansible/roles/infra/traefik-config/templates/dynamic_rag_services.yml.j2) ou na LAN emhttp://ai-desktop-ip:3000. - OpenClaw: CLI agent para terminal. Conecta ao LiteLLM.
- OpenClaude: Assistente AI com memória persistente e integração com ferramentas locais.
- Promtail (
promtail_ai): Envia os logs dos containers e do sistema desta VM ao Loki dacore-services-vm(http://<core_services_vm_ip_var>:3100). A configuração é gerada deansible/templates/promtail-config.yml.j2pelosetup-ai-volumes.yml.
Deploy¶
-
Execute o playbook de volumes:
-
Se Portainer está gerenciando a ai-desktop-vm:
- Adicione o endpoint da ai-desktop-vm no Portainer (via Portainer Agent ou TCP)
- Stacks > Add Stack > Nome:
ai - Cole o conteúdo de
docker/stacks/ai/docker-compose.yml - Carregue
/opt/portainer_stack_envs/ai.env(já traz todos os segredos; nada a adicionar à mão) -
Deploy
-
Se deploy manual via CLI (na ai-desktop-vm):
Variáveis da stack¶
O ai.env é gerado por ansible/playbooks/setup-ai-volumes.yml (via ansible/templates/portainer_stack_env.j2) com mode: '0600', porque contém segredos.
| Variável | Origem |
|---|---|
DOCKER_PUID, DOCKER_PGID, SYSTEM_TIMEZONE |
comuns (vault) |
AI_STACK_*_PATH (inclui AI_STACK_PROMTAIL_*) |
vm_nfs_mount_base_path + zfs_docker_volumes_dataset_name |
AI_DESKTOP_VM_IP |
ai_desktop_vm_ip_var do hosts.ini |
LITELLM_MASTER_KEY |
vault litellm_master_key |
OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY |
vault llm_api_keys.openai, .anthropic, .google_gemini |
OPENWEBUI_SECRET_KEY |
vault openwebui_secret_key |
Passos manuais ao mudar variáveis ou segredos¶
- Confira no vault real (
ansible-vault edit ansible/inventories/home/group_vars/all/vault.yml) quelitellm_master_key,llm_api_keys.*eopenwebui_secret_keyestão preenchidos; gere chaves novas comopenssl rand -hex 32(evite$,#, aspas e espaços: o.envnão usa aspas). - Simule e depois aplique o playbook (sem
--diff, que imprimiria os segredos do.envno terminal): - No Portainer, abra a stack
ai, recarregue/opt/portainer_stack_envs/ai.envem Env e clique em Update the stack.
O setup-ai-volumes.yml também aplica o role ansible/roles/apps/ml-tools/ na ai-desktop-vm (ferramentas de ML e dependências da stack).
Configuração do LiteLLM¶
O arquivo config.yaml é gerado pelo Ansible a partir de ansible/templates/litellm_config.yaml.j2. Modelo base:
general_settings:
master_key: "sua-chave-master"
model_list:
- model_name: claude-sonnet
litellm_params:
model: claude-sonnet-4-20250514
api_key: "sk-ant-..."
- model_name: gemini-flash
litellm_params:
model: gemini/gemini-2.5-flash
api_key: "AIza..."
- model_name: open-webui
litellm_params:
model: openai/gpt-4o
api_key: "sk-..."
- model_name: local
litellm_params:
model: ollama/llama3.2
api_base: "http://ollama:11434"
Baixando Modelos no Ollama¶
# Na ai-desktop-vm, ou via docker exec
docker exec -it ollama ollama pull llama3.2
docker exec -it ollama ollama pull phi3
docker exec -it ollama ollama list
Acessando os Serviços¶
| Serviço | URL | Porta |
|---|---|---|
| Open WebUI | https://openwebui.seudominio.com (Authelia) ou http://ai-desktop-ip:3000 |
3000 |
| LiteLLM API | http://ai-desktop-ip:4000 |
4000 |
| Ollama API | http://ai-desktop-ip:11434 |
11434 |
| OpenClaw | Terminal (via docker exec -it openclaw sh) |
N/A |
| OpenClaude | Terminal (via docker exec -it openclaude sh) |
N/A |