Como Instalar Ollama e Open WebUI com Docker Compose: Guia Passo a Passo com Nemotron-3-Nano 30B

Docker · Ollama · Open WebUI · LLM Local · NVIDIA Nemotron · IA sem custos de API  |  ✎ Duarte Spínola  |  27 de Abril de 2026

O Ollama é o servidor que corre modelos de linguagem localmente. O Open WebUI é a interface web que transforma essa capacidade numa experiência idêntica ao ChatGPT — com histórico de conversas, gestão de modelos e suporte a múltiplos utilizadores. Combinados através de Docker Compose, ficam prontos em minutos. Este guia cobre a configuração completa e o carregamento do modelo NVIDIA Nemotron-3-Nano 30B — um modelo MoE híbrido com 31.6B parâmetros totais, 3.5B activos por token, contexto de 1 milhão de tokens, e apenas 24 GB de espaço em disco.

ℹ O que é o Nemotron-3-Nano 30B

Desenvolvido pela NVIDIA, o Nemotron-3-Nano usa uma arquitectura Mixture-of-Experts (MoE) híbrida — tem 30B parâmetros totais mas activa apenas 3.5B por token, tornando-o eficiente em termos de VRAM. Suporta raciocínio passo a passo (chain-of-thought), ferramentas (tool use) e tem uma janela de contexto de 1 milhão de tokens. Licença NVIDIA Open Model — uso comercial permitido.

1. Pré-requisitos

Requisito Detalhe
Docker Engine + Docker Compose Docker 24+ com docker compose (v2). No Windows usar Docker Desktop com WSL2.
RAM / VRAM para o modelo nemotron-3-nano:30b requer ~24 GB. Em CPU: 32 GB RAM. Em GPU NVIDIA: 24 GB VRAM (RTX 3090/4090, A5000). Apple Silicon: 32 GB de RAM unificada.
Espaço em disco ~30 GB livres — 24 GB para o modelo + imagens Docker (~6 GB)
GPU NVIDIA (opcional mas recomendado) Para acelerar com GPU: NVIDIA Container Toolkit instalado no host Linux/WSL2

⚠ Hardware sem GPU dedicada

Sem GPU, o Ollama corre o modelo em CPU — funciona mas é lento (1–5 tokens/segundo). Para uso quotidiano sem GPU, considerar o modelo mais leve nemotron-3-nano:4b (2.8 GB, 8 GB RAM) ou qwen2.5:7b.

2. Estrutura dos Ficheiros

Criar uma pasta dedicada para o projecto — todos os ficheiros ficam aqui:

# Linux / macOS / WSL2
mkdir ~/ollama-webui && cd ~/ollama-webui

# A estrutura final será:
ollama-webui/
└── docker-compose.yml

# Os modelos e dados do Open WebUI ficam em volumes Docker (fora desta pasta)

3. Criar o Ficheiro docker-compose.yml

Criar o ficheiro docker-compose.yml com o seguinte conteúdo. Estão disponíveis três variantes — escolher a adequada ao hardware:

Variante A — CPU apenas (sem GPU)

# docker-compose.yml — CPU apenas

services:

ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
– “11434:11434” # API Ollama — acessível em localhost:11434
volumes:
– ollama_data:/root/.ollama # modelos persistentes
restart: unless-stopped

open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
– “3000:8080” # interface web em http://localhost:3000
volumes:
– open_webui_data:/app/backend/data
environment:
– OLLAMA_BASE_URL=http://ollama:11434 # endereço interno do serviço ollama
extra_hosts:
– “host.docker.internal:host-gateway”
depends_on:
– ollama
restart: unless-stopped

volumes:
ollama_data:
open_webui_data:

Variante B — GPU NVIDIA

# docker-compose.yml — GPU NVIDIA (requer NVIDIA Container Toolkit)

services:

ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
– “11434:11434”
volumes:
– ollama_data:/root/.ollama
deploy:
resources:
reservations:
devices:
– driver: nvidia
count: all # usar todas as GPUs disponíveis
capabilities: [gpu]
restart: unless-stopped

open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
– “3000:8080”
volumes:
– open_webui_data:/app/backend/data
environment:
– OLLAMA_BASE_URL=http://ollama:11434
extra_hosts:
– “host.docker.internal:host-gateway”
depends_on:
– ollama
restart: unless-stopped

volumes:
ollama_data:
open_webui_data:

Variante C — Container único com Ollama + Open WebUI integrados

Opção mais simples — um único container contém ambos os serviços. Recomendado para testes rápidos ou hardware sem GPU.

# Variante C — container único (sem docker-compose)
docker run -d -p 3000:8080 \
-v ollama_data:/root/.ollama \
-v open_webui_data:/app/backend/data \
–name open-webui \
–restart always \
ghcr.io/open-webui/open-webui:ollama

ℹ Porque dois containers separados são preferíveis

Com o Docker Compose (Variantes A e B), o Ollama e o Open WebUI podem ser actualizados e reiniciados independentemente — uma actualização ao Open WebUI não afecta os modelos carregados. O Ollama funciona sem o Open WebUI. Os recursos de CPU/RAM podem ser limitados por container de forma independente.

4. Iniciar os Containers

Na pasta onde está o docker-compose.yml, executar:

# Iniciar ambos os serviços em segundo plano
docker compose up -d

# Verificar que os dois containers estão a correr
docker ps

# Ver os logs em tempo real (Ctrl+C para sair)
docker compose logs -f

O output esperado do docker ps:

CONTAINER ID IMAGE STATUS PORTS NAMES
a1b2c3d4e5f6 ghcr.io/open-webui/open-webui:main Up 30 seconds 0.0.0.0:3000->8080/tcp open-webui
f6e5d4c3b2a1 ollama/ollama:latest Up 31 seconds 0.0.0.0:11434->11434/tcp ollama

5. Descarregar o Modelo Nemotron-3-Nano 30B

O Ollama corre dentro do container. Para descarregar e carregar modelos, é necessário entrar no container com docker exec e executar os comandos Ollama a partir de dentro.

Descarregar e iniciar o Nemotron-3-Nano 30B

# Entrar no container ollama e descarregar + iniciar o modelo num único comando
docker exec -it ollama ollama run nemotron-3-nano:30b

Este comando faz duas coisas em simultâneo: se o modelo não existir localmente, descarrega-o primeiro (~24 GB — pode demorar vários minutos dependendo da largura de banda); quando o download termina, abre uma sessão de chat interactivo no terminal. O output durante o download:

pulling manifest
pulling b725f1117407… ████████████████████ 24 GB 5.2 MB/s ~45 min
pulling bca58c750377… ████████████████████ 10 kB
verifying sha256 digest
writing manifest
success

>>> Send a message (/? for help)

Quando aparece o prompt >>>, o modelo está pronto. Escrever uma mensagem de teste e premir Enter para verificar que responde. Para sair da sessão de chat, escrever /bye ou usar Ctrl+D.

✓ Apenas descarregar sem abrir chat (pull)

Para descarregar o modelo sem abrir uma sessão interactiva — útil em scripts ou quando se quer pré-carregar em background:

docker exec ollama ollama pull nemotron-3-nano:30b

ℹ Diferença entre docker exec -it e docker exec

-it activa o modo interactivo (terminal com stdin/stdout ligados) — necessário para comandos que esperam input do utilizador como o ollama run (que abre um chat). Sem -it, o comando executa em background sem interacção — adequado para ollama pull e ollama list.

6. Aceder ao Open WebUI e Iniciar Conversa

1
Abrir o browser e navegar para http://localhost:3000
2
Na primeira visita: criar uma conta de administrador (apenas local — os dados ficam no container)
3
No topo da interface, clicar no selector de modelo e escolher nemotron-3-nano:30b (aparece automaticamente após o pull)
4
Escrever uma mensagem no campo de chat e premir Enter — o modelo responde directamente na interface

⚠ O modelo não aparece no selector do Open WebUI

Se o modelo não aparecer após o pull, verificar a ligação entre o Open WebUI e o Ollama em Definições → Connections → Ollama API. O URL deve ser http://ollama:11434 (nome do serviço Docker, não localhost). Se estiver incorreto, corrigir e clicar em Refresh.

7. Gerir Modelos Adicionais

O mesmo procedimento de docker exec serve para qualquer modelo disponível no Ollama. Outros modelos recomendados:

Modelo Tamanho Comando docker exec
nemotron-3-nano:4b 2.8 GB docker exec -it ollama ollama run nemotron-3-nano:4b
qwen2.5:7b 4.7 GB docker exec -it ollama ollama run qwen2.5:7b
qwen2.5:14b 9 GB docker exec -it ollama ollama run qwen2.5:14b
gemma3:12b 8.1 GB docker exec -it ollama ollama run gemma3:12b

Listar e remover modelos

# Listar todos os modelos descarregados
docker exec ollama ollama list

# Ver detalhes de um modelo (tamanho, parâmetros, quantização)
docker exec ollama ollama show nemotron-3-nano:30b

# Remover um modelo para libertar espaço em disco
docker exec ollama ollama rm nemotron-3-nano:30b

8. Comandos Úteis de Manutenção

# Parar os serviços sem remover dados
docker compose stop

# Retomar os serviços
docker compose start

# Actualizar as imagens (Ollama e Open WebUI) para a versão mais recente
docker compose pull
docker compose up -d

# Ver logs do Ollama
docker compose logs -f ollama

# Ver logs do Open WebUI
docker compose logs -f open-webui

# Ver consumo de recursos em tempo real
docker stats ollama open-webui

# Remover tudo (containers + redes) mas MANTER os modelos e dados do WebUI
docker compose down

# Remover tudo INCLUINDO volumes (APAGA modelos e histórico de conversas)
docker compose down -v

9. Resolução de Problemas Comuns

Problema Causa Solução
Open WebUI não carrega em localhost:3000 Container não está em execução ou a iniciar Verificar docker ps e docker compose logs open-webui
Nenhum modelo no selector do Open WebUI Open WebUI não consegue ligar ao Ollama — URL errado ou container ollama parado Definições → Connections → Ollama API — confirmar URL http://ollama:11434
GPU não detectada pelo Ollama NVIDIA Container Toolkit não instalado ou configuração de GPU ausente no docker-compose Instalar o toolkit e usar a Variante B do docker-compose. Verificar com docker exec ollama nvidia-smi
Download do modelo muito lento ou interrompido Ligação de rede lenta ou instável — 24 GB é um download de longa duração O Ollama retoma automaticamente downloads interrompidos — correr docker exec ollama ollama pull nemotron-3-nano:30b novamente
Respostas muito lentas (modo CPU) Modelo a correr em CPU — normal em hardware sem GPU dedicada Usar modelo mais pequeno: nemotron-3-nano:4b (2.8 GB) ou qwen2.5:7b

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário