Pular para o conteúdo principal

Solução de problemas

Comece pela camada que falha: navegador, frontend, backend, Ollama, plugin do provedor ou rede da implantação.

Verificações rápidas​

# App branch and local changes
git status

# Backend process liveness
curl http://localhost:3001/health/live

# Backend dependency readiness (SQLite, schema, and writable data storage)
curl http://localhost:3001/health/ready

# Ollama health
curl http://localhost:11434/api/tags

# Installed Ollama models
ollama list

No desenvolvimento, o frontend costuma estar em http://localhost:5173 e o backend em http://localhost:3001. O fluxo npx libre-webui serve em http://localhost:8080.

Libre WebUI não inicia​

Verifique Node e dependências

node --version
npm install
npm run dev

É necessário Node.js 22.22 ou mais recente.

Porta em uso

lsof -i :3001
lsof -i :5173
lsof -i :8080

Pare o processo antigo ou use outra porta.

Backend não consegue gravar dados

O backend usa DATA_DIR quando definido, senão backend/data. Execuções pelo código-fonte resolvem um valor relativo a partir do diretório do backend: DATA_DIR=./data escolhe backend/data, enquanto o histórico DATA_DIR=./backend/data escolhe backend/backend/data. Garanta permissão de escrita. Sem valor, o Libre preserva o diretório histórico se for o único armazenamento. Se ambos tiverem dados, pare, faça backup e escolha ou migre conscientemente; nunca mescla nem copia bancos divergentes.

Os endpoints distinguem processo vivo de aplicação utilizável:

  • /health e /health/live retornam 200 quando o processo serve HTTP. Provedores opcionais não afetam.
  • /health/ready retorna 503 quando banco, esquema, armazenamento ou dependência registrada obrigatória está indisponível. Não espera provedores opcionais e omite detalhes públicos.
  • /health/deep executa integridade SQLite e chaves estrangeiras em worker limitado e agrega sondagens opcionais como Ollama. Falha opcional vira aviso. Exige token Bearer de administrador e não serve como sondagem frequente.
curl -H "Authorization: Bearer $LIBRE_ADMIN_TOKEN" \
http://localhost:3001/health/deep

No desenvolvimento, o frontend usa VITE_API_BASE_URL ou recorre ao backend de desenvolvimento.

VITE_API_BASE_URL=http://localhost:3001/api
VITE_WS_BASE_URL=ws://localhost:3001

VITE_WS_BASE_URL é opcional, mas define a base de Chat e terminal Work. Use URL absoluta ws: ou wss:; prefixos como wss://example.com/libre são aceitos. Não inclua credenciais, consulta ou fragmento. Reinicie/recompile após alterar variável Vite.

CORS_ORIGIN=http://localhost:5173,http://127.0.0.1:5173

Para telefone, LAN ou Tailscale, não use localhost no telefone; use o IP do computador e execute:

npm run dev:host

Isso disponibiliza o frontend na porta 8080 e faz proxy do tráfego de API e WebSocket para o backend local na porta 3001. Somente a porta 8080 precisa estar acessível a partir do outro dispositivo. Se VITE_API_BASE_URL ou VITE_WS_BASE_URL estiver definido em frontend/.env, garanta que essas URLs sejam acessíveis a partir do outro dispositivo, ou remova-as para usar o proxy do servidor de desenvolvimento.

Chat não transmite atrás de proxy reverso​

O sintoma típico é enviar sem receber resposta, com falha WebSocket no console. Confirme upgrades e conexões longas.

Quando CORS_ORIGIN ou BASE_URL está definido, o Origin do navegador é comparado. Defina ao menos um remotamente; sem ambos, é permissivo para desenvolvimento. Electron e outros podem omitir Origin, mas ainda trocam Authorization por ticket único curto. Mantenha backend sob TLS e os mesmos controles da API.

Para host público:

services:
libre-webui:
environment:
CORS_ORIGIN: https://chat.example.com
BASE_URL: https://chat.example.com

Os exemplos nginx/Caddy supõem proxy no host Docker e Libre na porta 8080. Se o proxy entra na rede Compose, use libre-webui:3001.

nginx​

nginx precisa encaminhar cabeçalhos e timeout longo:

location /ws {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
}

Valide com nginx -t e recarregue.

Caddy​

reverse_proxy suporta WebSocket por padrão:

chat.example.com {
reverse_proxy 127.0.0.1:8080
}

Traefik​

Traefik também trata upgrades. Na mesma rede:

labels:
- 'traefik.enable=true'
- 'traefik.http.routers.libre-webui.rule=Host(`chat.example.com`)'
- 'traefik.http.routers.libre-webui.entrypoints=websecure'
- 'traefik.http.routers.libre-webui.tls=true'
- 'traefik.http.services.libre-webui.loadbalancer.server.port=3001'

Se cair depois, confira timeout ocioso de proxies/load balancers. No Traefik, ajuste transport.respondingTimeouts.

Ollama não é detectado​

curl http://localhost:11434/api/tags

URL personalizada no backend:

OLLAMA_BASE_URL=http://localhost:11434

Se Libre está no Docker e Ollama no host, use o Compose externo ou defina OLLAMA_BASE_URL com um endereço acessível do contêiner.

Problemas ao baixar modelos​

ollama pull gemma4:12b

Se falhar no terminal, o problema está fora do Libre.

Modelos na nuvem

Use o filtro Ollama Cloud. O Libre normaliza sufixos necessários; não é preciso adicionar :cloud manualmente.

Usuário não consegue baixar

Administradores podem proibir downloads. Confira a configuração se um usuário vê, mas não instala.

Chat lento ou com falha​

  • Use modelo menor.
  • Confira ollama ps.
  • Reduza contexto e máximo de tokens.
  • Confirme RAM/VRAM.
  • Em plugins, confirme chave e cota.

Geração de imagens OpenAI indisponível​

  • Ative o provedor OpenAI. Salve chave do usuário ou configure OPENAI_API_KEY confiável.
  • Ative a geração e escolha um GPT Image anunciado.
  • Prefira gpt-image-2; IDs anteriores são compatibilidade e depreciados.
  • Deixe image_endpoint vazio salvo endpoint compatível. /responses e /chat/completions não processam Image API.
  • Se houver rejeição com chave e cota válidas, confirme elegibilidade da organização.

A disponibilidade usa credencial do usuário atual ou fallback confiável. Chave em outra conta não expõe modelos.

Problemas de endpoint de provedor​

Se um provedor compatível com OpenAI recebe solicitações no caminho errado, confira Configurações → Plugins:

  • Escolha Chat Completions para /chat/completions ou Responses para /responses.
  • Informe a raiz, como https://provider.example/v1, em Base URL.
  • Deixe API Path vazio para o padrão ou informe caminho iniciado por barra.
  • Um endpoint legado realmente personalizado tem maior prioridade; limpe-o ao voltar a Base URL/API Path. Valores iguais ao padrão antigo do manifesto são ignorados após atualização. Sufixo /chat/completions ou /responses também determina o formato.

JSON importado suporta provedores com formato OpenAI Chat Completions, OpenAI Responses, Anthropic ou Gemini. Payload, streaming, ferramentas ou resposta proprietários exigem adaptador; mudar apenas endpoint não traduz.

URLs podem ser HTTP ou HTTPS. HTTP não criptografa credenciais e tráfego; reserve a gateway auto-hospedado em rede confiável. Base URLs não podem conter consulta ou fragmento, e caminhos relativos não podem conter traversal literal/repetidamente codificado, consulta ou fragmento. Codificação excessiva que não estabiliza é rejeitada.

