homelab-monitor

SikamikanikoBGMIT活跃维护

单容器自托管的家庭实验室监控面板,集中展示 GPU、本地 AI 显存、Docker、systemd 和电费,并提供只读 MCP 服务让 AI 代理直接查询这些数据。

Self-hosted homelab dashboard in one container — GPU, local-AI VRAM, Docker, systemd, energy costs. Read-only MCP server so AI agents can explore it.

v0.38.1发布于 2026-11-09 04:34 UTC236star +5 / 7 天37fork同步于 2026-11-11 18:03 UTC

怎么上手

由 README 提炼,执行前请确认
curl -fsSLO https://raw.githubusercontent.com/SikamikanikoBG/homelab-monitor/main/docker-compose.yml
docker compose up -d
硬件要求按 README 说明

README 未说明最低配置;无 GPU 也能运行,GPU 面板只在检测到显卡时显示。支持 NVIDIA(nvidia-smi)、Linux 上通过内核 amdgpu 接口读取 AMD 显卡(无需 ROCm),以及 Windows 主机上的 AMD 和 Intel 显卡。

纯 CPU 可运行支持 ROCm / AMD多卡 / 张量并行有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

一个容器自托管的家庭实验室仪表盘,统一监控多机 GPU、容器、能耗,并内置可对话的 AI 运维代理

单容器自托管的家庭实验室监控面板,集中展示 GPU、本地 AI 显存、Docker、systemd 和电费,并提供只读 MCP 服务让 AI 代理直接查询这些数据。

核心能力

  • 通过 SSH 统一采集多台 Linux、树莓派和 Windows 主机的指标,无需在被监控机器上安装任何东西
  • 解析 nvidia-smi 的降频原因,并展示显存带宽、核心与显存频率、功耗、风扇转速和每张卡的占用情况
  • 按机器、组件、进程或模型拆分电费,支持昼夜电价和一周忙时热力图
  • 内置只读 MCP server,AI 代理可读取同一套数据,并按策略审批后执行固定目录内的操作
  • Benchmark Lab 实测本地 ollama 模型在不同上下文长度下的显存占用与 tokens/s

容易踩的坑

