Guia passo a passo para implantar Ollama + Open WebUI em uma VPS Linux com Docker, isolamento de rede e HTTPS.
Visão Geral
Este guia replica a instalação segura do Ollama com o Open WebUI em uma VPS limpa (Ubuntu 22.04 ou 24.04), utilizando Docker e isolamento de rede. Nesta configuração, o Ollama ficará restrito a uma rede interna fechada, nenhuma porta sua é exposta ao host. O Open WebUI será o único ponto de entrada, protegido por autenticação (login/senha) e, opcionalmente, por HTTPS.
Passo 1: Atualizar o Sistema e Instalar o Docker
Acesse sua VPS via SSH e instale o Docker e o Docker Compose:
Atualizar a lista de pacotes do sistema
sudo apt update && sudo apt upgrade -y
Instalar dependências necessárias
sudo apt install -y curl apt-transport-https ca-certificates software-properties-common
Adicionar a chave GPG oficial do Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Adicionar o repositório do Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
Instalar o Docker e o Docker Compose
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Iniciar e habilitar o serviço do Docker
sudo systemctl start docker sudo systemctl enable docker
Nota: O pacote docker-compose-plugin fornece o comando docker compose (sem hífen).
Certifique-se de usá-lo como docker compose nos passos seguintes.
Passo 2: Criar a Estrutura de Diretórios e o docker-compose.yml
Para garantir a segurança, utilizaremos o Docker Compose para criar uma rede isolada.
A porta 11434 do Ollama não será mapeada para a VPS
(usamos apenas expose, omitindo o parâmetro ports),
impedindo qualquer acesso externo a ela.
- Crie uma pasta para o projeto e entre nela:
mkdir -p ~/ollama-webui && cd ~/ollama-webui
- Crie o arquivo
docker-compose.yml:
nano docker-compose.yml
- Cole o conteúdo abaixo:
version: '3.8'
networks:
ai-network:
driver: bridge
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
volumes:
- ollama_data:/root/.ollama
# SEGURANÇA: porta 11434 NÃO exposta no host.
# Acessível apenas internamente para containers na rede 'ai-network'.
expose:
- "11434"
restart: unless-stopped
networks:
- ai-network
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
volumes:
- open_webui_data:/app/backend/data
ports:
- "127.0.0.1:8080:8080"
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_AUTH=true
restart: unless-stopped
depends_on:
- ollama
networks:
- ai-network
volumes:
ollama_data:
open_webui_data:
127.0.0.1:8080:8080 faz o Open WebUI responder
apenas localmente na VPS. Nenhuma porta fica acessível pela rede externa sem um proxy reverso (Nginx).
Isso é intencional, o Nginx com HTTPS será configurado nos passos seguintes.
Pressione Ctrl+O, Enter para salvar e Ctrl+X para sair.
Passo 3: Inicializar os Containers
sudo docker compose up -d
Verifique se os containers estão rodando:
sudo docker ps
Passo 4: Garantir a Segurança no Firewall da VPS
Se você utiliza o UFW (firewall padrão do Ubuntu):
Permitir SSH (essencial para não perder o acesso à VPS)
sudo ufw allow ssh
Permitir apenas a porta HTTP (temporário, até configurarmos o HTTPS)
sudo ufw allow 80/tcp
Ativar o firewall
sudo ufw enable
Passo 5: Primeiro Acesso e Configuração
Abra o navegador e digite o endereço IP da sua VPS: http://seu_ip_da_vps.
A tela de login do Open WebUI será exibida. Clique em Sign Up (Cadastrar).
Baixar modelos pelo terminal (Recomendado)
Para baixar um modelo, execute o comando dentro do container do Ollama. O Open WebUI reconhecerá e listará o modelo automaticamente na interface:
sudo docker exec -it ollama ollama run llama3
Substitua llama3 pelo modelo desejado: gemma2, mistral, phi3, etc.
Por que baixar pelo terminal? Para modelos muito grandes, o download pelo terminal permite acompanhar a porcentagem real sem o risco de a aba do navegador desconectar ou expirar.
Passo 6: Adicionar SSL/HTTPS com Nginx + Certbot
Para evitar que senhas e conversas trafeguem em texto puro (HTTP), configure um domínio na sua VPS e gere um certificado digital gratuito com o Nginx e Certbot.
6.1 Instalar Nginx e Certbot
sudo apt install -y nginx certbot python3-certbot-nginx
6.2 Criar a Configuração do Nginx
Crie o arquivo de configuração para o seu domínio (substitua seu-dominio.com):
sudo nano /etc/nginx/sites-available/open-webui
Cole o conteúdo abaixo:
server {
listen 80;
server_name seu-dominio.com;
client_max_body_size 100M;
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;
# WebSockets — necessário para streaming de texto em tempo real
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Desativa buffer para resposta aparecer palavra por palavra
proxy_buffering off;
proxy_read_timeout 600s;
}
}
6.3 Ativar o Site e Reiniciar o Nginx
Ativar o site
sudo ln -s /etc/nginx/sites-available/open-webui /etc/nginx/sites-enabled/
Remover a configuração padrão (evita conflitos)
sudo rm /etc/nginx/sites-enabled/default
Testar a sintaxe
sudo nginx -t
Reiniciar o Nginx
sudo systemctl restart nginx
6.4 Obter o Certificado SSL Gratuito
sudo certbot --nginx -d seu-dominio.com
O Certbot fará perguntas simples (como seu e-mail) e configurará o redirecionamento automático de HTTP para HTTPS.
6.5 Atualizar o Firewall
Liberar HTTPS
sudo ufw allow 443/tcp
Opcional: remover a permissão da porta 80 (mantenha se quiser renovação automática do Certbot)
sudo ufw delete allow 80/tcp
Considerações finais
Ollama e Open WebUI estão blindados dentro do servidor:
- Ollama isolado em rede interna — sem porta exposta ao host.
- Open WebUI acessível apenas via
localhost:8080, protegido por autenticação. - Nginx como proxy reverso com HTTPS (SSL), tráfego criptografado.
- Firewall configurado permitindo apenas SSH (22) e HTTPS (443).
- Modelos baixados via terminal dentro do container com segurança.
Feito!
Nenhum comentário:
Postar um comentário