Atualizar modelos troca sufixos conhecidos, inclusive /responses, por /models. Ativação, atualização e substituições usam endpoint e chave do usuário. Salvar/remover chave e redefinir conexão também atualiza; geração não. IDs são por usuário e não mudam JSON. Se não houver rota compatível, configure model_map.

Solicitações de descoberta, Chat, Work, imagem, embedding e TTS não seguem redirecionamentos. Configure o destino final para que Authorization não pule a um destino não validado.

Se Work informar mudança de roteamento durante execução, termine a atualização e inicie outra. Ele para antes da próxima solicitação para não reproduzir estado anterior em outro modo, endpoint ou chave.

Solicitações saem do backend; em contêiner localhost é o Libre WebUI, não o host. Em Compose/Kubernetes use DNS do serviço, como http://ai-gateway:8080/v1. Use http://host.docker.internal:8080/v1 somente quando disponível. HTTP é texto simples mesmo em nome privado.

Imagem, substituições e chaves também são resolvidas para o usuário atual. Confira a autenticação se parecer usar outra conta.

Regras adicionais:

  • Somente administrador altera roteamento. Definições e conexões são da instância; usuários comuns ainda salvam geração, credenciais e ativação.
  • Em endpoint ou api_url, informe o URL completo com operação, como https://provider.example/v1/chat/completions. Raiz vai apenas em base_url, com api_mode e api_path.
  • Aceitam-se URLs HTTP(S) absolutos; HTTP somente em rede confiável.
  • Substituição vazia usa a definição; inválida é rejeitada, não enviada ao padrão.
  • Chave ambiental só é usada quando definição incluída não shadowed preserva endpoint raiz, autenticação, capacidades, seletores e padrões confiáveis. Importadas, graváveis com ID incluído e rotas personalizadas exigem credencial da mesma conta. Somente chave ambiental faz o provedor ficar indisponível.
  • Definições personalizadas antigas ficam em quarentena; reimporte como administrador e reative por usuário. Editar JSON aprovado diretamente coloca em quarentena; use instalação/atualização para registrar caminho e hash.
  • As credenciais salvas ficam vinculadas à rota, ao contrato de autenticação, à definição e à origem vigentes quando foram inseridas. Adicionar ou remover modelos as mantém. Depois de alterar um endpoint ou qualquer outra parte da definição, salve novamente a credencial dessa conta. Uma credencial antiga sem vínculo só migra automaticamente em uma rota incluída ancorada exata.
  • api_url pode ser alias legado; endpoint prevalece. Use models_endpoint para URL completa da lista, validada e sem redirects.
  • Ative após salvar endpoint/credencial. A ativação deriva /models e usa a credencial do usuário, salvo models_endpoint. Mudanças de conexão também atualizam e aguardam antes de recarregar. Cada conta ativa separadamente.
  • Em Configurações → Plugins, use Atualizar modelos. A tabela é somente leitura. Falha transitória preserva catálogo anterior ou model_map, portanto completar a verificação não prova saúde.
  • Descoberta exige array data compatível. Catálogos são por usuário. Ativação normal preserva o anterior; mudar conexão limpa primeiro e recorre a model_map.
  • Imagem também usa usuário atual.
  • Se uma conta não administrativa guardou rota antes da atualização, use Redefinir. O valor ignorado e catálogo antigo são removidos.
  • No contêiner, localhost é o contêiner.
  • Solicitações não seguem redirecionamentos.

Chat usa provedor errado ou o mostra indisponível​

O mesmo ID pode existir no Ollama e em vários plugins. Sessões e preferências atuais salvam provedor e ID bruto.

  • Se indisponível, reative/reinstale o plugin exato e confira o mapa.
  • Se removido, escolha substituto; o Libre não redireciona para homônimo.
  • Registros antigos podem não ter metadados e continuam com roteamento por nome, aparecendo como "provedor não registrado". Selecione uma entrada para fixar.
  • Personas mantêm persona:<id>; novas registram Ollama como base, antigas continuam compatíveis.

