ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用Docker部署DashMachine:打造自托管服务的统一访问仪表板

用Docker部署DashMachine:打造自托管服务的统一访问仪表板 从手里同时管着几台服务器、一台NAS、几个Docker主机那一刻起我就开始琢磨一件事这些东西的后台地址实在太多了。Portainer一个地址、Grafana一个地址、路由器一个地址、NAS管理页又一个地址浏览器书签栏塞得密密麻麻每次找入口都要想半天。后来接触到了DashMachine再用Docker把它部署起来这个问题算是彻底解决了。这篇文章就围绕“Docker部署DashMachine仪表板”这件事展开把从环境准备、镜像选择、目录规划、配置文件编写到反向代理、健康检查、日常备份和故障排查的完整过程都梳理一遍。适合手里有服务器或者NAS、希望把各类自托管服务统一管理的人参考也适合刚接触Docker、想拿一个不算复杂的项目练手的新手。1. 为什么用Docker部署DashMachine而不是直接装1.1 DashMachine是什么解决什么问题DashMachine是一个基于Python Flask开发的自托管仪表板应用它的核心功能很纯粹把一堆散落在不同IP、不同端口、不同协议下的Web服务用卡片、图标、分组的方式集中展示在一个页面上。你可以把Portainer、Grafana、Jellyfin、qbittorrent、路由器后台、NAS管理界面全部收进去点一下图标就能跳转。和同类产品相比DashMachine有几个很吸引人的地方。首先是界面风格它默认带一个类似macOS Dock的底部导航栏加上自适应网格布局在大屏上看起来非常整齐。其次是配置方式不需要数据库管理界面本质上就是两个YAML配置文件改一改、重启一下服务就生效。再加上它自带健康检查功能可以定时探测每个应用的可用性哪个服务挂了仪表板上直接显示红色状态。1.2 容器化部署的四个优势DashMachine本身可以用Python的pip直接安装也提供systemd方式托管但我更推荐Docker部署。原因也简单第一是环境隔离它依赖的Python包、Flask版本全部被锁在镜像里不会跟宿主机上其他Python环境打架。第二是迁移方便。换服务器的时候不用重新折腾一遍Python环境和依赖只要把Docker镜像拉下来再把配置目录挂载过去前后不到十分钟就能恢复整个仪表板。第三是升级回滚简单。镜像更新以后旧容器可以直接停掉新容器几秒钟就能启动要是新版本出问题用旧镜像再起一个就行。第四点是资源占用可控。DashMachine本身非常轻量容器跑起来内存占用一般在一百兆上下CPU基本可以忽略不计放在一台低配NAS或者云服务器上毫无压力。2. 部署前的环境准备与方案选型2.1 Docker环境安装要点既然要聊Docker部署先把Docker本身装好。不同平台的安装方式不一样我按自己的经验分别说一下。Linux服务器上最常见的发行版是Ubuntu和Debian。Ubuntu上安装Docker Engine一般就是先更新索引然后通过apt安装docker-ce、docker-ce-cli、containerd.io这几个包再把当前用户加进docker用户组这样执行docker命令就不需要每次都加sudo了。Windows平台上建议直接用Docker Desktop。装好以后需要在Settings里确认WSL2后端已经启用如果机器开启了Hyper-V也可以选择Hyper-V后端。这里有个经常踩的坑BIOS里没开虚拟化的话Docker Desktop启动时会直接报错提示Virtualization support not detected解决办法是进BIOS打开Intel VT-x或者AMD-V。macOS用户同样用Docker DesktopApple Silicon芯片的机器建议选择arm64版本的镜像这一点后面拉取DashMachine镜像时要注意。2.2 镜像选型与加速配置DashMachine在Docker Hub上的官方镜像名是mtol/dashmachine我平时拉取都用这个镜像。tag方面latest会跟随最新版本更新如果你追求稳定也可以锁定一个具体的版本号避免某次升级带来不兼容的改动。这里必须说一个国内常见的痛点——镜像拉取慢。如果不做任何配置直接docker pull一个稍微大点的镜像经常等几分钟甚至超时。解决办法是给Docker配置镜像加速器。在Linux上编辑/etc/docker/daemon.json加入registry-mirrors配置项Windows和macOS则在Docker Desktop的Docker Engine配置里改同样的内容。改完以后重启Docker服务再拉镜像速度会明显改善。2.3 Docker Run与Compose的选择部署一个容器有两种方式docker run一长串命令或者写一个docker-compose.yml文件然后用docker compose up -d启动。对于DashMachine这种配置项不算太离谱的应用两种方式都能跑通但我强烈建议用Compose。原因很实际docker run的命令行参数一旦写错要排错就得从一大串命令里慢慢找而Compose文件是结构化的YAML端口、环境变量、卷挂载分得清清楚楚后期维护、拷贝到别的机器、版本管理都方便得多。下面会重点讲Compose方式的完整配置docker run的方式在[章节3.2]里会给一个等价命令作为参考。3. 核心部署操作与关键配置解析3.1 目录规划与挂载逻辑先想清楚一个概念容器是“一次性”的容器内部的文件系统在容器删除以后就没了。所以一切需要长期保存的数据都必须通过Volume或者bind mount映射到宿主机上。DashMachine容器里需要持久化的主要是两块一个是配置目录一个是数据库目录。我的建议是单独建一个dashmachine的根目录下面分config和data两个子目录。这样做的好处是以后备份的时候只需要打包这一个目录升级容器也不会丢任何东西。我本机的目录结构大概是这样的/srv/dashmachine/ ├── config/ └── data/config目录用来放settings.conf和applications.ymldata目录放SQLite数据库文件。挂载的时候把这两个子目录分别映射进容器对应路径即可。3.2 docker-compose.yml完整示例下面给一份我实测可用的docker-compose.yml照着用就行version: 3.9 services: dashmachine: image: mtol/dashmachine:latest container_name: dashmachine restart: unless-stopped ports: - 5000:5000 environment: - USER_USERNAMEadmin - USER_PASSWORD请改成强密码 - SECRET_KEY请改成随机字符串 - LISTEN_PORT5000 volumes: - /srv/dashmachine/config:/dashmachine/dashmachine/config - /srv/dashmachine/data:/dashmachine/dashmachine/data注意几个关键点restart: unless-stopped 保证服务器重启后容器能自动拉起。端口映射默认是5000:5000如果宿主机5000端口被占用了可以改成比如7000:5000。USER_USERNAME和USER_PASSWORD是首次初始化时创建的管理员账号SECRET_KEY用于会话加密一定不要用默认值。如果你就想用docker run等价命令是docker run -d \ --name dashmachine \ --restart unless-stopped \ -p 5000:5000 \ -e USER_USERNAMEadmin \ -e USER_PASSWORD你的密码 \ -e SECRET_KEY随机字符串 \ -v /srv/dashmachine/config:/dashmachine/dashmachine/config \ -v /srv/dashmachine/data:/dashmachine/dashmachine/data \ mtol/dashmachine:latest3.3 主配置项解析首次启动容器后DashMachine会在挂载的config目录下自动生成两个核心配置文件一个是主配置文件settings.conf另一个是应用配置文件applications.yml。settings.conf里比较关键的是下面这些配置项[general] instance_name My Dash theme dark user_themes true [security] secret_key 与环境变量保持一致 allow_registration false [network] local_host 0.0.0.0 local_port 5000 [database] database_dir /dashmachine/dashmachine/datainstance_name会显示在浏览器标签页和页面标题上。theme支持dark、light两个内置主题如果你允许用户自己切换主题就把user_themes设为true。allow_registration建议保持false避免别人随便注册账号。database_dir指向的就是我们挂载的data目录SQLite数据库文件会存在这里。3.4 applications.yml应用清单配置这个文件是DashMachine的核心决定仪表板上显示哪些应用。下面是一个我实际在用的例子--- categories: - name: 服务器 icon: mdi:server - name: 影音娱乐 icon: mdi:movie-open applications: - name: Portainer url: https://192.168.1.10:9443 icon: https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/portainer.png categories: - 服务器 health_check: true - name: Grafana url: https://192.168.1.10:3000 icon: https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/grafana.png categories: - 服务器 health_check: true - name: Jellyfin url: http://192.168.1.20:8096 icon: https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/jellyfin.png categories: - 影音娱乐 health_check: truecategories定义分组applications定义应用。每个应用的name是显示名称url是跳转目标icon填图标地址categories决定归属哪个分组health_check设成true就启用健康检查。图标方面有一个很实用的开源项目叫dashboard-icons里面有上百个常见服务的图标直接用CDN地址填入icon字段就行省去自己找图标的功夫。4. 首次启动、用户认证与页面配置实操4.1 启动容器与日志验证配置文件都准备好了就可以启动容器docker compose up -d第一次启动会先拉取镜像如果前面配置了加速器这个过程会很快。启动完成后可以查看容器状态和日志docker ps docker logs -f dashmachine看到日志里出现类似Listening on 0.0.0.0:5000这样的输出说明容器已经正常启动。浏览器访问http://服务器IP:5000就会出现DashMachine的登录界面。这里要提醒一句如果页面一直转圈或者白屏不要急着怀疑配置先看日志大部分问题在日志里都能找到线索。4.2 创建管理员账号与认证配置首次启动时会通过环境变量USER_USERNAME和USER_PASSWORD自动创建管理员账号。登录进去以后可以在右上角或者设置页面里看到当前用户信息。DashMachine的认证体系支持两种方式。第一种是本地账号就是刚才创建的这个管理员简单直接适合内网使用。第二种是OAuth认证可以在DashMachine的GitHub文档里找到详细配置方法需要填Client ID、Client Secret等参数。如果只是自己家里或者小团队内部用本地账号已经足够如果要暴露到公网建议至少开启OAuth或者用下游反向代理做一层外部认证。4.3 添加应用、分组与图标添加应用有两种方式。一种是在页面上直接操作登录后界面里会有一个加号或者编辑模式入口点进去可以添加应用和分组。另一种是直接编辑applications.yml改完以后重启容器或者触发配置热加载。我个人的习惯是直接用YAML文件维护应用清单。原因很简单——应用数量一多用页面表单一个个填写效率太低而且YAML文件可以用文本编辑器批量修改、批量注释还能放进Git仓库做版本管理。实际操作中需要注意的地方是图标。图标URL一定要是DashMachine容器能够访问到的地址如果你用的是内网图标服务要确保容器网络能通。另外图标尽量用PNG或者SVG格式有些ICO格式在部分浏览器下显示会很小或者不清晰。4.4 主题定制与界面逻辑DashMachine界面的一个特色就是Dock栏默认会固定在页面底部或者侧边上面排布着各个分组的入口中间是主内容区的应用卡片网格。卡片会显示图标、名称、健康状态还有一个搜索框可以快速过滤应用。主题方面settings.conf里的theme可以设置全局默认主题允许用户主题切换的情况下每个用户可以单独选择自己的偏好。如果你对配色有更高要求DashMachine也支持自定义CSS可以通过配置项指向一个自定义样式文件。我自己的经验是先把应用分组想清楚再动手填配置。我的分组逻辑是服务器管理、监控告警、影音娱乐、下载工具、智能家居这样分类既符合使用场景Dock栏上也不会显得杂乱。5. 反向代理与内外网访问衔接5.1 用Nginx做反向代理DashMachine默认监听5000端口内网访问没问题。但如果你想通过一个统一的域名访问所有服务比如dash.example.com就需要在Nginx里配置反向代理。下面是一段实际可用的Nginx配置放在/etc/nginx/conf.d/dashmachine.conf里server { listen 80; server_name dash.example.com; location / { proxy_pass http://127.0.0.1:5000; 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_set_header X-Forwarded-Proto $scheme; } }配置好以后执行nginx -t检查语法再nginx -s reload重载配置。如果有现成的HTTPS证书可以在同文件里加上SSL相关配置或者像我一样用Caddy它会自动申请和续期证书省去一堆麻烦。5.2 健康检查与监控运维DashMachine的健康检查功能是我最喜欢的一个特性。启用以后它会定期去请求应用的URL如果返回状态码不是200卡片上就会显示异常状态一眼就能看出哪个服务出了问题。健康检查的频率可以在配置里调整默认是60秒一次我觉得这个间隔在大部分场景下够用。有一点必须说明健康检查只能检查到“应用是否响应”不能判断“应用功能是否正常”。比如某个服务首页能访问但数据库连接断了健康检查可能依然是绿的。所以它更适合做通断监测而不是全面的业务监控。5.3 备份升级与数据迁移DashMachine的备份非常简单只需要备份config和data两个目录。因为配置和数据库全都在里面打包完就是一个完整的备份不存在什么隐藏数据文件。我一般这样操作cd /srv tar czf dashmachine-backup-$(date %F).tar.gz dashmachine/升级镜像就更简单了docker compose pull docker compose up -dCompose会自动把新镜像拉下来重建容器。升级前建议先备份万一新版本配置格式有变化随时可以回滚。我之前就遇到过升级后配置文件语法兼容性问题还好有备份一分钟就恢复了旧版本。6. 常见问题与排查技巧实录6.1 镜像拉取慢或者超时这是我在国内环境中遇到最多的一个问题。首选方案是配置镜像加速器前面已经提过。如果你用的服务器本身到Docker Hub的网络就很差除了加速器之外还可以考虑换一个时间点再拉避开晚高峰时段。6.2 应用链接打不开界面显示异常这里有一个非常经典的坑容器内部访问宿主机服务时localhost是容器自己不是宿主机。如果在DashMachine里添加应用时填了http://localhost:8080这样的地址点击跳转后打开的是你自己电脑的8080端口肯定访问不对。正确做法是填宿主机在内网的IP地址比如http://192.168.1.10:8080。如果浏览器所在设备和DashMachine在同一局域网也可以填服务器IP加端口。总之搞清楚每一层网络环境这个坑就避开了。6.3 重启后配置丢失如果发现容器重启以后之前配置的应用都没了十有八九是卷挂载没配置对。确认一下docker-compose.yml里的volumes配置是否指向了宿主机的持久化目录再看看容器内的路径是不是/dashmachine/dashmachine/config和/dashmachine/dashmachine/data。另外一个容易忽略的点是如果你改了docker-compose.yml里的卷配置必须docker compose down再docker compose up -d才能生效只靠docker compose restart是没用的。6.4 页面500错误或者数据库报错出现这种情况先去容器日志里看具体报错信息。常见原因有三个config目录没有写入权限、SECRET_KEY未设置、配置文件格式不对。YAML文件的缩进非常敏感一个空格错误都可能导致解析失败。如果确认配置没问题但页面还是500可以试试把data目录下的SQLite文件备份后删掉让DashMachine重新初始化数据库然后再恢复配置。这个方法能解决大部分由数据库异常导致的启动失败不过操作前一定记得备份。6.5 健康检查一直显示异常如果应用明明能访问但健康检查一直报红先确认应用返回的是不是200状态码。有些应用会对健康检查请求返回401未授权DashMachine就会认为它挂了。解决办法是查看应用的文档找到它专门用于健康检查的URL路径。另外如果应用是HTTPS且使用了自签名证书DashMachine的检查请求可能会因为证书校验失败而认为服务不可用。这种情况下可以考虑在应用侧关闭健康检查或者调整DashMachine的检查策略。6.6 容器日志使用技巧排查问题最直接的手段就是看日志。我的习惯是先用docker logs --tail 100 dashmachine看最近100行日志再结合错误关键字去查。如果日志刷新太快可以用grep过滤docker logs dashmachine 21 | grep -i error | tail -20容器日志会持续增长时间长了会占磁盘空间。可以在docker-compose.yml里给服务加上logging配置限制日志最大大小和数量避免日志把磁盘吃满。我个人对这个项目的评价是轻量、实用、部署门槛低尤其适合已经把大量服务容器化的人。它不追求大而全也不会给你塞一堆用不上的功能就是把“统一入口”这一件事做到位。自从部署了DashMachine我浏览器书签栏干净了不少平时访问服务也基本不用再记端口号了。如果你正在找这样一款自托管仪表板拿这个项目练手很值。
返回列表