HomeLab Monitor

Servidor MCP somente leitura dentro de um painel homelab auto-hospedado — explore hosts, contêineres Docker, GPU/VRAM, serviços systemd, modelos de IA, alertas e disco.

Documentação

HomeLab Monitor

GitHub stars Docker pulls Discord version license docker docs

Uma página para todo o seu home lab e rig de IA — verdade sobre GPU (qualquer fabricante), tokens/seg, custo de energia por hora, uptime, execuções de treinamento, contêineres, discos. Sem agentes, sem stack de métricas separada, sem nuvem.

HomeLab Monitor — a tour of the dashboard: Overview, GPU truth, Costs, AI Models and Experiments

Seu home lab cresceu para algumas máquinas, um Pi e uma GPU que está misteriosamente sempre ocupada — e ultimamente também está rodando modelos. O HomeLab Monitor oferece uma página auto-hospedada que responde às perguntas reais: o que essa GPU está realmente fazendo, qual modelo está segurando ela, quanto custa para rodar, qual contêiner está consumindo RAM, o que está enchendo seus discos e se algo está fora do ar — em todas as máquinas via SSH: Linux, um Pi, até Windows. Legível pelo celular via VPN.

Comece agora

# Grab the compose file and go. No GPU required — the GPU panels just light up when one's present.
curl -fsSLO https://raw.githubusercontent.com/SikamikanikoBG/homelab-monitor/main/docker-compose.yml
docker compose up -d

Abra http://<your-host>:9800 e pronto. Opções completas (a partir do código-fonte, toolkit de GPU, Windows/WSL2) → Documentação de instalação.

🆕 Novidades — cada versão é documentada por completo, com a justificativa por trás dela: última versão · changelog. O painel também mostra as notas uma vez, no aplicativo, após se atualizar.

O que você obtém

The Overview — a mission-control cockpit: every host in the fleet at a glance, GPU/CPU/RAM gauges for any box (or the whole homelab), live power-to-money costs and an insight feed

Uma página, todas as máquinas, as perguntas que você realmente tem. Os clássicos estão todos aqui — e um cockpit de IA completo é construído sobre eles.

Uma página inicial para o seu laboratório — e uma tela de parede. A Visão Geral abre com um Launchpad: os aplicativos que você realmente abre, como blocos com seus logotipos reais, fixados diretamente de uma linha de contêiner com o endereço já preenchido, agrupados e arrastados na ordem que você quiser. Os pinos ficam no hub, não em um navegador — fixe no laptop e estará no celular e na parede. O quadro inteiro cabe na tela: ele mede seu próprio excesso após cada renderização e cede espaço em ordem — encurtando listas, apertando a trilha da frota, dobrando pinos atrás de um +N mais — em vez de cortar um cartão ao meio ou passar da dobra. Verificado de 4K até 1366×768. E ⛶ Display (ou /?display=1, tudo o que um box de kiosk dedicado precisa) remove todo o excesso de interface e preenche o monitor: você escolhe quais painéis a parede mostra, e em navegadores baseados em Chromium ele abre em tela cheia na tela que você apontar.

Sua GPU, desmistificada — e a mesma aba em todas as máquinas. Um cartão fixado em "utilização 100%" ainda pode estar com throttling, limitado por largura de banda de memória ou com clocks caindo silenciosamente. A aba de GPU decodifica os motivos de throttle do nvidia-smi e mostra utilização de largura de banda de memória, clocks de núcleo/memória, potência vs. limite, p-state — e velocidade do ventilador — para todas as máquinas da frota, não apenas a que está rodando o contêiner. Máquinas com múltiplas GPUs recebem um painel por placa em uma escala compartilhada por métrica, então uma linha de temperatura mais alta realmente é uma placa mais quente; janelas de throttle térmico são sombreadas diretamente no sparkline. Você pode ver em qual placa um serviço está rodando (uma máquina 3×3090 mostra os 63 GB de um modelo divididos em 22,5 / 22,1 / 18,8 entre as placas, não um número agregado), quanto cada serviço custou em energia, e receber alertas quando uma placa sofre throttle, superaquece ou perde um ventilador — sustentado, por placa, com limites por host, porque uma máquina com limite de potência deliberadamente reduzido deve ficar no seu teto. E não é mais apenas NVIDIA: GPUs AMD são lidas no Linux diretamente da interface amdgpu do kernel (sem ROCm), e GPUs AMD e Intel em hosts Windows — então sua placa aparece com nome, utilização e VRAM, sem ferramentas do fabricante. Qualquer coisa que um driver não reportar é indicada como tal, em vez de desenhar um zero confiante.

