Guia de Troubleshooting Comum¶
Mesmo com uma configuração cuidadosa e automatizada, problemas podem (e irão!) surgir no seu servidor doméstico. Saber como diagnosticar e resolver esses problemas é uma habilidade essencial. Este guia oferece um ponto de partida com ferramentas, técnicas e soluções para alguns dos cenários de erro mais comuns que você pode encontrar.
Ferramentas Essenciais de Diagnóstico¶
Familiarize-se com estas ferramentas. Elas serão suas melhores amigas durante o troubleshooting:
-
Logs de Containers Docker:
- Via Portainer: A maneira mais fácil de visualizar logs de containers individuais.
- Acesse o Portainer (
https://portainer.{{ base_domain }}). - Navegue até o endpoint Docker correto (e.g.,
localparacore-services-vm). - Vá para "Containers", selecione o container problemático.
- Clique no ícone de "Logs" (📄).
- Use as opções para filtrar por data/hora, habilitar auto-refresh, ou definir o número de linhas a serem exibidas.
- Acesse o Portainer (
- Via Linha de Comando (na VM onde o Docker roda, e.g.,
core-services-vm):# Ver todos os logs de um container docker logs <nome_do_container_ou_id> # Seguir os logs em tempo real (útil para ver o que acontece ao iniciar) docker logs -f <nome_do_container_ou_id> # Ver as últimas N linhas (e.g., 100) docker logs --tail 100 <nome_do_container_ou_id> # Ver logs com timestamps docker logs -t <nome_do_container_ou_id>
- Via Portainer: A maneira mais fácil de visualizar logs de containers individuais.
-
Dashboard e Logs do Traefik:
- Dashboard Traefik: Acessível em
https://traefik.{{ base_domain }}(protegido por Authelia).- Routers: Verifique se o roteador para o seu serviço problemático existe, está ativo (verde), e se a regra (
Rule) corresponde ao hostname esperado. - Services: Verifique se o serviço backend associado ao roteador está saudável e aponta para o(s) container(es) correto(s) e a porta interna correta.
- Middlewares: Verifique se os middlewares esperados (e.g., Authelia, headers) estão aplicados ao roteador e se não há erros neles.
- Entrypoints: Confirme se seus entrypoints (
web,websecure) estão ativos.
- Routers: Verifique se o roteador para o seu serviço problemático existe, está ativo (verde), e se a regra (
- Logs do Traefik: Acesse os logs do container
traefikvia Portainer oudocker logs traefik.- Procure por erros ao processar labels Docker, obter certificados SSL/TLS da Let's Encrypt, ou ao tentar se conectar aos serviços backend. Aumentar o nível de log do Traefik para
DEBUG(notraefik.ymle reiniciar Traefik) pode fornecer mais detalhes.
- Procure por erros ao processar labels Docker, obter certificados SSL/TLS da Let's Encrypt, ou ao tentar se conectar aos serviços backend. Aumentar o nível de log do Traefik para
- Dashboard Traefik: Acessível em
-
Logs do Authelia:
- Acesse os logs do container
autheliavia Portainer oudocker logs authelia. - Crucial para diagnosticar problemas de login, falhas de 2FA, ou erros em regras de controle de acesso. Aumentar o nível de log no
configuration.ymldo Authelia também pode ajudar.
- Acesse os logs do container
-
Logs do Sistema (Host Proxmox e VMs): Conecte-se via SSH ao host ou VM relevante.
journalctl(Systemd Journal):journalctl -xe # Mostra os últimos logs com explicações de erros journalctl -f # Segue os logs do sistema em tempo real journalctl -u nome_do_servico.service # Logs de um serviço systemd específico (e.g., sshd, nfs-kernel-server, ollama) journalctl -p err # Mostra apenas logs com prioridade de erro ou superiordmesg: Mostra mensagens do buffer do kernel. Útil para problemas de hardware, drivers, ou erros de baixo nível.- Logs Tradicionais em
/var/log/:/var/log/syslogou/var/log/messages: Logs gerais do sistema./var/log/auth.log: Logs de autenticação (logins SSH, sudo)./var/log/kern.log: Logs do kernel.- Logs específicos de aplicações instaladas nativamente.
-
Ferramentas de Rede (Execute na sua máquina de controle, ou dentro de uma VM/container para testes específicos):
ping <hostname_ou_IP>: Testa a conectividade de rede básica (ICMP).nslookup <hostname>oudig <hostname>: Verifica a resolução DNS. Essencial para ver semeuservico.{{ base_domain }}está resolvendo para IPs da Cloudflare.curl -vL <URL>: Faz uma requisição HTTP/S e mostra detalhes verbosos da conexão, incluindo headers HTTP, códigos de status e redirecionamentos. Extremamente útil para testar Traefik, Authelia e o serviço backend.- Exemplo:
curl -vL https://nextcloud.{{ base_domain }}
- Exemplo:
traceroute <hostname_ou_IP>(Linux/macOS) outracert <hostname_ou_IP>(Windows): Mostra o caminho (saltos de rede) que os pacotes levam para alcançar um destino.mtr <hostname_ou_IP>: Combina ping e traceroute, fornecendo uma visão contínua da qualidade da conexão em cada salto.ss -tulnp(Linux) ounetstat -tulnp: Mostra quais portas estão abertas e escutando em um sistema e quais processos as estão usando. Útil para verificar se um serviço está escutando na porta esperada dentro de uma VM ou container.
-
Browser Developer Tools (Geralmente F12 no seu navegador web):
- Aba Network: Inspecione todas as requisições HTTP/S feitas pela página web do seu serviço. Verifique:
- Códigos de Status (200 OK, 3xx Redirecionamentos, 4xx Erros do Cliente, 5xx Erros do Servidor).
- Headers da Requisição e da Resposta.
- Tempos de carregamento de cada recurso.
- Se algum recurso (CSS, JS, imagem) está falhando ao carregar.
- Aba Console: Verifique por erros JavaScript que podem estar quebrando a funcionalidade da interface do usuário de um serviço web.
- Aba Application (ou Storage): Inspecione cookies, local storage, session storage. Útil para depurar problemas de sessão com Authelia ou a própria aplicação.
- Aba Network: Inspecione todas as requisições HTTP/S feitas pela página web do seu serviço. Verifique:
Problemas Comuns e Estratégias de Solução¶
1. Serviço Web Inacessível Externamente (https://meuservico.{{ base_domain }})¶
- Sintomas Comuns: Erro "Site não pode ser alcançado" no navegador, timeout, erro 5xx da Cloudflare (e.g., 502 Bad Gateway, 503 Service Unavailable), erro 404 "Not Found" do Traefik, página de login do Authelia não aparece ou dá erro.
- Checklist de Diagnóstico (Siga a ordem do fluxo de tráfego):
- DNS Público (Cloudflare):
- O subdomínio (
meuservico) está configurado corretamente no seu painel DNS da Cloudflare? - Se usa CNAME, ele aponta para o hostname correto do seu Cloudflare Tunnel (e.g.,
UUID.cfargotunnel.com)? - Se usa Ingress Rules/Public Hostnames no Zero Trust Dashboard, a regra para
meuservico.{{ base_domain }}existe e aponta para o serviçohttp://traefik:80? - O "Proxy status" (nuvem laranja) está habilitado para o registro DNS?
- Use uma ferramenta online de DNS lookup (ou
nslookup meuservico.{{ base_domain }}na sua máquina) para verificar se ele resolve para endereços IP da Cloudflare.
- O subdomínio (
- Cloudflare Tunnel (
cloudflaredAgent):- O container
cloudflaredestá rodando nacore-services-vm? Verifique no Portainer. - Examine os logs do
cloudflared:docker logs cloudflared. Procure por:- Erros de conexão com a Cloudflare ("Connection refused", "failed to connect to an edge").
- Erros ao encaminhar para o Traefik (se estiver usando
--url http://traefik:80, ele deve conseguir resolvertraefik).
- No dashboard Cloudflare Zero Trust (Access -> Tunnels), verifique o status do seu túnel. Deve estar "Healthy".
- O container
- Traefik (Proxy Reverso):
- O container
traefikestá rodando nacore-services-vm? - Acesse o Dashboard do Traefik (
https://traefik.{{ base_domain }}- você precisará autenticar com Authelia).- Routers: O roteador para
meuservico.{{ base_domain }}existe e está com status verde? ARuleestá correta (Host(\meuservico.{{ base_domain }}`))? OsEntryPoints(websecure`) estão corretos? - Services: O serviço backend associado ao roteador está saudável? Ele aponta para o(s) container(es) correto(s) do
meuservicoe para a porta interna correta que omeuservicoescuta? - Middlewares: Os middlewares aplicados ao roteador (e.g.,
authelia@docker,securityHeaders@file) estão corretos e sem erros?
- Routers: O roteador para
- Verifique as labels Docker do container
meuservicono seudocker-compose.yml. Estão corretas quanto ao nome do host, entrypoint, nome do serviço Traefik, e a porta interna do container (loadbalancer.server.port)? - Examine os logs do Traefik (
docker logs traefik) para erros específicos relacionados a este serviço, problemas com certificados SSL, ou falhas ao conectar ao backend.
- O container
- Authelia (se o serviço estiver protegido por ele):
- O container
autheliae seu banco de dados (authelia_db) estão rodando? - Você consegue acessar o portal Authelia (
https://auth.{{ base_domain }})? - Examine os logs do Authelia (
docker logs authelia) para erros de autenticação, problemas com as regras de acesso (access_controlnoconfiguration.yml), ou falhas de conexão com o banco de dados. - A configuração do middleware
authelia@dockerno Traefik (definida nodocker-compose.ymldo Authelia) está correta?
- O container
- Container do Serviço de Destino (
meuservico):- O container
meuservicoestá rodando nacore-services-vm(ouai-desktop-vmse aplicável)? - Ele está conectado à rede Docker correta (geralmente
proxyse exposto via Traefik)? - O serviço dentro do container está realmente escutando na porta interna que o Traefik espera (e.g., se Traefik está configurado para encaminhar para a porta 8000 do container, o serviço dentro do container deve estar escutando em
0.0.0.0:8000ou:::8000)?- Use
docker exec -it <nome_do_container_meuservico> ss -tulnp(ounetstat -tulnp) dentro do container para verificar as portas em escuta.
- Use
- Examine os logs do container
meuservicopara quaisquer erros de inicialização, falhas ao processar requisições, ou problemas de configuração interna.
- O container
- Firewalls (Menos Provável se Outros Serviços Funcionam):
- O UFW na
core-services-vmestá permitindo tráfego de entrada nas portas 80 e 443 (para Traefik)? (Isso já deve ter sido configurado pelo Ansible). - O PVE Firewall no host Proxmox não deve estar bloqueando tráfego entre a internet e a
core-services-vmse o Cloudflare Tunnel estiver funcionando, pois o túnel é uma conexão de saída.
- O UFW na
- DNS Público (Cloudflare):
2. Container Não Inicia ou Fica em Loop de Crash (Status "Restarting")¶
- Sintomas: O container aparece como "Stopped", "Created", ou fica alternando entre "Starting" e "Restarting" no Portainer.
- Principal Ferramenta de Diagnóstico:
docker logs <nome_do_container_ou_id>: Esta é a primeira e mais importante etapa. Os logs do container quase sempre indicam o motivo exato da falha ou do crash. Execute este comando na VM onde o container deveria estar rodando.
- Causas Comuns e Soluções:
- Erro de Configuração no
docker-compose.ymlou Variáveis de Ambiente:- Uma variável de ambiente obrigatória está faltando ou tem um valor incorreto?
- Um caminho de volume mapeado está incorreto ou o diretório de origem não existe/não tem permissões?
- Problemas de Permissão nos Volumes Mapeados:
- O usuário/UID com o qual o processo principal dentro do container roda (definido pela imagem Docker ou pelas variáveis
PUID/PGIDno compose) não tem permissão para ler/escrever nos diretórios NFS mapeados? - Lembre-se que nossos exports NFS usam
all_squashparaanonuid={{ docker_puid }}eanongid={{ docker_pgid }}. Garanta que oPUID/PGIDno seu compose corresponda a estes valores e que os diretórios no NFS tenham odockeruser:dockergroupcomo proprietário/grupo na VM. - Verifique as permissões nos diretórios NFS dentro da VM (e.g.,
ls -ld /mnt/pve_data_zfs/docker-volumes/meuservico/config).
- O usuário/UID com o qual o processo principal dentro do container roda (definido pela imagem Docker ou pelas variáveis
- Porta Já em Uso (se o container tenta mapear uma porta diretamente no host da VM):
- Se o
docker-compose.ymltem uma seçãoports:(e.g.,-p 8080:80) e a porta8080na VM já está sendo usada por outro processo ou container, o novo container falhará ao iniciar. - Use
sudo ss -tulnp | grep <numero_da_porta>na VM para ver qual processo está usando a porta.
- Se o
- Recursos Insuficientes na VM:
- A VM tem RAM ou CPU livre suficiente para o container iniciar e rodar? (Menos comum para uma falha de inicialização imediata, mas pode causar crashes se o container tentar alocar muita memória rapidamente). Verifique o uso de recursos na VM.
- Dependências Não Satisfeitas (Outros Containers):
- Se o container depende de outro serviço (e.g., um banco de dados) e esse serviço não está rodando ou não está acessível, o container dependente pode falhar ao iniciar.
- Use
depends_oncomcondition: service_healthynodocker-compose.ymlpara ajudar com a ordem de inicialização, mas o container principal ainda precisa estar funcional.
- Arquivo de Configuração Interno Corrompido ou Inválido:
- Se o container iniciou uma vez, criou arquivos de configuração em seu volume, e depois esses arquivos foram corrompidos ou editados incorretamente, ele pode falhar ao reiniciar. Verifique os logs para mensagens sobre falha ao ler/parsear arquivos de configuração.
- Imagem Docker Incorreta ou Corrompida:
- Raramente, a imagem Docker baixada pode estar corrompida. Tente remover a imagem local (
docker rmi <imagem>) e deixar o Docker Compose baixá-la novamente. - Verifique se a tag da imagem especificada no
docker-compose.ymlrealmente existe no registro.
- Raramente, a imagem Docker baixada pode estar corrompida. Tente remover a imagem local (
- Erro de Configuração no
3. Problemas com Volumes NFS (Persistência de Dados)¶
- Sintomas: Containers não conseguem ler ou escrever em seus volumes persistentes, os dados não são salvos entre reinícios do container, erros de "Permission denied" ou "Read-only file system" nos logs do container relacionados a caminhos de volume.
- Checklist de Diagnóstico:
- Servidor NFS no Host Proxmox:
- O serviço
nfs-kernel-serverestá rodando no host Proxmox? Verifique comsudo systemctl status nfs-kernel-server. - O arquivo
/etc/exportsno host Proxmox está correto?- Os caminhos dos datasets ZFS (e.g.,
/data/docker-volumes) estão corretos? - O CIDR da sua rede de VMs (
{{ vm_nfs_allowed_clients_cidr }}) está correto e permite acesso aos IPs das suas VMs? - As opções de exportação (
rw,sync,no_subtree_check,all_squash,anonuid={{ docker_puid }},anongid={{ docker_pgid }}) estão definidas como esperado?
- Os caminhos dos datasets ZFS (e.g.,
- Após qualquer mudança no
/etc/exports, você executousudo exportfs -ravno host Proxmox para aplicar as mudanças?
- O serviço
- Cliente NFS na VM (e.g.,
core-services-vm):- O pacote
nfs-commonestá instalado? (Deveria estar, via rolecommon). - Os compartilhamentos NFS do host Proxmox estão montados corretamente na VM? Verifique com:
Você deve ver seus datasets (e.g.,
/data/docker-volumes) montados em/mnt/pve_data_zfs/docker-volumes(ou seu{{ vm_nfs_mount_base_path }}). - O arquivo
/etc/fstabna VM contém as entradas corretas para montar os compartilhamentos NFS automaticamente no boot, com as opções corretas (e.g.,rw,sync,hard,intr,bg,noatime,nodiratime,rsize=1048576,wsize=1048576,vers=4.2)? - Você consegue listar, criar e deletar arquivos (como root ou como
{{ vm_ansible_user_name }}) nos pontos de montagem NFS dentro da VM? Exemplo:ls -l /mnt/pve_data_zfs/docker-volumes/sudo touch /mnt/pve_data_zfs/docker-volumes/testfile && sudo rm /mnt/pve_data_zfs/docker-volumes/testfile
- O pacote
- Permissões de Arquivo/Diretório nos Volumes NFS (Dentro da VM):
- Quais são as permissões e o proprietário/grupo dos diretórios que são mapeados para os containers (e.g.,
/mnt/pve_data_zfs/docker-volumes/nextcloud/config)? Usels -ld /caminho/para/diretorio_do_volumena VM. - Devido às opções
all_squash,anonuid={{ docker_puid }},anongid={{ docker_pgid }}no export NFS, os arquivos e diretórios criados pela VM no montado NFS (ou pelo host Proxmox diretamente nos datasets) devem aparecer na VM como pertencentes ao UID/GID especificados poranonuid/anongid(que são{{ docker_puid }}e{{ docker_pgid }}). - O
PUIDePGIDdefinidos nas variáveis de ambiente do seu container Docker correspondem a esses valores?
- Quais são as permissões e o proprietário/grupo dos diretórios que são mapeados para os containers (e.g.,
- Firewall:
- O firewall no host Proxmox (PVE Firewall) está permitindo tráfego NFS (porta TCP/UDP 2049, e possivelmente portas para rpcbind/portmapper se usar NFSv3 ou inferior) vindo dos IPs das suas VMs?
- O firewall UFW na VM não deve bloquear o tráfego NFS de saída para o host Proxmox (a política de saída padrão é
allow).
- Logs do Kernel/Sistema (em ambas as máquinas):
- Verifique
dmesgejournalctlno host Proxmox e na VM por erros relacionados a NFS (e.g., "mount.nfs: access denied by server", "Stale file handle").
- Verifique
- Servidor NFS no Host Proxmox:
4. Problemas de Autenticação com Authelia¶
- Sintomas: Redirecionamentos inesperados para o portal Authelia, erros na página de login do Authelia (e.g., "Invalid credentials", "Internal Server Error"), falha no segundo fator (2FA), acesso negado a um serviço mesmo após login bem-sucedido.
- Checklist de Diagnóstico:
- Logs do Authelia:
docker logs authelianacore-services-vm. Este é o primeiro lugar para procurar. Aumente o nível de log noconfiguration.ymldo Authelia se precisar de mais detalhes. - Configuração do Authelia (
authelia/config/configuration.yml):jwt_secretesession.secret: Estão definidos, são complexos e são os mesmos que Authelia está usando? (Se você os define via variáveis de ambiente no compose, certifique-se que estão sendo passados corretamente).session.domain: Está configurado para o seu domínio pai (e.g.,{{ base_domain }}), e NÃO para um subdomínio comoauth.{{ base_domain }}? Isso é crucial para que o cookie de sessão funcione em todos os seus subdomínios.storage(PostgreSQL): A configuração do banco de dados (hostauthelia_db, usuário, senha, nome do DB) está correta e o containerauthelia_dbestá rodando e saudável?access_control.rules: As regras estão definidas como você espera? Adefault_policyestá correta? As regras para domínios específicos e a regrabypassparaauth.{{ base_domain }}estão presentes e corretas?notifier(SMTP): Se configurado, está correto? Problemas aqui podem impedir o reset de senha.
- Conectividade com o Banco de Dados PostgreSQL do Authelia:
- O container
autheliaconsegue alcançar o containerauthelia_dbna redeinternal_services? - Verifique os logs do
authelia_dbtambém.
- O container
- Cookies do Navegador:
- Tente limpar os cookies do seu navegador para o seu
{{ base_domain }}e paraauth.{{ base_domain }}e tente logar novamente. - Use as Developer Tools do navegador (F12 -> Aba Application/Storage -> Cookies) para inspecionar o cookie de sessão do Authelia (geralmente chamado
homelab_authelia_sessionou o que você definiu emsession.name). Ele está sendo definido para o domínio correto?
- Tente limpar os cookies do seu navegador para o seu
- Sincronia de Relógio:
- Certifique-se de que o relógio na
core-services-vm(e, portanto, nos containers) está sincronizado corretamente com um servidor NTP. Desvios significativos de tempo podem afetar a validação de códigos TOTP para 2FA.
- Certifique-se de que o relógio na
- Configuração do Middleware
authelia@dockerno Traefik:- No
docker-compose.ymlda stack Authelia (Seção 5.3), a definição do middlewaretraefik.http.middlewares.authelia.forwardauth.addressestá correta, apontando parahttp://authelia:9091/api/verify...? - Os serviços que você quer proteger no Traefik estão referenciando este middleware corretamente (e.g.,
middlewares: "authelia@docker")?
- No
- Logs do Authelia:
5. Problemas com Certificados SSL/TLS (Let's Encrypt via Traefik)¶
- Sintomas: Avisos de certificado inválido, expirado, ou "não confiável" no navegador ao acessar seus serviços HTTPS. Erros de "SSL handshake failed".
- Checklist de Diagnóstico:
- Logs do Traefik:
docker logs traefik. Procure por mensagens de erro contendo "ACME", "Let's Encrypt", "TLS certificate", ou "challenge". Aumentar o nível de log do Traefik paraDEBUGpode fornecer informações muito detalhadas sobre o processo de obtenção de certificados. - Configuração do Resolvedor ACME no
traefik.yml(Config Estática):- O
emailpara Let's Encrypt está correto? - O
storagepara oacme.json(e.g.,/data/acme.jsondentro do container Traefik) está correto e o container Traefik tem permissão de escrita nesse caminho no volume NFS? (Verifique as permissões do diretóriotraefik/datano NFS). - Para o
dnsChallengecomprovider: "cloudflare":- A variável de ambiente
CF_DNS_API_TOKENestá sendo passada corretamente para o container Traefik (verifique odocker-compose.ymlda stackcoree o.envcarregado)? - O token API da Cloudflare que você gerou é válido e tem as permissões corretas (geralmente "Zone:DNS:Edit" para o seu
{{ base_domain }})?
- A variável de ambiente
- O
- Arquivo
acme.json:- Localização:
{{ vm_nfs_mount_base_path }}/{{ zfs_docker_volumes_dataset_name }}/traefik/data/acme.jsonnacore-services-vm. - Verifique o conteúdo (é um arquivo JSON). Ele contém entradas para seus domínios e os certificados? Há mensagens de erro dentro dele?
-
Não Edite
A edição manual deste arquivo pode corrompê-lo. Se você suspeitar que ele está corrompido e o Traefik não consegue obter/renovar certificados:acme.jsonManualmente- Pare o container Traefik.
- Faça um backup do
acme.jsonatual (e.g., renomeie paraacme.json.bak). - Delete o
acme.jsonoriginal (ou deixe o diretóriotraefik/datavazio se não houver outros arquivos importantes lá). - Inicie o container Traefik. Ele tentará obter novos certificados para todos os seus roteadores configurados com Let's Encrypt.
Limites de Taxa da Let's Encrypt
Se você deletar oacme.jsone forçar o Traefik a obter muitos certificados repetidamente em um curto período, você pode atingir os limites de taxa da Let's Encrypt (e.g., para "Certificates per Registered Domain" ou "Failed Validation limit"). Se isso acontecer, você terá que esperar (geralmente uma hora ou até uma semana para alguns limites) antes de tentar novamente.
- Localização:
- Propagação de DNS: Para o desafio DNS-01, Traefik (via API da Cloudflare) precisa criar um registro TXT temporário no DNS do seu domínio. Este registro precisa ser publicamente resolúvel pelos servidores da Let's Encrypt para que o desafio seja bem-sucedido. Se sua propagação de DNS for excepcionalmente lenta (raro com Cloudflare), ou se houver problemas com a API da Cloudflare, o desafio pode falhar.
- Roteadores Traefik: Os roteadores para seus serviços HTTPS no Traefik (definidos por labels Docker ou File Provider) estão configurados corretamente com
tls: true(geralmente implícito comentrypoints: "websecure") etls.certresolver: "letsencrypt"?
- Logs do Traefik:
Lembre-se que o troubleshooting é frequentemente um processo de eliminação. Comece com os logs, formule hipóteses sobre a causa raiz e teste-as sistematicamente. Anote o que você tentou e os resultados para não repetir os mesmos passos ou se perder.