Como Instalar o Llama 3 num VPS Barato com Ollama e Docker
Guia completo para correr o Llama 3 8B no seu próprio servidor: requisitos de RAM, Docker Compose, Nginx com TLS e como medir o desempenho real.

1. Porque alojar o modelo em vez de usar uma API
Há três razões concretas para correr o Llama 3 em máquina própria. A primeira é o custo previsível: um VPS cobra um valor fixo mensal independentemente do número de pedidos, enquanto as APIs comerciais cobram por token e o valor cresce com a utilização. A segunda é a privacidade — se processa dados de clientes, contratos ou registos internos, manter tudo dentro de um servidor que controla evita enviar esse conteúdo a terceiros e simplifica a conformidade com o RGPD. A terceira é a ausência de limites de taxa: não há quotas nem cortes de serviço a meio de um processamento em lote. Em troca, assume a manutenção do servidor, as actualizações de segurança e uma qualidade de resposta inferior à dos modelos de fronteira. Vale a pena para classificação de texto, extracção de dados, resumos e tarefas repetitivas; não vale para raciocínio complexo.
2. Quanta RAM precisa, e porquê
O Llama 3 8B quantizado em 4 bits (Q4_K_M) ocupa cerca de 4,7 GB em disco, e é preciso carregá-lo inteiro em memória. A isso acresce a cache de contexto (KV cache), que cresce com o tamanho do prompt, mais a memória do sistema operativo e dos contentores. Na prática: **8 GB de RAM é o mínimo funcional** e fica apertado com contextos longos; **16 GB é confortável** e permite contextos maiores ou um segundo modelo carregado. Abaixo de 8 GB o sistema recorre a swap e a latência torna-se inutilizável. Quanto a CPU, o número de núcleos importa menos do que a geração. Um processador recente com AVX-512 faz inferência substancialmente mais rápida que um núcleo antigo, ao mesmo número de vCPUs. Prefira NVMe a SATA: o carregamento inicial do modelo lê vários gigabytes. **Sobre velocidade:** em CPU pura, sem GPU, conte com um ritmo de leitura — dezenas de tokens por segundo não é realista na maioria dos VPS económicos. Meça no seu servidor antes de assumir qualquer número; a secção 8 mostra como.
AlphaVPS
Instâncias AMD Ryzen com NVMe. Confirme a RAM e a geração do CPU no plano antes de contratar.
Ligação de afiliado: recebemos uma comissão se contratares, sem custo adicional para ti.
3. Preparar o servidor antes de instalar seja o que for
Um servidor acabado de provisionar está exposto. Antes de instalar o Ollama, feche as portas e crie um utilizador sem privilégios. Estes passos demoram cinco minutos e evitam que a máquina seja comprometida na primeira noite. Desactive o acesso por palavra-passe assim que confirmar que a chave SSH funciona — não antes, ou fica fora do seu próprio servidor. E note que a firewall só abre as portas 22, 80 e 443. A porta do Ollama, a 11434, fica deliberadamente fechada ao exterior; a secção 6 explica porquê.
# Utilizador sem privilégios
adduser deploy
usermod -aG sudo deploy
# Chave SSH (a partir da sua máquina local)
ssh-copy-id deploy@SEU_IP
# Firewall: apenas SSH e HTTP/HTTPS
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
# Só depois de confirmar que a chave funciona:
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart ssh
# Actualizações de segurança automáticas
apt update && apt install -y unattended-upgrades fail2ban
systemctl enable --now fail2ban4. Instalar o Docker
Use o repositório oficial do Docker, não o pacote `docker.io` das distribuições, que costuma estar várias versões atrasado e não inclui o plugin `compose` moderno. Depois de adicionar o utilizador ao grupo `docker`, termine a sessão e volte a entrar para que a alteração tenha efeito.
curl -fsSL https://get.docker.com | sh
usermod -aG docker deploy
# Confirmar
docker --version
docker compose version5. Ollama e Open WebUI com Docker Compose
Repare no detalhe mais importante deste ficheiro: o Ollama publica a porta em `127.0.0.1:11434`, não em `0.0.0.0`. Isto significa que só é acessível a partir do próprio servidor e dos outros contentores — nunca directamente da internet. O Open WebUI liga-se ao Ollama pela rede interna do Docker e é a única peça que virá a ser exposta, através do Nginx e sempre atrás de autenticação. Os volumes garantem que os modelos descarregados e as contas de utilizador sobrevivem a reinícios e actualizações dos contentores.
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
restart: unless-stopped
# Apenas loopback: nunca exposto à internet
ports:
- "127.0.0.1:11434:11434"
volumes:
- ollama_models:/root/.ollama
webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
depends_on:
- ollama
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_AUTH=true
ports:
- "127.0.0.1:8080:8080"
volumes:
- webui_data:/app/backend/data
volumes:
ollama_models:
webui_data:6. Descarregar o modelo e escolher a quantização
A quantização determina o compromisso entre memória e qualidade. `Q4_K_M` é o ponto de equilíbrio habitual e o que recomendo começar. `Q5_K_M` melhora ligeiramente a coerência a troco de cerca de 1 GB extra. `Q8_0` é quase sem perdas mas ocupa perto de 8,5 GB, o que só cabe confortavelmente em 16 GB de RAM. Se o servidor tem 8 GB, fique-se por `Q4_K_M`. A diferença de qualidade é pequena; a diferença entre caber e não caber em memória não é.
docker compose up -d
# Descarregar o modelo (alguns GB, demora)
docker exec -it ollama ollama pull llama3:8b
# Variantes de quantização
docker exec -it ollama ollama pull llama3:8b-instruct-q5_K_M
# Listar o que está instalado e o espaço ocupado
docker exec -it ollama ollama list7. Nginx como proxy inverso e certificado TLS
Este é o passo que transforma um serviço local num serviço acessível com segurança. O Nginx recebe o tráfego em 443, termina o TLS e encaminha para o Open WebUI em loopback. O tempo limite alargado não é decorativo: a geração de respostas longas em CPU pode exceder o limite padrão de 60 segundos do Nginx e devolver um erro 504 a meio da resposta. Aponte primeiro o registo `A` do seu domínio para o IP do servidor e só depois corra o `certbot`, ou a validação falha.
server {
server_name ia.seudominio.pt;
location / {
proxy_pass http://127.0.0.1:8080;
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;
# Streaming de tokens
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Inferência em CPU excede os 60s por omissão
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
}8. Medir o desempenho real no seu servidor
Não acredite em números de desempenho publicados por terceiros, incluindo os deste artigo. O ritmo de geração depende do modelo de CPU, da geração, da quantização, do tamanho do contexto e da carga do vizinho na mesma máquina física — algo que num VPS partilhado não controla. O `--verbose` do Ollama devolve as métricas reais da sua instância. O número que interessa é `eval rate`, em tokens por segundo. Se o valor for baixo demais para o seu caso de uso, as opções por ordem de eficácia são: reduzir o contexto, descer a quantização, mudar para um modelo mais pequeno como o Llama 3.2 3B, ou passar para uma instância com GPU.
# Métricas reais desta máquina
docker exec -it ollama ollama run llama3:8b --verbose "Resume em três frases o que é a quantização de modelos."
# Interessa a linha:
# eval rate: X tokens/s
# Memória e CPU em tempo real durante a geração
docker stats ollama9. Consumir a API a partir do seu código
O Ollama expõe uma API compatível com o formato da OpenAI, o que significa que a maioria das bibliotecas existentes funciona apenas mudando o `base_url`. Não é preciso reescrever integrações. Como a porta 11434 está fechada ao exterior, o código tem de correr no mesmo servidor, ou chegar lá por túnel SSH ou rede privada. **Nunca abra a 11434 ao público:** a API do Ollama não tem autenticação nenhuma. Quem lhe descobrir o IP usa o seu servidor à vontade, e há varredores automáticos à procura exactamente disso.
from openai import OpenAI
# Aponta para o Ollama local em vez da OpenAI
client = OpenAI(
base_url="http://127.0.0.1:11434/v1",
api_key="ollama", # ignorado, mas exigido pela biblioteca
)
resposta = client.chat.completions.create(
model="llama3:8b",
messages=[
{"role": "system", "content": "És um assistente técnico conciso."},
{"role": "user", "content": "Classifica este email como urgente ou normal."},
],
temperature=0.2,
)
print(resposta.choices[0].message.content)10. Quando isto não compensa
Seja honesto quanto ao volume. Se faz algumas centenas de chamadas por mês, uma API comercial sai mais barata do que qualquer VPS e poupa-lhe a manutenção. O alojamento próprio começa a compensar com utilização constante e elevada, ou quando a privacidade dos dados é requisito e não preferência. Também não compensa se precisa de qualidade de fronteira. Um 8B quantizado é competente em tarefas delimitadas e claramente inferior em raciocínio, código complexo ou textos longos. Comparar com os modelos maiores comerciais e esperar paridade leva a desilusão. E conte o tempo. Actualizações de segurança, renovação de certificados, monitorização e recuperação de falhas são horas suas. Se o seu tempo tem valor de mercado, inclua-o no cálculo antes de decidir.
Perguntas Frequentes (FAQ)
Posso correr o Llama 3 70B num VPS sem GPU?
Tecnicamente arranca com quantização agressiva e RAM suficiente, mas a velocidade em CPU torna-o impraticável para uso interactivo. Para um VPS económico, o 8B é o limite razoável. Se precisa do 70B, precisa de GPU.
É legal usar o Llama 3 comercialmente?
A licença da Meta permite uso comercial, com condições — entre elas um limiar de utilizadores mensais acima do qual é necessária licença específica, e requisitos de atribuição. Leia a licença aplicável à versão que descarregar antes de a integrar num produto pago.
O que acontece se reiniciar o servidor?
Com `restart: unless-stopped` no compose, os contentores sobem sozinhos e os modelos continuam nos volumes. A primeira resposta depois do arranque é mais lenta porque o modelo tem de ser relido do disco para memória.
Como faço cópias de segurança?
Os modelos não precisam de cópia: voltam a descarregar-se com um `ollama pull`. O que interessa guardar é o volume `webui_data`, que contém contas, conversas e configurações. Um `docker run --rm -v webui_data:/data -v $(pwd):/backup alpine tar czf /backup/webui.tar.gz /data` resolve.
Preciso mesmo do Nginx, ou posso expor a porta 8080 directamente?
Pode, mas fica sem TLS — as credenciais e as conversas viajam em claro. O Nginx com certbot dá-lhe HTTPS gratuito e renovação automática por uns minutos de configuração. Não vale a pena poupar esse passo.