The GPU tab — per-card history, fan speed, temperature and which service is on which card

Quanto custa — até o processo. Energia vira dinheiro: por máquina, depois por componente (GPU medida via nvidia-smi, CPU/DRAM via RAPL), depois por processo, contêiner ou modelo — clique em qualquer linha para ver o que consumiu e quanto custou em qualquer período. Tarifas de dia e noite (Economy 7, Heures Creuses, …), ou apenas escolha seu país para uma estimativa razoável. Cada watt é medido ou uma linha de base que você define; a energia da tomada nunca é adivinhada. E um mapa de calor de horários de pico transforma meses de amostras em uma imagem de quando seu laboratório custa dinheiro — uma grade 7×24 de dia da semana × hora que mostra qual hora da semana é a mais cara de relance.

The Costs page — per-component and per-process power & money

Suas execuções de treinamento, precificadas. Envie uma execução do Jupyter, Colab ou Kaggle com um cliente de arquivo único (ou espelhe do MLflow), e ela volta com a curva de perda e a energia real de GPU que consumiu, na mesma linha do tempo. Crie, nomeie, expire e revogue chaves de API você mesmo.

A run pushed from a notebook — its loss curve and the GPU power it actually used

"Vai caber?" — medido, não adivinhado. O Benchmark Lab carrega cada um dos seus modelos locais do ollama e varre uma escada de tamanhos de contexto nas suas placas reais, registrando tokens/seg de geração e prompt, tempo de carregamento, quanto vazou da VRAM para a RAM do sistema e o maior contexto que ainda cabe totalmente na VRAM — o limite que vale a pena definir. Escolha qual(is) GPU(s) testar (via um contêiner ollama descartável fixado — o principal nunca é tocado), sobreponha execuções armazenadas para comparar placas, e cada execução volta com a energia que consumiu e o custo. Os resultados são armazenados: faça benchmark uma vez, reexecute apenas quando algo mudar.

The Benchmark Lab — a sortable leaderboard of your models with tokens/sec, VRAM fit and recommended context, plus a context-sweep chart

E o resto do laboratório, como sempre foi:

  • Contêineres, honestamente — saúde mais RAM e VRAM em colunas separadas (RAM residente real, não cache de página), e clique em um para ver os logs em uma gaveta lateral. Todas as máquinas da frota recebem os mesmos controles — logs, iniciar/parar/reiniciar, política de reinício, fixar — pela mesma conexão SSH que a sonda já usa, e a aba inteira funciona no celular.
  • Serviços systemd — locais ou remotos, suas próprias unidades destacadas, falhas primeiro.
  • Treemaps de disco estilo WizTree — em qualquer máquina da frota. Clique nas pastas que estão enchendo um disco no hub ou em qualquer host Linux que você adicionou; um remoto é escaneado pela mesma conexão SSH que tudo o resto usa, então ainda não há nada para instalar nele. Além de I/O de rede com os maiores consumidores por contêiner e um mini-htop para quem está consumindo CPU e RAM.
  • Move-se como um painel ao vivo. Utilização, RAM, temperatura e potência atualizam a cada poucos segundos por um stream push em vez de polling fixo — e faz isso fazendo menos requisições do que antes, porque a consulta cara de histórico é buscada apenas na frequência em que os buckets do gráfico podem mudar, e uma aba que você não está olhando para de custar qualquer coisa. A cadência de amostragem e armazenamento não é alterada, então o histórico permanece exatamente tão denso (e os custos exatamente tão precisos) quanto eram.
  • Multi-máquina via SSH — cole uma chave por máquina; Linux, um Pi, até Windows. Sem agentes, sem instalações. A aba de GPU também funciona por host: um rig remoto multi-GPU mostra VRAM, utilização, potência e temperatura de cada placa, e os processos que seguram a memória.
  • Monitoramento de uptime, dentro do box — monitore qualquer endpoint HTTP ou porta TCP (seus serviços, um NAS, um site remoto) direto do contêiner: faixa de heartbeat, % de uptime 24h/7d, latência e alertas inteligentes por verificação — confirmação anti-flap, recuperação com tempo de inatividade e um aviso opcional de resposta lenta. Sem serviço de uptime extra para auto-hospedar — já está no box.
  • Alertas push — Discord, ntfy.sh e Telegram, acionados por borda para não gerar spam.

