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. Usa o LiteLLM como API compatível com OpenAI (
OPENAI_API_BASE_URL=http://litellm:4000/v1, chaveLITELLM_MASTER_KEY) e o Ollama direto para gerenciar modelos locais. Acessível emhttps://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.
- Diun (
diun_ai): Avisa (via n8n → Telegram) quando sai imagem nova de algum container desta VM; chamahttps://n8n.<domínio>/webhook/notificarcomNOTIFICACOES_WEBHOOK_TOKEN. Veja Painel e Notificações. - 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 |
NOTIFICACOES_WEBHOOK_TOKEN |
vault notificacoes_webhook_token (Diun) |
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: ele instala o driver AMD/ROCm da GPU (RX 5600 XT) e desativa uma eventual instalação nativa antiga do Ollama. O Ollama roda só em container (ollama/ollama:rocm, com /dev/kfd e /dev/dri).
Suporte da RX 5600 XT
A RX 5600 XT (RDNA1, gfx1010) não está na lista oficial de GPUs AMD do Ollama; se ela não for reconhecida, o Ollama roda em CPU (veja docker logs ollama). O resto da stack funciona igual.
Configuração do LiteLLM¶
O arquivo config.yaml é gerado pelo Ansible a partir do template abaixo (segredos vêm do vault). Para trocar ou acrescentar modelos, edite este bloco e siga o fluxo wiki-first; modelos locais precisam ser baixados no Ollama (próxima seção).
# ansible/templates/litellm_config.yaml.j2
# Gerado pelo setup-ai-volumes.yml em <NFS>/litellm/config/config.yaml.
general_settings:
master_key: "{{ litellm_master_key }}"
model_list:
- model_name: gpt-4o
litellm_params:
model: gpt-4o
api_key: "{{ llm_api_keys.openai }}"
- model_name: claude-3-opus
litellm_params:
model: claude-3-opus-20240229
api_key: "{{ llm_api_keys.anthropic }}"
- model_name: gemini-1.5-pro
litellm_params:
model: gemini/gemini-1.5-pro-latest
api_key: "{{ llm_api_keys.google_gemini }}"
- model_name: ollama/llama3.2
litellm_params:
model: ollama/llama3.2
api_base: "http://ollama:11434" # Ollama na mesma rede Docker (ai_network); ele não escuta no IP da VM
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 (chave: LITELLM_MASTER_KEY) |
4000 |
| Ollama API | só dentro da VM: http://127.0.0.1:11434 (ou docker exec -it ollama ...); os demais serviços usam http://ollama:11434 |
11434 |
| OpenClaw | Terminal (via docker exec -it openclaw sh) |
N/A |
| OpenClaude | Terminal (via docker exec -it openclaude sh) |
N/A |