Problemas do Work​

Work ausente ou runtime indisponível​

É preciso uma conta autenticada com acesso: administrador ou usuário ativo após abertura em Configurações → Gerenciamento de Usuários → Acesso e políticas → Acesso ao Work. O runtime deve estar disponível ao backend:

docker info
docker version

No Docker padrão, confirme daemon e permissão do usuário para WORK_DOCKER_COMMAND. npx não instala Docker. Sem runtime, o restante continua e comandos nunca são executados diretamente no host.

Compose monta o socket. No Kubernetes, ative work.enabled=true e não monte socket do nó. Se Compose ainda informar indisponível:

MensagemCausa e solução
The "docker" CLI is not installed…Imagem personalizada sem docker-cli; use a oficial ou WORK_DOCKER_COMMAND.
No Docker daemon is reachable…Montagem removida ou daemon parado; restaure e inicie.
The Docker socket is mounted but…cannot openGrupo diferente; defina DOCKER_GID no .env e recrie.
Tela/áudio do Work fecha com WebSocket 1006 e registra screen is unreachableO backend em contêiner está discando para o próprio loopback. No Docker Desktop, use o WORK_DOCKER_PUBLISHED_HOST=host.docker.internal que já vem configurado; no Docker Engine nativo, defina também WORK_PREVIEW_BIND com o gateway não público da bridge do Docker e recrie o Libre WebUI.

Leia o grupo por um contêiner porque macOS mostra outro valor:

echo "DOCKER_GID=$(docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
alpine stat -c '%g' /var/run/docker.sock)" >> .env
docker compose up -d --force-recreate

O socket concede controle equivalente a root. Consulte Work: espaços isolados.

Modelo sem suporte a ferramentas​

Escolha modelo Ollama que anuncie tools. Em plugin:

  • plugin chat/completion ativo;
  • modelo na lista;
  • chave disponível ao administrador;
  • suporte a ferramentas no modelo exato.

Não há fallback silencioso.

Solicitação Work retorna HTTP 429​

Um limite de tarefas ou runtimes foi atingido. Por padrão, são duas tarefas ativas na instância e uma por usuário. Prévia também ocupa capacidade. Aguarde, pare prévia ou revise WORK_MAX_ACTIVE_RUNTIMES_* e WORK_MAX_TASKS_*.

Instalação de pacote ou rede falha​

Tarefas novas usam rede bridge para baixar pacotes. Confira DNS, proxy, registro e saída em Atividade. Não são montados SSH, credenciais de nuvem, perfis de navegador nem socket Docker.

Prévia Work não inicia​

  • O servidor deve escutar 0.0.0.0 em WORK_PREVIEW_PORT (padrão 4173).
  • Deixe comando vazio para detectar package.json dev ou index.html, inclusive um app aninhado.
  • Se houver vários apps ou nenhum ponto, informe comando explícito. Começa em /workspace; use cd <app-directory> && ....
  • Expanda os detalhes.
  • Pare prévia existente antes de outro comando.

URLs usam porta loopback dinâmica. Navegador e backend precisam estar na mesma máquina; navegador remoto não alcança loopback, e HTTPS pode bloquear HTTP como mixed content.

Arquivo não abre ou salva​

A API aceita texto UTF-8 até 2 MB. Se mudou após abrir, recarregue antes de salvar. Formatação limita-se a tipos compatíveis com menos de 100.000 caracteres e 4.000 linhas; destaque pausa em arquivos grandes.

Rascunhos no navegador não substituem salvar no espaço persistente.

Tarefa ou prévia interrompida​

Parar execução/prévia ou reiniciar remove processos descartáveis, mas preserva o volume. Reabra e reinicie. Excluir é diferente: remove permanentemente tarefa e espaço após confirmação.

Problemas de login e cadastro​

Primeiro usuário não é administrador

Somente a primeira conta em banco novo vira admin. Bancos existentes mantêm papéis.

Erros JWT

JWT_SECRET=replace-with-a-long-random-secret

Alterar JWT_SECRET invalida sessões.

Turnstile bloqueia cadastro

TURNSTILE_SITE_KEY=...
TURNSTILE_SECRET_KEY=...

Só é ativado com ambas. Confira domínio e segredo.

Redirecionamentos OAuth falham

BASE_URL=https://your-domain.example
GITHUB_CALLBACK_URL=https://your-domain.example/api/auth/oauth/github/callback
HUGGINGFACE_CALLBACK_URL=https://your-domain.example/api/auth/oauth/huggingface/callback

Problemas no chat com documentos​

Aceita PDF, Office, Markdown, HTML, código e CSV até 10 MB. Se a busca funciona, mas semântica não:

  1. Instale nomic-embed-text.
  2. Ative embeddings.
  3. Regenere.
ollama pull nomic-embed-text

Palavras-chave continuam sem embeddings.

Problemas na prévia de artefatos​

Para jogos/HTML, peça um arquivo completo com CSS e JavaScript em linha. Se precisar de teclado:

  • Clique dentro primeiro.
  • Abra em guia própria.
  • Não dependa de arquivos locais ausentes.

O Libre pode agrupar index.html + CSS + JavaScript, mas um HTML independente é mais confiável.

Problemas do Docker​

Contêiner não alcança Ollama

docker compose -f docker-compose.external-ollama.yml up -d

Dados não persistem

Monte volume persistente e defina DATA_DIR se preciso. A chave fica no armazenamento persistente em DATA_DIR ou modo Docker.

Redefinir dados locais​

Pare o app, faça backup e remova o diretório em uso. O padrão é backend/data.

cp -R backend/data backend/data.backup
rm -rf backend/data

Reinicie e crie conta nova.

Problemas do motor Strands​

O motor Strands integrado informa o próprio estado a qualquer conta que possa usá-lo:

curl -H "Authorization: Bearer $LIBRE_ADMIN_TOKEN" \
http://localhost:3001/api/strands/health

Uma resposta 403 significa que o motor não está ativado para essa conta.

A página Strands não aparece​

A barra lateral oculta Strands quando a conta não tem acesso. Verifique Configurações → Gerenciamento de Usuários → Acesso e políticas → Motor Strands. Desligado bloqueia todo mundo, inclusive administradores, e Administradores oculta a página dos usuários comuns. Se o controle estiver bloqueado, LIBRE_STRANDS_ACCESS está fixando o modo: defina a variável como admins ou all-users, ou remova a definição para gerenciar o modo pela interface. Qualquer valor diferente de disabled, admins ou all-users deixa o motor travado como desligado.

Nenhum modelo aparece na lista​

O Strands só usa modelos que o Libre WebUI já oferece. Ative o Ollama e baixe um modelo de chat, ou ative um plugin de provedor de chat em Configurações → Plugins. A lista de modelos do Strands passa a incluir esses modelos.

Uma etapa do Work no Strands falha porque as ferramentas não são compatíveis​

Com Motor: Strands, o agente Strands planeja cada etapa por meio de chamadas de ferramentas, então o modelo do provedor precisa oferecer suporte a chamadas de ferramentas. Quando não oferece, o Work informa que o modelo não anuncia suporte a ferramentas (WORK_MODEL_TOOLS_UNSUPPORTED). Escolha um modelo compatível com ferramentas no controle Modelo do Work e execute a tarefa de novo.

Ainda com problemas​

Abra issue com:

  • versão e commit
  • método de instalação
  • sistema operacional
  • versão Node.js
  • versão Ollama
  • versão Docker e docker info em problemas Work
  • logs do backend
  • erros do console
  • modelo/provedor exato
  • saída de Atividade quando tarefa/prévia falha