Tour completo aba por aba → Recursos.

Multi-máquina, em duas frases

Abra a aba Hosts, cole a chave SSH gerada automaticamente pelo hub em cada remoto, e o hub começa a fazer polling — sem agentes, apenas SSH + Python 3 (PowerShell no Windows). O hub envia uma sonda pequena e autocontida via SSH; nada persiste no remoto. A mesma conexão é o que permite abrir o cockpit de GPU de um remoto e escanear seus discos a partir do hub — ainda sem nada instalado na outra ponta.

Onboarding, configuração do Windows e o modelo de segurança → Documentação multi-máquina.

Configuração

Defina estas opções em environment: no docker-compose.yml (todas opcionais):

VariávelPadrãoSignificado
SAMPLE_INTERVAL10Segundos entre amostras armazenadas. Esta é a cadência de armazenamento — cada figura de energia e custo é integrada contra ela, então alterá-la muda como o histórico é precificado
FAST_INTERVAL2Segundos entre atualizações de valores ao vivo na tela. Lê apenas contadores baratos e não armazena nada, então não custa histórico nem precisão. 0 desliga o stream push e o painel volta a usar polling
RETENTION_DAYS180Por quanto tempo o histórico é mantido
PRESSURE_FREE_MB2048VRAM livre abaixo deste valor conta como "pressão"
PORT9800Porta do painel
MCP_PORT9810Porta do servidor MCP somente leitura integrado
ENABLE_MCP1Defina 0 para rodar o painel sem o servidor MCP
ENABLE_CONTROLS1Defina 0 para remover os botões iniciar/parar/reiniciar das abas Contêineres e Serviços
ALLOW_SELF_UPDATE1Defina 0 para desativar a atualização no aplicativo
WATCH_CONTAINERS—Contêineres extras para escanear por OOM (separados por vírgula)
WATCH_SERVICES—Unidades systemd para sempre mostrar, mesmo as de fornecedores (separadas por vírgula)
CHECK_UPDATEStrueDefina false para desativar a verificação diária de versões do GitHub (sem chamadas de saída)
CHECK_OS_UPDATEStrueDefina false para parar de reportar atualizações de pacotes do SO pendentes
PUBLIC_STATUS—Defina para ativar a página de status pública (também um alternador em Configurações, que não requer reinício)
DB_PATH/data/gpu.dbOnde o histórico é armazenado dentro do contêiner
HOST_ROOT/rootfsPonto de montagem da raiz do host somente leitura
DOCKER_SOCK/var/run/docker.sockSocket Docker para ler contêineres

O histórico vive em ./data/gpu.db (um bind mount), então sobrevive a reinícios e atualizações. Alertas, o mount D-Bus do systemd e ajustes por servidor → Documentação de configuração.

Por baixo do capô

O hub costura nvidia-smi (mais GPUs AMD via interface sysfs amdgpu no kernel, e AMD/Intel em hosts Windows via contadores de desempenho de GPU integrados), a API Docker, APIs de servidores de modelo (Ollama, vLLM, llama.cpp, A1111, …), D-Bus do systemd e /proc + /sys em uma visão amostrada, persistida em SQLite e com downsampling na leitura, para que um intervalo de seis meses carregue tão rápido quanto a última hora. Página única, Chart.js embutido, sem etapa de build.

Conecte um agente de IA (MCP)

Seu homelab agora é legível para agentes de IA — aponte um cliente para uma URL e ele pode ver cada host, contêiner, GPU e disco. Somente leitura, sem configuração extra.

