服务入口越装越多?我用Dashlet把极空间整理成了一个导航首页
前言
NAS 用久以后,我发现真正容易乱的不是文件,而是入口。Docker 里装了下载器、代码仓库、监控面板、媒体服务,再加上平时常用的网站,书签越存越多,最后想打开一个服务时,反而要先回忆端口、翻收藏夹或者找以前记下来的地址。
所以我更想要一个很轻的“首页”:不用承担复杂监控,只负责把常用服务和网址整理到一个地方,浏览器打开就能点。Dashlet 正好适合这种思路,它本身支持主题、拖拽、搜索和配置文件导入,部署也比较简单。
这篇我会先在极空间上确认 SSH 和 Docker 环境,再用 Docker Compose 跑起 8989 端口的 Dashlet。随后通过配置文件一次性导入 12 个服务入口,实际看看标题、图标、描述、主题和排序这些基础功能怎么落地。
本地导航页确认可用以后,再处理随机公网地址和固定二级子域名,让其他设备也能打开同一个入口。
对我来说,Dashlet 真正有价值的地方不是“数据大屏”这几个字,而是把越来越散的服务入口重新收拢到一个自己能控制的页面里。
而且这类首页还有个好处:服务本身怎么部署可以继续保持不变,只需要把入口地址整理进配置。以后新增一个容器、改一个端口,也不必重新设计整张页面。

1 Dashlet更适合做“服务入口”,不是重型监控平台
如果 NAS 上只跑一两个服务,记住地址和端口并不难。
但服务一多以后,就很容易变成:
- 一个下载器一个端口;
- 一个媒体服务一个端口;
- 一个监控面板一个端口;
- 再加上 GitHub、Notion、邮件和各种常用网页。
Dashlet 的作用,更像是给这些入口做一个统一首页。
它支持:
- 主题切换;
- 自定义背景;
- 搜索;
- 拖拽排序;
- 配置文件集中管理;
- 自定义 CSS 与 JavaScript;
- 响应式布局。
真正适合这篇实操去验证的,是:
页面能不能跑起来,配置能不能导入,服务入口能不能按照 config.json 显示出来。
2 先通过SSH进入极空间
在极空间中开启 SSH 服务,然后使用终端连接:
ssh root@IP

后面的目录创建、Docker 部署和 cpolar 安装都会从这个环境继续。
3 检查Docker环境
先执行:
docker -v
systemctl status -v

只要 Docker 环境已经正常,就可以继续创建 Dashlet 目录。
4 创建Dashlet目录
执行:
mkdir Dashlet

当前命令只是创建目录。
如果后续要让 Compose 文件、data 目录和配置长期放在固定位置,最好保持整个 Dashlet 目录结构一致。
5 两种Docker启动方式都保留
5.1 docker run
可以直接执行:
docker run -d \
--name dashlet \
--restart unless-stopped \
-p 8989:8989 \
-v $(pwd)/data:/app/public \
ghcr.io/jaberio/dashlet:latest
这条命令里几个关键参数是:
- 容器名:
dashlet - 重启策略:
unless-stopped - 端口:
8989:8989 - 数据映射:
$(pwd)/data:/app/public - 镜像:
ghcr.io/jaberio/dashlet:latest
5.2 Docker Compose
本文使用的是 Compose:
services:
dashlet:
image: ghcr.io/jaberio/dashlet:latest
container_name: dashlet
restart: unless-stopped
ports:
- "8989:8989"
volumes:
- ./data:/app/public

两种方式的端口和目录逻辑是一致的。
容器跑起来以后,浏览器访问:
http://极空间IP:8989
进入 Dashlet 页面:

做到这里,只能确认 Web 服务已经可以访问。
真正的导航内容还需要继续导入配置。
6 Dashlet真正好用的地方在config.json
点击设置,然后找到导入:

进入配置导入页面:

选择对应文件以后,可以看到配置内容:

继续编辑:
编辑后,点击导入配置文件:
Dashlet 的很多设置都可以直接放进配置文件里。
这比每换一台设备都重新手动添加入口更适合长期维护。
7 这份配置一次导入12个服务入口
当前使用的完整配置如下:
{
"settings": {
"theme": "system",
"appTitle": "Dashlet",
"greeting": "Welcome",
"accentColor": "#3b82f6",
"blur": true,
"animations": true,
"openNewTab": true,
"layout": "list",
"wallpaper": "",
"searchProvider": "https://duckduckgo.com/?q=",
"customCSS": "",
"disableDragDrop": false,
"dragDelay": 0,
"searchEnabled": true,
"footerText": "Powered by",
"footerColor": "",
"sortBy": "manual"
},
"services": [
{
"id": "1",
"name": "GitHub",
"description": "Code hosting",
"url": "https://github.com",
"icon": "https://github.githubassets.com/favicons/favicon.png"
},
{
"id": "2",
"name": "YouTube",
"description": "Watch videos",
"url": "https://youtube.com",
"icon": "https://www.youtube.com/s/desktop/10c3d9b4/img/favicon_144x144.png"
},
{
"id": "3",
"name": "Google",
"description": "Search engine",
"url": "https://www.google.com",
"icon": "https://www.google.com/favicon.ico"
},
{
"id": "4",
"name": "Gmail",
"description": "Email service",
"url": "https://mail.google.com",
"icon": "https://ssl.gstatic.com/ui/v1/icons/mail/rfr/gmail.ico"
},
{
"id": "5",
"name": "Notion",
"description": "All-in-one workspace",
"url": "https://notion.so",
"icon": "https://www.notion.so/images/favicon.ico"
},
{
"id": "6",
"name": "Reddit",
"description": "Social news & discussion",
"url": "https://reddit.com",
"icon": "https://www.redditstatic.com/desktop2x/img/favicon/favicon-32x32.png"
},
{
"id": "7",
"name": "Twitter / X",
"description": "Social media",
"url": "https://twitter.com",
"icon": "https://abs.twimg.com/favicons/twitter.3.ico"
},
{
"id": "8",
"name": "Stack Overflow",
"description": "Developer Q&A",
"url": "https://stackoverflow.com",
"icon": "https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico"
},
{
"id": "9",
"name": "Wikipedia",
"description": "Free encyclopedia",
"url": "https://en.wikipedia.org",
"icon": "https://en.wikipedia.org/static/favicon/wikipedia.ico"
},
{
"id": "10",
"name": "Netflix",
"description": "Streaming movies & shows",
"url": "https://netflix.com",
"icon": "https://assets.nflxext.com/us/ffe/siteui/common/icons/nficon2016.ico"
},
{
"id": "11",
"name": "Spotify",
"description": "Music streaming",
"url": "https://open.spotify.com",
"icon": "https://open.scdn.co/cdn/images/favicon32.c6a9e59d8375a83e22c7b79e9b7a3e3d.png"
},
{
"id": "12",
"name": "Weather",
"description": "Check local forecast",
"url": "https://weather.com",
"icon": "https://weather.com/favicon.ico"
}
]
}
这里面除了服务列表,还包含:
themeappTitlegreetingaccentColorbluranimationsopenNewTablayoutwallpapersearchProvidercustomCSSdisableDragDropdragDelaysearchEnabledfooterTextsortBy
导入完成后:

页面会一次出现 12 个网址入口:

包括:
- GitHub
- YouTube
- Gmail
- Notion
- Twitter / X
- Stack Overflow
- Wikipedia
- Netflix
- Spotify
- Weather
这一步真正验证的是:
Dashlet 页面内容可以由配置文件集中驱动。
8 为什么配置驱动比手工加图标更适合NAS
对于自托管环境来说,服务入口会经常变化。
比如:
- 某个端口改了;
- 新增一个 Docker 服务;
- 换了域名;
- 某个入口不再使用;
- 想把工作类和娱乐类重新排序。
如果所有内容都写在 config.json,后续修改和备份会更清楚。
这也是 Dashlet 更适合做“服务导航页”的原因。
它并不要求每个入口本身一定运行在 NAS 上。
你可以同时放:
- NAS 内部服务;
- 公司内部地址;
- 公网网站;
- SaaS 工具;
- 常用搜索和资料站。
9 本地页面够用以后,再处理远程访问
如果 Dashlet 只作为家里的起始页,到这里已经够了。
如果还希望手机、平板或者外面的电脑也能打开,再继续处理公网入口。
这里仍然要区分:
Dashlet 负责导航页面,cpolar 负责网络入口。
10 安装cpolar
执行:
sudo curl https://get.cpolar.sh | sh

安装完成以后检查服务:
sudo systemctl status cpolar

随后通过主机 IP 加:
9200
进入 Web UI:

登录以后继续创建 Dashlet 对应隧道。
11 先用随机公网地址验证
进入隧道管理,创建隧道。
当前参数:
- 隧道名称:
dashlet - 协议:
http - 本地地址:
8989 - 域名类型:随机域名
- 地区:
China Top

创建以后打开在线隧道列表:

复制地址访问:

能够正常打开 Dashlet 页面以后,说明公网入口已经打通。
12 长期使用再切换固定二级子域名
随机地址适合先验证。
如果准备把 Dashlet 当成长期开机首页,再继续配置固定二级子域名。
进入预留:

选择保留二级子域名。
当前示例:
- 地区:
China Top - 子域名:
dashlet

然后回到隧道列表,找到对应隧道并编辑:

修改为:
- 域名类型:二级子域名
- Sub Domain:填写前面保留成功的名称
- 地区:
China Top
更新:

在线隧道列表会显示新的固定地址:

最后通过固定地址访问:

页面能够正常打开以后,固定访问入口就配置完成了。
13 仪表盘公开到公网以后,要区分“入口”和“后端权限”
Dashlet 本身只是把很多服务入口集中到一起。
这意味着它可能会展示:
- NAS 管理页;
- 下载器;
- 监控面板;
- 代码仓库;
- 媒体服务;
- 邮件和第三方网站。
因此公网开放以后,不能因为 Dashlet 页面能访问,就认为后面的每个服务都已经安全。
更合理的做法是:
- Dashlet 只作为导航页;
- 每个后端服务仍使用自己的账号和权限;
- 不需要外网访问的内部服务不要随意暴露;
- 不要在配置里放敏感 Token、密码或管理密钥。
导航页解决的是“找得到”。
真正的访问控制仍然属于各个服务自己。
14 这类轻量导航页真正适合什么场景
我觉得 Dashlet 更适合:
- NAS 上装了很多服务;
- Docker 容器越来越多;
- 经常忘记端口;
- 浏览器书签已经开始失控;
- 希望自己控制首页;
- 想用配置文件统一管理入口。
如果真正需要的是服务器 CPU、内存、网络、日志和告警监控,那应该继续使用专门的监控工具。
Dashlet 在这篇实际操作里,更准确的角色是:
一个轻量、自托管、可以自己配置的服务导航首页。
总结
这次把 Dashlet 跑到极空间以后,我觉得它最实用的地方不是“仪表盘”三个字听起来多高级,而是终于可以把 NAS 和日常使用的各种入口放到同一个页面里。
Docker 只负责把 8989 服务跑起来,真正决定页面长什么样、有哪些入口的,是后面的 config.json。一次导入 12 个服务以后,标题、图标、描述和排序都能集中维护,这比继续往浏览器收藏夹里堆东西更清楚。
远程访问放在最后处理也更合理。Dashlet 负责导航,cpolar 负责网络入口,而每个被导航到的服务仍然要保留自己的登录和权限。
如果家里的 NAS 已经越装越多,我觉得 Dashlet 更像一个轻量的“起始页”:不替代监控、不替代服务本身,只负责让那些已经存在的东西更容易找到。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_42878111/article/details/167681681