默认监听 9800 端口,访问 http://:9800;AI 代理默认关闭,需在 Overview 中手动开启,并自行配置本地模型服务或 API key;GPU 面板依赖宿主机驱动与 nvidia-smi 可用,否则相关指标不会显示。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.38.1
  1. v0.38.1v0.38.1 — the agent shows up when you update最新正式版2026-11-09 · 2026-11-09 04:34 UTC

    Fixed

    • The AI agent is there after you update — no compose edit needed. In 0.38.0 it only appeared with AGENT_ENABLED=1, so anyone who updated (Watchtower, the update button, docker compose pull) got the new version and never saw the agent. It is now available by default and the Overview offers to set it up; it still does nothing until you set a dashboard password and switch it on. AGENT_ENABLED=0 hides it completely, as before.

    Pinned image: sikamikaniko123/homelab-monitor:0.38.1

  2. v0.38.0v0.38.0 — your homelab gets an AI agent, and a lock on the door2026-11-08 · 2026-11-08 13:00 UTC
    查看更新说明

    Added

    • An optional AI agent that knows your lab — chat with it, let it act where you allow, and switch on automations. Turn it on with AGENT_ENABLED=1, a dashboard password and the Enable switch; until then nothing changes. Ask from the new Agent tab or the floating Ask button on every page (it knows which page and host you're on) and get answers built from the same read tools the MCP server has, with each tool call shown as a chip. It works with the models already on your lab — Ollama, vLLM, llama.cpp, LM Studio, LocalAI — found for you and tested with one click (badges say whether a model can call tools and follow up), or with your own key for OpenAI, Anthropic, Gemini (experimental), Azure OpenAI, Groq, Mistral, DeepSeek, xAI, OpenRouter or Together. Keys are write-only and never leave the hub. You decide what it may do: each host is Off, Passive (read only — every host starts here) or Active, and each action is Deny, Ask or Allow (Deny until you change it), from a fixed catalogue — restart/stop containers, restart services, prune dangling images and build cache, shrink the journal, unload or delete Ollama models — with no shell anywhere. The server checks the policy when the agent proposes and again when it runs; Ask means a confirm card, and nothing runs until you approve. Unattended runs only do low-risk things on their own, never more than 3 times a day per target; everything else waits for you. The monitor's own container and whatever serves the model are always off-limits. Automations: ten templates (Docker cleanup, model housekeeping, disk-space watch, system maintenance, data & log cleanup, GPU health, update report, cost report, container health, backup freshness) or your own prompt, on a schedule, in Report, Propose or Act-within-policy mode, with reports to your alert channels and proposals waiting under Approvals. Activity shows every run step by step — what it read, what policy decided and why, who approved — exportable as JSON/CSV, with a copy of every action in docker logs. (#354, docs: AI agent)
    • An optional dashboard login. Settings → Security sets a password (or ADMIN_PASSWORD at boot); without one everything works exactly as before. With one, browsers log in, changes need the session's CSRF token, and API keys get a scope — push (what every existing key stays), read (Grafana, MCP clients) or admin. /healthz, /metrics and the public status page stay open. The built-in MCP port asks for a read key too. Forgot it: docker exec homelab-monitor python -m backend.auth.cli reset-password. (#327)

    Changed

    • The AI agent sets itself up in about a minute, and the Overview says it's there. One setup — a password, a model found on your network and tested while you watch, and how much it may do (Look only / Ask me first / Handle the small stuff, for every machine including ones you add later) — ends in a chat with suggestions. The Overview gets an Ask your lab card: ask straight from the home page, see approvals waiting for you and one line per routine that ran lately. Answers render tables, the steps behind an answer fold into one line ("Checked 4 machines · 1 look-up · 6 s"), conversations get a short title and up to two follow-up suggestions, and the Agent tab is down to Chat, Routines, Approvals, Activity and Settings. When it runs out of steps or tokens it now still answers from what it gathered, a follow-up like "summarise" works from what it just read, and it starts from the fleet overview instead of sca
  3. v0.37.0v0.37.0 — your containers get their logos2026-09-23 · 2026-09-23 03:28 UTC
    查看更新说明

    Added

    • Containers and services show their real logos. The dashboard bundled ~65 brand marks, which covered the usual suspects and left everything else with a bare name. It now falls back to the selfh.st icon set — about 2,900 icons — on the Containers and Services tabs, on every host in the fleet, and on Launchpad pins.

      Your browser never talks to the icon CDN. It asks the hub, and the hub fetches each icon once and serves it from the ./data volume from then on. So the list of icons you request — a fairly precise inventory of what you self-host — stays on your network, the icons keep working on a box with no internet, and what you already have survives the CDN going away.

      Matching reads both the container name and its image, so immich_server on ghcr.io/immich-app/immich-server is Immich; snap units are unwrapped, compose's -1 suffix is ignored, and postgres finds PostgreSQL. It refuses to guess when two apps fit — "whisper" is not Whisper Money — and a name nothing matches shows no icon, exactly as before. On by default; Settings → General → App icons turns it off, and says how many icons this hub is actually holding.

    Since 0.36.0

    • v0.36.1 — a search box in the top bar, on every tab: it filters the rows of the tab you're on and lists matching containers, services, hosts, models, pinned apps and pages from the whole fleet, with / or Ctrl/Cmd+K to focus. Also fixed the Overview cockpit painting on top of every other tab.
    • v0.36.2 — that search box rendered as two stacked fields.

    Pinned image: sikamikaniko123/homelab-monitor:0.37.0

  4. v0.36.2v0.36.2 — one search box, not two2026-09-23 · 2026-09-23 02:58 UTC
    查看更新说明

    Fixed

    • The search box added in 0.36.1 rendered as two fields stacked on each other — a wide one with the magnifying glass, and a taller one inside it. The dashboard's global input styling sits later in the stylesheet than the search box's own rules and outranks them, so the field kept drawing its own background, border and padding inside the box it was supposed to fill. It draws nothing of its own now, in dark and light.

    Pinned image: sikamikaniko123/homelab-monitor:0.36.2

  5. v0.36.1v0.36.1 — a search box on every tab, and the Overview stays put2026-09-22 · 2026-09-22 05:23 UTC
    查看更新说明

    Fixed

    • The Overview cockpit (Launchpad / Burn Rate / Engine) painted on top of every other tab since 0.36.0 — the fit fix's display:flow-root beat the hidden attribute. The rule now applies only while the Overview is shown.

    Added

    • A search box in the top bar, on every tab. Type and the tab you are on filters itself (rows that don't match are hidden, with an n / m tally), while a results list shows matches from the whole fleet — containers and services on every host, hosts, loaded AI models, pinned apps and the dashboard's pages — grouped by kind with status dots. Pick one and the dashboard switches to that host and tab, keeps the filter on and flashes the row. / or Ctrl/Cmd+K focuses it, ↑/↓ pick, Enter opens, Esc closes then clears. Nothing extra is fetched: it searches what the tabs already hold.

    Pinned image: sikamikaniko123/homelab-monitor:0.36.1

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    HomeLab Monitor

    GitHub stars Docker pulls Discord version license docker docs

    Ask your homelab. One self-hosted page for every box and GPU you run — and an AI agent that reads all of it, answers in plain words, and fixes things only when you say so. It runs on the models already in your lab. No cloud, nothing to install on your machines.

    Real answer, real fleet: one click on the Overview, a local model on the lab's own GPUs, about 45 seconds (sped up here). Host names are anonymised.

    Your home lab grew into a couple of machines, a Pi, and a GPU that's mysteriously always busy — and lately it's running models too. HomeLab Monitor gives you one page that answers the real questions: what's that GPU actually doing, which model is holding it, what's it costing you to run, which container is eating RAM, what's filling your disks, and is anything down — across every box over SSH: Linux, a Pi, even Windows. And when you'd rather not click through tabs, just ask.

    Get started

    # 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
    

    Open http://<your-host>:9800 and you're done. The AI agent is already there: the Overview walks you through turning it on in about a minute. Full options (from source, GPU toolkit, Windows/WSL2) → Install docs.

    🆕 What's new — every release is written up in full, with the reasoning behind it: latest release · changelog. The dashboard also shows you the notes once, in-app, after it updates itself.

    Ask your homelab — an AI agent that knows your lab

    The Overview with the 'Ask your lab' card: a question box with suggestions, an action waiting for approval, and the routines that ran lately

    It answers from what the dashboard actually measures. Ask from the Ask your lab card on the Overview, the floating Ask button on any page (it knows which page and host you're on), or the Agent tab. It reads your lab with the same tools the MCP server has, starts from the fleet overview and drills down only when it has to. The answer comes back as text and tables, never a wall of JSON. Every answer says what it checked ("Checked 4 machines · 2 look-ups · 46 s") and offers follow-ups. Ask in English, Bulgarian or anything else; it replies in your language.

    A chat answer: a fleet table with CPU, RAM, fullest disk and containers per host, then what needs attentionA confirm card: Restart a service nginx.service on the hub, medium risk, nothing runs until you approve, with Reject and Approve
    A real answer — the whole fleet in one table, then what needs you.Nothing runs until you approve. The exact command is one click away.

    Your models, your rules. It finds the model servers already on your network — Ollama, vLLM, llama.cpp, LM Studio, LocalAI — and tests them while you watch, or takes your own key for OpenAI, Anthropic, Gemini, Groq, Mistral, OpenRouter and others. Keys never leave the hub.

    You decide what it may do. Each machine is Look only, Ask me first or Handle the small stuff. Actions come from a fixed catalogue — restart or stop a container, restart a service, prune dangling images and build cache, shrink the journal, unload or delete an Ollama model — with no shell anywhere. The server checks the policy when the agent proposes an action and again when it runs. The monitor's own container and whatever serves the model are always off-limits.

    Routines that run while you sleep. Ten ready-made ones — disk-space watch, GPU health, container health, Docker cleanup, model housekeeping, update and cost reports, backup freshness and more — or your own prompt, on a schedule. Each one can report, propose actions or act within your policy. Reports go to your alert channels, and proposals wait for you under Approvals.

    The Routines tab: ten templates — backup freshness, container health, cost report, data and log cleanup, disk space watch, Docker cleanup, GPU health, model housekeeping, system maintenance — with schedules, token estimates and what each may do

    Every step on the record. Activity shows what each run read, what the policy decided and why, and who approved it. You can export it as JSON or CSV, and every action is also written to docker logs.

    Off until you turn it on, and only ever behind the dashboard login → AI agent docs.

    What you get

    One page, every box, the questions you actually have. The classics are all here — and a whole AI cockpit builds on top of them.

    A front page for your lab — and a wall screen. The Overview opens with a Launchpad: the apps you actually open, as tiles with their real logos, pinned straight from a container row with the address already filled in, grouped and dragged into the order you want. Pins live on the hub, not in one browser — pin it on the laptop and it's there on the phone and on the wall. The whole board fits the screen: it measures its own overrun after every paint and gives ground in order — trimming lists, tightening the fleet rail, folding pins behind a +N more — rather than clipping a card in half or running past the fold. Verified from 4K down to 1366×768. And ⛶ Display (or /?display=1, all a dedicated kiosk box needs) drops every scrap of chrome and fills the monitor: you choose which panels the wall shows, and on Chromium-based browsers it opens full-screen on whichever screen you point it at.

    Your GPU, demystified — and the same tab on every box. A card pinned at "100% util" can still be throttling, memory-bandwidth-bound, or quietly drooping its clocks. The GPU tab decodes nvidia-smi's throttle reasons, and shows memory-bandwidth util, core/mem clocks, power-vs-limit, p-state — and fan speed — for every machine in the fleet, not just the one running the container. Multi-GPU boxes get one panel per card on a shared scale per metric, so a taller temperature line really is a hotter card; thermal-throttle windows are shaded right on the sparkline. You can see which card a service is sitting on (a 3×3090 box shows a model's 63 GB split 22.5 / 22.1 / 18.8 across the cards, not one pooled number), what each service cost in energy, and get alerted when a card throttles, overheats or loses a fan — sustained, per card, with per-host thresholds, because a box running a deliberately lowered power limit is supposed to sit at its cap. And it's no longer NVIDIA-only: AMD GPUs are read on Linux straight from the kernel's amdgpu interface (no ROCm), and AMD and Intel GPUs on Windows hosts — so your card shows up with its name, utilisation and VRAM, no vendor tools required. Anything a driver won't report says so, instead of drawing a confident zero.

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

    What it costs — down to the process. Power becomes money: per machine, then per component (GPU measured via nvidia-smi, CPU/DRAM via RAPL), then per process, container or model — click any row to see what it drew and what it cost over any window. Day & night tariffs (Economy 7, Heures Creuses, …), or just pick your country for a sensible estimate. Every watt is measured or a baseline you set; wall power is never guessed. And a busy-hours heatmap turns months of samples into one picture of when your lab costs you money — a 7×24 day-of-week × hour grid that shows which hour of the week is priciest at a glance.

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

    Your training runs, priced. Push a run from Jupyter, Colab or Kaggle with a one-file client (or mirror it from MLflow), and it comes back with the loss curve and the GPU energy the box drew over the run window, on the same timeline. That window figure is the whole card's draw, not a per-run measurement — GPUs do not meter per process. Create, name, expire and revoke API keys yourself.

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

    "Will it fit?" — measured, not guessed. The Benchmark Lab loads each of your local ollama models and sweeps a ladder of context sizes on your actual cards, recording generation & prompt tokens/sec, load time, how much spilled from VRAM into system RAM, and the largest context that still fits fully in VRAM — the cap worth setting. Pick which GPU(s) to test (via a throwaway pinned ollama container — your main one is never touched), overlay stored runs to compare cards, and every run comes back with the energy it burned and what it cost. Results are stored: benchmark once, re-run only when something changes.

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

    And the rest of the lab, the way it always was:

    • Containers, honestly — health plus RAM and VRAM in separate columns (real resident RAM, not page cache), and click one to tail its logs in a side drawer. Every box in the fleet gets the same controls — logs, start/stop/restart, restart policy, pin — over the same SSH connection the probe already uses, and the whole tab works on a phone.
    • systemd services — local or remote, your own units highlighted, failures first.
    • WizTree-style disk treemaps — on any box in the fleet. Click into the folders filling a disk on the hub or on any Linux host you've added; a remote is scanned over the same SSH connection everything else uses, so there's still nothing to install on it. Plus network I/O with per-container top talkers and a mini-htop for who's eating CPU and RAM.
    • It moves like a live dashboard. Utilisation, RAM, temperature and power update every couple of seconds over a push stream instead of a fixed poll — and it does that while making fewer requests than before, because the expensive history query is fetched only as often as its own chart buckets can change, and a tab you're not looking at stops costing anything at all. Sampling and storage cadence are untouched, so history stays exactly as dense (and costs stay exactly as accurate) as they were.
    • Multi-machine over SSH — paste one key per box; Linux, a Pi, even Windows. No agents, no installs. The GPU tab works per host too: a remote multi-GPU rig shows every card's VRAM, utilisation, power and temperature, and the processes holding the memory.
    • Uptime monitoring, in the box — watch any HTTP endpoint or TCP port (your services, a NAS, a remote site) straight from the container: heartbeat strip, 24h/7d uptime %, latency, and smart per-check alerts — anti-flap confirm, recovery with downtime, and an optional slow-response warning. No extra uptime service to self-host — it's already in the box.
    • Push alerts — Discord, ntfy.sh and Telegram, edge-triggered so they don't spam.

    Full tab-by-tab tour → Features.

    Multi-machine, in two sentences

    Open the Hosts tab, paste the hub's auto-generated SSH key onto each remote, and the hub starts polling it — nothing to install, just SSH + Python 3 (PowerShell on Windows). The hub pipes a small self-contained probe over SSH; nothing persists on the remote. The same connection is what lets you open a remote's GPU cockpit and scan its disks from the hub — still with nothing installed on the far end.

    Onboarding, Windows setup, and the security model → Multi-machine docs.

    Configuration

    Set these under environment: in docker-compose.yml (all optional):

    VariableDefaultMeaning
    SAMPLE_INTERVAL10Seconds between stored samples. This is the storage cadence — every energy and cost figure is integrated against it, so changing it changes how history is priced
    FAST_INTERVAL2Seconds between live-value refreshes on screen. Reads only cheap counters and stores nothing, so it costs no history and no accuracy. 0 turns the push stream off and the dashboard falls back to polling
    RETENTION_DAYS180How long history is kept
    PRESSURE_FREE_MB2048Free VRAM below this counts as "pressure"
    PORT9800Dashboard port
    MCP_PORT9810Port for the built-in read-only MCP server
    ENABLE_MCP1Set 0 to run the dashboard without the MCP server
    ENABLE_CONTROLS1Set 0 to remove the start/stop/restart buttons from the Containers and Services tabs
    ENABLE_HOST_RUN01 re-enables /api/hosts/<name>/run (run any command on a host; unused by the UI)
    ADMIN_PASSWORD—Set the optional dashboard password at boot (or in Settings → Security)
    AGENT_ENABLED1Set 0 to hide the AI agent completely (it runs nothing until you set a password and switch it on)
    ALLOW_SELF_UPDATE1Set 0 to disable in-app updating
    WATCH_CONTAINERS—Extra containers to scan for OOM (comma-separated)
    WATCH_SERVICES—systemd units to always show, even vendor ones (comma-separated)
    CHECK_UPDATEStrueSet false to disable the daily GitHub-releases check (no outbound calls)
    CHECK_OS_UPDATEStrueSet false to stop reporting pending OS package updates
    PUBLIC_STATUS—Set to enable the public status page (also a Settings toggle, which needs no restart)
    DB_PATH/data/gpu.dbWhere history is stored inside the container
    HOST_ROOT/rootfsMount point of the read-only host root
    DOCKER_SOCK/var/run/docker.sockDocker socket to read containers from

    History lives in ./data/gpu.db (a bind mount), so it survives restarts and upgrades. Alerts, the systemd D-Bus mount, and per-server tuning → Configuration docs.

    Under the hood

    The hub stitches nvidia-smi (plus AMD GPUs via the in-kernel amdgpu sysfs interface, and AMD/Intel on Windows hosts via the built-in GPU perf counters), the Docker API, model-server APIs (Ollama, vLLM, llama.cpp, A1111, …), systemd D-Bus, and /proc + /sys into one sampled view, persisted to SQLite and downsampled on read so a six-month range loads as fast as the last hour. Single page, vendored Chart.js, no build step.

    • 30+ recognised model servers → Model servers
    • Standard /metrics endpoint to scrape into whatever dashboards you already run → Metrics export
    • The full data pipeline + caller attribution → How it works

    Bring your own AI client (MCP)

    Your homelab is now legible to AI agents — point a client at one URL and it can see every host, container, GPU and disk. Read-only, no extra setup.

    Prefer your own assistant to the built-in one? A read-only MCP server is built into the same container (served on :9810) — so Claude, Claude Code, or any MCP client connects in one line and explores your whole lab through 20 named tools, with the same coverage you see on the dashboard: hosts, containers, systemd services, GPU and who's driving it, per-process RAM, AI model servers, installed models, costs, experiment runs, model benchmarks, disk treemaps, history and alerts.

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

    Once connected, skip the tab-hunting and just ask — the agent picks the right tools:

    • "My GPU's been pinned for an hour — which model server is loaded, and who's actually calling it?"
    • "What's eating /backup? Give me the biggest folders and flag anything that looks like runaway logs."
    • "Which host is lowest on RAM right now, and what's the top process holding it?"
    • "I want to reboot and run an OS upgrade this weekend — which box needs it most, and what's a safe order given what's running on each?"

    Read-only by design — there are no write tools, so an agent can look but never touch your fleet. Turn it off anytime with ENABLE_MCP=0. Full tool list & setup → MCP docs.

    Security

    This is a host monitor: it runs with host access, plus a read-write Docker socket and D-Bus socket (self-update and the Containers/Services tabs' start/stop/restart controls are on by default — set ALLOW_SELF_UPDATE=0/ENABLE_CONTROLS=0, or use docker-compose.readonly.yml, to lock it down to pure monitoring) and a read-only root mount — a broad footprint by design. The dashboard has an optional login (Settings → Security; off until you set a password, and required for the AI agent) — without one it's meant for a trusted LAN. Keep it behind your LAN/VPN/firewall and don't expose it to the public internet. Details → docs.

    ⭐ Support the project

    If HomeLab Monitor saves you a browser tab or two, a ⭐ on GitHub genuinely helps other home-labbers find it. Thank you!

    💬 Community

    Building this is more fun together. Join the HomeLab Monitor Discord — say hi, show off your rig, swap ideas, ask for help, or just hang out. It's where the roadmap chatter, “should we build X?” questions, and quick help happen — and where new contributors get a warm welcome.

    Join the Discord

    Bring a friend, post an idea, open an issue — let's grow a friendly, healthy homelab community. 💛

    Contributing

    Issues and PRs are very welcome — especially new model-server probes, new monitors, and GPU back-ends. This is a hobby tool meant to help fellow home-labbers, so be kind. See CONTRIBUTING.md.

    Contributors

    Thanks to everyone who's filed an issue, opened a PR, or helped shape the roadmap. The entire AMD GPU back-end — per-process VRAM via DRM fdinfo and full panel parity in v0.28.0, real VRAM on unified-memory APUs in v0.26.0 — came from @andreahaku. v0.27.0's fleet-aware model registry and v0.23.0's maintenance windows came from @1HazyOne707. v0.27.0's RAPL CPU/DRAM power and v0.24.0's backend/ module-tree refactor came from @pehota. See the changelog for the full, ongoing credit trail.

    License

    MIT — see LICENSE.