O HomeLab Monitor não é apenas um painel para você; também é contexto para seu agente de IA. Um servidor MCP somente leitura está integrado no mesmo contêiner (servido em :9810) — então Claude, Claude Code ou qualquer cliente MCP conecta em uma linha e explora todo o seu laboratório através de 19 ferramentas nomeadas, com a mesma cobertura que você vê no painel: hosts, contêineres, serviços systemd, GPU e quem está usando ela, RAM por processo, servidores de modelo de IA, modelos instalados, custos, execuções de experimentos, benchmarks de modelo, treemaps de disco, histórico e alertas.

HomeLab Monitor connects over MCP to AI agents and MCP clients — Claude, ChatGPT, agents on local Ollama models, or any MCP client; read-only, both directions are question and answer

Conecte qualquer cliente MCP — Claude, ChatGPT ou um agente nos seus próprios modelos locais Ollama — e ele lê o estado ao vivo do seu homelab. Somente leitura: ambas as direções são apenas perguntas e respostas.

# the dashboard is on :9800; the MCP server rides along on :9810
claude mcp add --transport http homelab http://YOUR-HUB:9810/mcp

Depois de conectado, pule a caça às abas e apenas pergunte — o agente escolhe as ferramentas certas:

  • "Minha GPU está saturada há uma hora — qual servidor de modelo está carregado e quem está realmente chamando ele?"
  • "O que está consumindo /backup? Me dê as maiores pastas e sinalize qualquer coisa que pareça logs descontrolados."
  • "Qual host está com menos RAM agora e qual é o principal processo segurando ela?"
  • "Quero reiniciar e fazer uma atualização do sistema operacional neste fim de semana — qual máquina precisa mais disso e qual é uma ordem segura considerando o que está rodando em cada uma?"

Somente leitura por design — não há ferramentas de escrita, então um agente pode olhar, mas nunca tocar na sua frota. Desligue a qualquer momento com ENABLE_MCP=0. Lista completa de ferramentas e configuração → Documentação do MCP.

Segurança

Este é um monitor de host: ele roda com acesso ao host, além de um socket Docker de leitura/escrita e um socket D-Bus (auto-atualização e os controles de iniciar/parar/reiniciar das abas Containers/Services estão ativados por padrão — defina ALLOW_SELF_UPDATE=0/ENABLE_CONTROLS=0, ou use docker-compose.readonly.yml, para restringir a monitoramento puro) e uma montagem raiz somente leitura — uma área de atuação ampla por design. O painel em si não tem login/autenticação — ele é feito para uma LAN confiável. Mantenha-o atrás da sua LAN/VPN/firewall e não o exponha à internet pública. Detalhes → documentação.

⭐ Apoie o projeto

Se o HomeLab Monitor economiza uma ou duas abas do navegador, uma ⭐ no GitHub genuinamente ajuda outros entusiastas de homelab a encontrá-lo. Obrigado!

Star history — cumulative stars over time

💬 Comunidade

Construir isso é mais divertido juntos. Entre no Discord do HomeLab Monitor — diga oi, mostre seu setup, troque ideias, peça ajuda ou apenas fique por perto. É onde acontecem as conversas sobre o roadmap, perguntas de "devíamos construir X?" e ajuda rápida — e onde novos contribuidores recebem boas-vindas calorosas.

Join the Discord

Traga um amigo, poste uma ideia, abra uma issue — vamos crescer uma comunidade de homelab amigável e saudável. 💛

Contribuindo

Issues e PRs são muito bem-vindos — especialmente novas sondas de servidores de modelo, novos monitores e back-ends de GPU. Esta é uma ferramenta de hobby feita para ajudar outros entusiastas de homelab, então seja gentil. Veja CONTRIBUTING.md.

Contribuidores

Obrigado a todos que abriram uma issue, enviaram um PR ou ajudaram a moldar o roadmap. Todo o back-end de GPU AMD — VRAM por processo via DRM fdinfo e paridade total de painel na v0.28.0, VRAM real em APUs de memória unificada na v0.26.0 — veio de @andreahaku. O registro de modelos ciente da frota da v0.27.0 e as janelas de manutenção da v0.23.0 vieram de @1HazyOne707. A energia RAPL de CPU/DRAM da v0.27.0 e o refatoramento do módulo backend/ da v0.24.0 vieram de @pehota. Veja o changelog para o registro completo e contínuo de créditos.

Licença

MIT — veja LICENSE.