用Dashdot打造轻量级Docker服务器监控仪表盘
最早给家里的 N100 小主机装 Docker 的时候我习惯用 docker stats 看资源占用凑合是能凑合但心里一直觉得缺一个东西——一个打开就能看到全局状态的服务器仪表盘。后来试过 Netdata功能确实强单机场景用起来又感觉有点杀鸡用牛刀。Dashdot 就是我这段时间里找到的折中方案一个专门为单台服务器设计的 Docker 部署仪表盘界面清爽、数据实时刷新、部署成本几乎为零。如果你也有一台个人 VPS、NAS、软路由或者闲置旧电脑想快速搞一个能显示 CPU、内存、磁盘、网络、温度这些信息的监控页面这篇文章应该能帮你少走不少弯路。我会从部署前的环境检查讲起把 docker run、docker compose 两种方式、常用配置项、反代访问和常见坑一次说清。1. 先搞清楚 Dashdot 是什么值不值得装1.1 它到底解决什么问题Dashdot 是一个开源的轻量级服务器仪表盘项目GitHub 上叫 makeasnek/dashdot。它的设计目标非常明确只关注单台机器用纯前端静态页面加 SSE 实时推送把一台服务器当前最核心的状态展示出来。你打开浏览器就能看到 CPU 使用率、内存占用、磁盘用量、网络上下行速度、系统负载、开机时长、外网连通性这些信息而且这些数据不用刷新页面会自动更新。日常维护服务器的时候大部分时间我们并不需要历史趋势和复杂告警只是想快速确认机器是不是还活着内存是不是爆了磁盘还剩多少。Dashdot 就是为这种场景设计的部署简单、页面干净、一眼看清。它的界面走的是极简深色风格信息密度高但不杂乱。像我这种习惯把各种服务开在家里小主机上的人Dashdot 更适合当一个常驻显示屏挂在旁边而不是一个需要经常去点开操作的工具台。1.2 和 Netdata、Grafana 这些工具怎么选我身边不少朋友一听到服务器监控就会想到 Prometheus 加 Grafana或者 Netdata。这几个方案我大致都用过简单说一下区别。Netdata 是实时监控里功能很全的选手指标特别细从 CPU 频率、进程级别到各种系统调用都有安装也方便但它默认会采集大量指标对资源占用和小白用户来说页面信息量有点过剩。Prometheus 加 Grafana 是另一条路线强在历史存储、多机聚合和告警规则但是部署成本和维护成本都不低个人单机使用属实没必要。Glances 适合喜欢纯终端操作的人能看也能出 Web 端但视觉和交互都比较朴素。Dashdot 的取舍是不要历史数据不要多机聚合不要告警只做一个现在这台机器状态如何的漂亮展示页。如果你只是看家底儿Dashdot 足够了。如果你有出事要收到通知的刚需那 Dashdot 不内置告警建议另外配一个 Uptime Kuma 做健康检查。真要上多机集中监控、历史曲线和告警体系再考虑 Prometheus 那套也不迟。1.3 需要提前接受的两个限制第一Dashdot 不保存历史数据刷新页面之后看到的只有当前状态。它更适合作为实时状态屏而不是监控数据分析平台。第二它一屏只看一台机器想统一看多台服务器要么开多个实例分别访问要么在导航页里嵌入多个 iframe。这两个限制都不是 bug是这个项目的定位决定的。2. 部署前的环境检查与准备工作2.1 确认 Docker 环境是好的不管你是 Linux 服务器、Windows 上的 Docker Desktop还是 NAS 里自带的容器管理套件第一步都是先确认 Docker 能正常跑起来。在 Linux 终端里敲docker version和docker ps能正常输出就说明 daemon 在运行。如果docker ps报类似permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock的错误通常是因为当前用户不在 docker 组里。解决办法是sudo usermod -aG docker $USER newgrp docker然后重新执行docker ps验证。这只是让你不用每次敲 sudo属于最基础的一步但很多新手会卡在这里以为 Docker 装坏了。Windows 上如果用 Docker Desktop最常见的启动失败是提示virtualisation support wasnt detected。这基本是虚拟化功能没开到位需要进 BIOS 打开 Intel VT-x / AMD-V并在 Windows 功能里启用 WSL2 和虚拟机平台。装完 Docker Desktop 之后如果一直起不来优先检查这两项而不是反复重装。2.2 确认端口 3001 没被占用Dashdot 默认监听容器内的 3001 端口我习惯直接映射为宿主机 3001。部署前先检查一下ss -lntp | grep 3001如果已经有程序占了端口可以换一个宿主机端口比如映射成-p 8080:3001容器内端口不用动。这个细节虽然简单但真到了起容器发现端口冲突再改配置来回折腾挺烦的。2.3 镜像源和拉取问题提前处理Dashdot 官方镜像发布在 GitHub Container Registry完整镜像名是ghcr.io/makeasnek/dashdot:latest。ghcr.io 在国内网络环境下拉取速度经常不稳定甚至直接超时。如果遇到拉不动有两个方向可以处理一是给 Docker 配置 registry mirror把它当成加速源二是换个网络环境再拉一次。镜像拉取不是 Docker 本身的问题不要因为这个就觉得是 Dashdot 配置写错了。我自己更推荐直接把部署写成 docker compose 文件镜像拉取、环境变量、挂载路径都固化在配置里之后换机器迁移也方便。下面第三部分两种方式都会给。3. 两种主流部署方式docker run 与 Docker Compose3.1 最快的方式一条 docker run 命令如果你想先快速体验直接在服务器上执行下面这条命令docker run -d \ --name dashdot \ --restart unless-stopped \ -p 3001:3001 \ -v /:/host:ro \ --privileged \ ghcr.io/makeasnek/dashdot:latest逐个参数说一下-d表示后台运行容器。--name dashdot给容器固定名字后面看日志、停止、删除都方便。--restart unless-stopped让容器在 Docker 重启后自动拉起除非你手动 stop 过它。部署在家庭服务器上这个参数基本是标配。-p 3001:3001把宿主机 3001 端口映射到容器 3001。-v /:/host:ro是 Dashdot 能显示宿主机信息的关键它把宿主机根目录以只读方式挂载到容器内的/hostDashdot 就是从这里读取 CPU、内存、磁盘、网络这些数据的。--privileged不是必须的但它能让仪表盘读取更多硬件细节比如部分设备上的温度传感器。如果你对特权模式比较敏感可以先不加基础信息照样能显示只是温度这类信息会缺失。启动完成后执行docker ps确认容器状态然后浏览器访问http://服务器IP:3001。第一次打开应该就能看到仪表盘了CPU、内存、磁盘这些基本数据都会有。3.2 推荐方式Docker Compose 固定配置我用 docker run 跑通之后很快就把部署迁移成了 compose 文件。原因是环境变量一多命令行会变得很长而且很难维护。compose 文件本身就是一个普通的 YAML能放进 Git也能随时改。下面是一个我在用的参考配置services: dashdot: image: ghcr.io/makeasnek/dashdot:latest container_name: dashdot restart: unless-stopped privileged: true ports: - 3001:3001 volumes: - /:/host:ro environment: - DASHDOT_CONFIG_ENABLE_CPUtrue - DASHDOT_CONFIG_ENABLE_IOtrue - DASHDOT_CONFIG_ENABLE_PINGtrue - DASHDOT_OVERRIDE_NODE_NAMEhomelab启动命令docker compose up -d如果容器起不来可以先看日志docker compose logs dashdot值得说明的是环境变量的命名规则。Dashdot 的配置项都带DASHDOT_前缀其中DASHDOT_CONFIG_开头的属于功能开关DASHDOT_OVERRIDE_开头的属于信息覆盖。变量名用大写字母加下划线这个在官方 README 的环境变量段落里都能查到。3.3 后续更新怎么操作Compose 部署下更新镜像很简单两行命令docker compose pull docker compose up -d第一行拉取新镜像第二行用新镜像重建容器。restart: unless-stopped和container_name都能保证容器在更新后名字不变、状态自动恢复。这里有个常见的坏习惯有人喜欢先docker rm -f dashdot再重新docker run一遍。手动操作最大的问题是环境变量容易漏尤其 Dashdot 这种靠环境变量控制配置的应用漏一个开关又得查半天。所以能用 compose 管理就不要用裸命令反复折腾。4. 配置与调优让仪表盘显示你想看的信息4.1 常用配置项与适用场景Dashdot 默认只显示基础指标想要更丰富的信息主要是通过环境变量打开功能开关。我在实际部署中常用到这几个DASHDOT_OVERRIDE_NODE_NAME自定义仪表盘顶部显示的节点名称。家里有多台机器的时候这个非常有用不然每台机器都显示默认 hostname看多了容易混。DASHDOT_CONFIG_ENABLE_CPU开启按核心显示的 CPU 使用率。对多核小主机来说能看到每个核心的压力分布排查单核打满的情况会方便很多。DASHDOT_CONFIG_ENABLE_IO开启磁盘读写速率显示。这里需要注意如果容器权限不够磁盘 IO 会一直是 0看起来就像功能没生效实际是读取被限制。DASHDOT_CONFIG_ENABLE_PING开启外网延迟检测。Dashdot 会主动探测外网连通性一旦延迟异常或检测失败仪表盘会明确提示适合观察宽带到公网的链路状况。DASHDOT_CONFIG_IGNORE_OS让 Dashdot 忽略对宿主机操作系统的自动识别。某些定制系统或容器环境里系统识别可能不准确打开这个开关能避免显示错误信息。我通常不会把所有开关都打开。比如单核 CPU 使用率这种对小主机有意义对低配 ARM 设备反而增加无谓的 CPU 开销。我的原则是只看自己关心的指标剩下的一律不开。4.2 温度传感器与硬件信息温度是很多人关心的指标Dashdot 会读取传感器数据并展示在页面上。但温度不会凭空出现需要满足几个条件宿主机本身有可读的温度传感器比如树莓派、大多数 Intel/AMD 台式机都支持部署容器时带了--privileged或者在 compose 里设置了privileged: true部分情况下还需要把宿主机/sys目录挂载进容器供读取。如果你在纯虚拟机里部署比如云服务器那大概率看不到温度因为虚拟化层没有直接暴露传感器。遇到这种情况不用纠结不是 Dashdot 的 bug。4.3 放在导航页里当常驻大屏Dashdot 没有账号体系打开就是页面所以非常适合嵌入到导航页或 Home Assistant 里。最简单的做法是用 iframeiframe srchttp://yourip:3001 stylewidth:100%; height:600px; border:0;/iframeDashdot 本身是响应式布局手机和电脑上都能正常显示。我自己的方案是放在导航页的一个卡片里左边是 Dashdot右边放几个常用服务的快捷链接打开导航页就能顺带看到整机状态不需要再单独开一个标签页。4.4 通过 Nginx 反代访问时的关键配置如果你不想用 IP 加端口的方式访问而是希望挂到已有域名下面可以用 Nginx 反代。这里有一个我必须强调的坑Dashdot 的实时刷新基于 SSE 长连接如果反向代理默认开了缓冲浏览器就会一直收不到更新的数据表现在页面上就是数据转圈加载但永远不刷新。一个能用的反代配置大概长这样location / { proxy_pass http://127.0.0.1:3001; proxy_http_version 1.1; 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_buffering off; proxy_read_timeout 3600s; }关键就是proxy_buffering off一定不能省。另外我建议直接用独立子域名访问 Dashdot而不是在已有域名下加子路径。Dashdot 的前端资源引用是基于根路径的子路径部署容易出现样式和脚本加载不全的问题处理起来比较麻烦。4.5 安全底线不要裸奔到公网前面提到 Dashdot 需要把宿主机根目录以只读方式挂载进容器这一点在提高可用性的同时也扩大了风险面。就算挂载是只读的容器一旦出问题里面的进程仍然可以读取宿主机的文件信息。因此我强烈建议默认只在局域网内访问如果非要外网访问至少在前面加一层 Basic Auth或者用 frp、Tailscale 这类方式收进内网再访问。加 Basic Auth 只需要在 Nginx 里加两行auth_basic Restricted; auth_basic_user_file /etc/nginx/.htpasswd;.htpasswd用htpasswd -c /etc/nginx/.htpasswd user生成即可。别嫌这步麻烦Dashboard 这种页面暴露在外网被扫到了就是给攻击者送信息。5. 实测体验Dashdot 在日常使用中的样子5.1 我实际部署的几台设备我现在有三台机器上都跑了 Dashdot部署方式基本一致一台 N100 小主机当主力服务机一台树莓派 4B 放在弱电箱里跑一些轻量服务还有一台旧笔记本改的 Linux 服务器专门做下载和备份。每台机器的DASHDOT_OVERRIDE_NODE_NAME都设成了不同的名字这样切到导航页的时候一眼就能看出来是哪台机器。实际的 DASHDOT 页面中我会重点看几个区域顶部是节点名称和运行时长下面是 CPU 与内存的实时曲线再往下是磁盘用量、网络速率、系统负载。对小主机来说这些信息足够回答日常运维里 90% 的现在机器状态怎么样的问题了。5.2 资源占用有多低Dashdot 走的是纯前端加 SSE 的模式容器本身不存数据也不跑后台任务资源占用非常低。我在树莓派上跑它几乎感知不到额外负载在 N100 上更是毫无压力。相比之下Netdata 默认开了大量采集器资源占用要明显大得多。如果你拿一台老设备来做监控屏Dashdot 这种轻量特性就是最大的优势。5.3 界面刷新的体验SSE 推送的特点是数据自动更新不用手动刷新页面。放在导航页里如果一直开着标签页就能持续看到实时曲线。不过也要接受一点一旦关掉页面再重新打开之前的历史曲线就没有了只有当时那一刻的数据。这个特性决定了我不会把它当成唯一的监控入口历史趋势和异常回溯还是得靠 Prometheus 这类带存储的方案。6. 常见问题与排查技巧实录6.1 速查表这里把我在踩坑过程中整理的典型问题汇总成了一张表建议收藏备查现象可能原因处理方法浏览器无法访问 3001 端口容器没起来 / 端口映射错误 / 防火墙拦截docker ps和docker logs dashdot查状态确认映射端口放行防火墙对应端口页面能打开但数据全空没有挂载/:/host:ro检查 compose 或 docker run 的 volumes 配置补上挂载并重启磁盘清单显示几十个分区宿主机挂载点太多Dashdot 直接读取真实挂载信息属正常现象可通过只挂载关心的目录规避不影响核心功能温度区域一直空白缺少--privileged、传感器不存在或虚拟机环境补特权模式确认宿主机是否支持硬件传感器通过反代访问页面一直转圈Nginx 缓冲了 SSE 长连接在反代配置加入proxy_buffering off并调大proxy_read_timeout镜像拉取超时或失败ghcr.io 网络不稳定配置镜像加速源或更换网络环境重试更新容器后环境变量丢失手动docker rm -f后重新 run 漏参改用 docker compose 管理统一在 YAML 里维护环境变量提示 Docker socket 权限不足当前用户不在 docker 组sudo usermod -aG docker $USER newgrp docker6.2 绑定挂载的一个安全细节再次强调-v /:/host:ro后面的ro不要去掉。ro表示只读挂载Dashdot 只需要读取宿主机的系统信息不需要写入。一旦把ro去掉变成可写挂载容器内如果出现异常或被恶意利用就有了改写宿主机关键目录的通道。这个风险平时看不出来出问题就是大问题。我一直建议把容器权限用完即止能不加--privileged就先不加能只读就只读。6.3 多盘 NAS 上的显示问题我在群晖和绿联这类 NAS 设备上测试过Dashdot 会把宿主机所有真实挂载点都列出来包括系统分区、数据卷、外部硬盘。如果你觉得列表太乱可以换个思路只把想监控的数据目录挂进容器。比如你只想看家目录和一块数据盘可以把挂载配置改成volumes: - /home:/host/home:ro - /volume1:/host/volume1:ro这样 Dashdot 读取的信息会少一些但页面干净很多。不过要注意完全脱离/挂载会导致部分系统级指标无法读取需要根据你的实际情况权衡。6.4 页面一直不更新的排查顺序如果你遇到仪表盘数据不动的情况排查顺序应该是先确定浏览器直接通过IP:3001访问是否正常如果正常说明问题基本出在反向代理如果直接访问也不刷新再检查容器日志和网络。我自己碰到的大多数不刷新案例最后都落在 Nginx 缓冲上不是 Dashdot 本身的问题。7. 可以继续扩展的方向Dashdot 定位是单机实时仪表盘但你可以把它当成整个家庭实验室里的一环来用。想再多一层保障的话可以搭配 Uptime Kuma 这类外部可用性监控工具对 Dashdot 本身和家里的其他服务做定期探测一旦网站挂了能第一时间通知你。想集中看多台机器就在导航页里并排嵌入多个 Dashdot 实例一个 iframe 一台机器滚动一下就能看完整个机房。如果之后你开始关心历史数据、磁盘增长的长期趋势或者想根据内存占用自动触发清理脚本那 Dashdot 就不够用了该上 Prometheus 加 Grafana 这套组合。只不过那是另一个复杂度等级不必为了这点需求提前上纲上线。最后再分享一个小经验我用 Dashdot 踩过最多的坑其实是更新容器时丢环境变量。后来我把所有服务的 compose 文件都收到了一个目录里集中管理Dashdot、Uptime Kuma、还有其他容器都改成了统一的部署方式。现在不管是更新还是迁移只需要把整个目录拷过去docker compose up -d一把梭省心很多。Dashdot 不算复杂但它是个很好的起点——你从它开始习惯用 compose 管理容器、用环境变量控制配置、用反代统一入口这些习惯会跟着你用到后面所有的服务上。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →