尧图精选

群晖Web Station搭建个人导航站:从零到日常维护全记录

🕒 发布时间:2026/10/2 18:43:22 📁 来源:尧图网络
有阵子我特别烦浏览器书签栏台式机、笔记本、手机三处各存一套加一个新网站要在三个地方重复操作标签一多连自己都找不到。后来认真搭了一个基于群晖Web Station的静态导航站把常用链接全收进一个网页里白天在办公室打开、回家里在局域网打开响应很快文件还牢牢在自己手里。这篇文章完整记录我从零开始的过程——Web Station到底怎么用、写一个够用的导航页、发布到群晖、再排错和日常维护全在这里。适合手里有一台群晖、不想折腾重型建站程序、只想搞一个能自己控制的导航页的朋友。如果你连“导航站”这个概念都不熟也没关系跟着走一遍就明白了。1. 被书签栏折腾够之后导航站到底解决什么问题1.1 浏览器书签的真相收藏了一堆用的时候一个都找不到浏览器书签栏看着方便真用起来问题不少。最典型的是多设备同步台式机、笔记本、手机各登各的账号有的浏览器同步正常有的浏览器一换设备书签直接消失。公司电脑通常不会登你的个人账号书签栏等于不存在临时要找一个常去网站只能现场百度。标签一多更麻烦几百个书签堆在一起既没有有效的分类也没有搜索功能翻半天翻不到最后干脆重新输域名。无痕模式下书签基本不显示这也是一个经常被忽略的点。很多时候你会想临时收藏一个页面结果发现当前是隐私模式书签压根不可用。等切回正常模式那个页面早就忘了。书签栏还有一个天然的物理限制垂直空间就那么多收藏到一定数量以后每个新链接都会吃掉一行空间最后整个浏览器上方全是书签连地址栏都被挤得看不清楚。1.2 在线导航工具看着香但总觉得不是自己的后来我也试过各种在线导航类工具比如网上那些“个人主页”“网址导航”服务。刚用的时候挺新鲜把链接一个个填进去还能换壁纸、换主题。但用久了就发现几个绕不开的问题。第一数据在别人的服务器上。链接列表看起来只是几十条网址但里面其实暴露了你的使用习惯哪些网站天天逛、哪些工具天天用、大概从事什么行业全都能分析出来。有些导航工具还要注册账号、登录使用等于把个人数据主动交出去。第二平台不确定性太大。免费工具说不准哪天就开始加会员、弹广告、强制改版甚至直接停止服务。真到了那一步你积累的几百条分类链接要么手工迁移要么直接作废。这种事我在网上见过不止一次所以越来越倾向于把数据放回自己手里。第三定制程度有限。大部分在线导航允许你改的只有“名字”“图标”“颜色”这类表层东西布局逻辑、页面结构、搜索行为全都按平台的设计走。一旦平台整体改版你只能被迫适应新界面没有讨价还价的余地。1.3 群晖自建导航站的优势自建导航站最核心的价值就一句话数据完全归自己。所有文件都存在群晖硬盘里想备份就备份想导出就导出想删掉重来也只是一条命令的问题。日常使用上局域网内访问导航页不需要经过外部互联网纯走内网带宽打开速度直接是秒开。相比每次加载一个云端导航页还要等图片、等字体、等脚本体验差距非常明显。页面长什么样、有哪些分类、搜索框放哪个位置、要不要显示描述全部由自己控制。想改成极简风格就删掉多余CSS想加一个日期栏就加一行HTML完全不受平台限制。对群晖新手来说这个项目也是绝佳的练手机会。它能让你把套件安装、文件夹权限、端口配置、Web服务器基础概念全部过一遍而且出错也不会影响NAS本身实在不行把站点删掉重来就行。风险极低收获却很实在。2. 动手前先搞懂Web Station不只是一个文件展示器2.1 Web Station的实质网站站点管理器很多人第一次打开Web Station看到界面里的“网页服务门户”“虚拟主机”“PHP设置”几个选项就懵了以为这是个很复杂的套件。其实它的本质是一个图形化的网站站点管理器帮你在群晖上把“一个目录”映射成“一个可访问的网站”。背后工作的其实是Web服务器一般是Nginx或者Apache。Web Station相当于给这些服务器套了一层图形界面你不需要自己去写Nginx配置不需要手动规定端口和目录只需要在界面上点几个按钮选好目录、填好端口、确定类型Web Station就帮你在后台生成对应的站点配置并且自动管理服务进程。理解“文档根目录”这个概念最重要。所谓文档根目录就是这个网站文件所在的文件夹。用户访问你指定的端口时Web服务器就去这个文件夹里找index.html之类的文件然后返回给浏览器。导航站项目里文档根目录就是我们后面要创建的web/navsite目录里面放着页面所需的HTML、CSS、JavaScript文件。2.2 静态网站、PHP网站、反向代理门户到底该选哪个Web Station支持的门户类型不止一种新建站点时经常要选。很多新手在这里纠结我直接列个对比表说明白。类型运行方式典型场景维护成本静态网站Web服务器直接把HTML/CSS/JS文件返回给浏览器不执行脚本导航页、个人介绍页、文档站最低传文件就能跑PHP网站Web服务器先调用PHP解释器执行代码再输出HTMLWordPress、Typecho等博客系统高需要数据库、插件升级、安全补丁反向代理/应用门户站点收到请求后转发给内网里另一个服务端口把NAS上多个服务统一成一个入口中配置思路要清晰导航站显然选第一种静态网站。它没有后端逻辑不需要数据库不需要PHP不需要登录后台只是把写好的页面文件“喂”给访问者。2.3 为什么我坚持导航站用纯静态曾有人问我既然Web Station支持PHP为什么不直接上WordPress再装个导航插件功能更全。我的答案很简单导航站的核心需求是“快”和“省心”纯静态在这两点上碾压一切动态方案。安全方面静态站没有数据库、没有表单提交、没有用户登录接口常见的SQL注入、后台爆破、插件漏洞这些攻击手段基本无处施展。就算站点目录被人拿到了里面也只有无法执行的静态文件搞不出大动静。性能方面Nginx返回静态文件的速度极快几毫秒就能完成一次请求。局域网里访问几十个链接的导航页体感就是瞬时加载不需要等PHP进程跑起来更不需要等数据库查询返回。维护方面改一个链接只需要改data.js文件里的一个数组项传上去刷新页面就完事比进WordPress后台一层层点菜单高效得多。3. 正式开工套件安装与目录规划3.1 装好Web Station和它的小伙伴打开群晖的套件中心搜索“Web Station”点击安装。DSM 7版本安装Web Station时一般会自动把Web Server、PHP等依赖组件一起装好你不需要额外去搜索安装。如果你和我一样只跑静态站不需要写任何PHP代码但依赖组件已经装上了就让它们待着别去手动卸载否则Web Station本身也可能出问题。安装过程通常几十秒到几分钟取决于NAS的型号和网络状况。装完以后套件中心里Web Station显示“已安装”打开它就能看到主界面。主界面上有“概览”“脚本语言”“网页服务门户”“虚拟主机”等几个分区我们主要用的是“网页服务门户”。3.2 目录规划别把文件塞进系统根目录在File Station里先规划一个清晰的目录结构。我的习惯是创建一个共享文件夹web专门存放所有网站类项目然后在web下面再建站点目录。比如导航站就放在web/navsite以后如果还想做第二个站点比如工具箱、状态页可以在web下面再建tools、status互不干扰。之所以不把文件直接扔到群晖的系统默认目录里是因为站点目录必须能独立授权、独立备份、独立管理。共享文件夹web本身有权限控制后续给Web Station的http用户开权限时只针对这一个共享文件夹操作不会误伤系统其他目录。而且共享文件夹更适合通过同步工具备份万一硬盘出问题整个web目录都能恢复。创建完共享文件夹后记得在web下面新建navsite子目录。这个目录就是之后Web Station站点的文档根目录导航页的所有文件都会放在这里。3.3 把项目文件传进群晖的三种方式文件准备好了怎么传到群晖最直接的方法是打开File Station进入web/navsite目录把文件拖拽上传适合一次性传完整个项目。我日常维护更推荐用SMB协议映射网络驱动器。在Windows资源管理器地址栏输入\\NAS的IP\web输入群晖账号密码后这个目录会像一个本地硬盘一样显示在电脑上。然后用任何你喜欢的编辑器直接打开data.js修改保存后它就是完成了上传省去了每次打开网页后台拖文件的步骤。如果你日常编辑频率更高还可以装群晖Synology Drive套件把web文件夹指定为同步文件夹。这样本地改完文件后后台自动同步到NAS体验接近网盘客户端。不过对导航站这种轻量项目来说SMB已经足够Drive属于可选项。4. 手写导航页三件套数据、渲染、样式各司其职4.1 为什么推荐数据与页面分离写导航页最容易犯的错是把链接数据直接硬编码在HTML里。今天加一个链接要改HTML明天调个描述还要改HTML改的时候一不留神就会破坏标签结构页面直接乱掉。我采用的思路是把数据抽出来单独放一个文件data.js负责存所有导航链接index.html只负责页面骨架app.js负责把数据渲染到页面上style.css负责外观。这样日常维护只需要打开data.js在数组里加一行对象保存、刷新完成。页面逻辑基本不需要碰。这其实就是最简单的数据与视图分离。对一个人维护的导航站来说这套结构已经足够清晰不需要引入任何框架。4.2 数据文件data.js怎么写data.js的内容是一个数组每个数组元素代表一个分类分类里包含若干链接。每个链接有四个字段name显示名称desc描述文字url跳转地址color是图标背景色。const SITE_DATA [ { category: 搜索与工具, links: [ { name: 百度, desc: 综合搜索, url: https://www.baidu.com, color: #4e6ef2 }, { name: 必应, desc: 搜索与资讯, url: https://www.bing.com, color: #008373 }, { name: DeepL翻译, desc: 文本与文档翻译, url: https://www.deepl.com/translator, color: #0f2b46 } ] }, { category: NAS内服务, links: [ { name: 群晖DSM, desc: NAS管理后台, url: http://192.168.1.100:5000, color: #2d7d9a }, { name: 路由器后台, desc: 网关设置与设备管理, url: http://192.168.1.1, color: #e37400 } ] } ];注意把示例IP换成自己群晖和路由器的实际地址。分类可以根据自己的习惯随便加比如“影音娱乐”“文档办公”“常用工具”每个分类下放对应的链接就行。我的习惯是保持每个分类的链接数量控制在十条以内太多了翻起来也累。4.3 页面骨架index.html与样式style.cssindex.html只负责基础结构顶部一个标题一个搜索框下面一个容器留给JavaScript渲染链接列表。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title我的导航站/title link relstylesheet hrefstyle.css /head body main classcontainer header classhero h1我的导航站/h1 input typesearch idsearchInput placeholder搜索网站名称、描述或分类... /header div idlinks/div /main script srcdata.js/script script srcapp.js/script /body /htmlstyle.css负责外观我没有用任何在线图标库和在线依赖所有图标都是文字首字母加背景色生成的圆角方块。这样即使NAS完全处于内网断网状态导航页也能正常显示不会出现图标加载不出来的情况。:root { --bg: #f5f6f8; --card-bg: #ffffff; --text: #333333; } * { box-sizing: border-box; } body { margin: 0; background: var(--bg); color: var(--text); font-family: PingFang SC, Microsoft YaHei, sans-serif; } .container { max-width: 960px; margin: 0 auto; padding: 24px 16px 48px; } .hero { text-align: center; margin-bottom: 28px; } .hero h1 { font-size: 28px; margin-bottom: 16px; } #searchInput { width: 100%; max-width: 520px; padding: 12px 16px; font-size: 16px; border: 1px solid #dcdcdc; border-radius: 8px; outline: none; } #searchInput:focus { border-color: #5c6bc0; box-shadow: 0 0 0 3px rgba(92,107,192,0.12); } .group { margin-bottom: 28px; } .group h2 { font-size: 20px; border-left: 4px solid #5c6bc0; padding-left: 10px; margin-bottom: 14px; } .cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; } .card { display: flex; align-items: center; gap: 12px; background: var(--card-bg); padding: 14px; border-radius: 10px; text-decoration: none; color: inherit; border: 1px solid #e8e8e8; transition: box-shadow 0.2s ease; } .card:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.08); } .icon { width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: 8px; color: #ffffff; font-weight: 600; flex-shrink: 0; } .info { display: flex; flex-direction: column; overflow: hidden; } .name { font-weight: 600; } .desc { font-size: 13px; color: #888888; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; } .empty { text-align: center; color: #999999; padding: 40px 0; }4.4 渲染与搜索逻辑app.jsapp.js是核心逻辑做两件事把SITE_DATA里的数据渲染成链接卡片并监听搜索框输入实时过滤显示匹配的链接。(function () { const container document.getElementById(links); const searchInput document.getElementById(searchInput); function filterData(keyword) { if (!keyword) return SITE_DATA; const kw keyword.trim().toLowerCase(); return SITE_DATA.map(group { const matchedLinks group.links.filter(link { return [link.name, link.desc, link.url, group.category] .join( ) .toLowerCase() .indexOf(kw) -1; }); return { category: group.category, links: matchedLinks }; }).filter(group group.links.length 0); } function render(keyword) { const groups filterData(keyword); if (groups.length 0) { container.innerHTML div classempty没有匹配的链接/div; return; } container.innerHTML groups.map(group { const linkCards group.links.map(link { return a classcard href${link.url} target_blank relnoopener noreferrer span classicon stylebackground: ${link.color || #5c6bc0}${link.name.charAt(0)}/span span classinfo span classname${link.name}/span span classdesc${link.desc || }/span /span /a; }).join(); return section classgroup h2${group.category}/h2 div classcards${linkCards}/div /section; }).join(); } searchInput.addEventListener(input, function () { render(this.value); }); render(); })();搜索功能实现得比较直接把搜索关键词和每个链接的名称、描述、URL、分类拼接成一段文本再判断是否包含关键词。因为导航站数据是自己维护的数量通常不大这种全量过滤的性能完全够用没必要引入索引之类的高级方案。渲染函数里用relnoopener noreferrer是安全习惯避免新打开的页面通过window.opener反向操控导航页。4.5 本地预览与关键细节这四个文件放在同一个目录里双击index.html就能在浏览器本地预览。因为用的是JS数组渲染而不是fetch外部JSON文件不存在本地文件协议下的跨域限制所以你在NAS上传之前就能先确认效果。这里有个设计上的取舍为什么数据不用JSON文件而用JS文件如果用data.json那么app.js需要通过fetch(data.json)读取本地双击HTML时file://协议下fetch会被浏览器拦截必须起一个HTTP服务才能预览。而把数据写成const SITE_DATA [...]浏览器加载普通script标签就能拿到数据既能本地预览又能在群晖上访问还允许在数据文件里写注释比JSON更灵活。5. 发布到Web Station从一堆文件变成能访问的网站5.1 在Web Station里新建站点文件已经传到了web/navsite接下来就是把Web Station指向这个目录让它变成一个可访问的站点。打开Web Station进入“网页服务门户”分区点击“新增”。不同DSM版本的界面可能有细微差异有的叫“新建站点”有的叫“创建门户”但核心流程是一致的选择服务门户类型填写名称指定文档根目录设置端口。我的配置如下配置项填写内容门户名称navsite门户类型基于端口文档根目录web/navsiteHTTP端口8082HTTPS端口留空保存之后Web Station会自动生成站点配置。如果一切正常站点列表里就会出现一个名为navsite的条目状态显示在线。5.2 端口怎么选别撞车端口选择是新手最容易踩坑的地方。群晖默认占用了不少端口DSM管理页面是5000和5001Web Station预置站点通常会占用80和443还有各种套件各自占用不同端口。如果你选的端口已经被某个套件占用保存时会提示端口冲突站点无法创建。我的建议是避开系统常用端口在8000到9000之间选一个不常见的端口比如8082、8088、8090都可以。这样做还有个附带好处端口不容易被大范围的扫描脚本撞上降低被随意访问的概率。虽然内网环境风险较低但习惯还是好一点更踏实。5.3 首次访问体验站点创建成功后在浏览器地址栏输入http://NAS的IP:8082比如http://192.168.1.100:8082就能看到导航页。同一局域网里的手机、平板、其他电脑只要连的是同一个网络用同样的IP和端口就能直接打开不需要安装任何客户端。我第一次部署完访问时确实有点兴奋一个普通文件夹里的几个文件通过Web Station一配置就变成了所有局域网设备都能访问的网页。这个体验很直观地解释了“Web服务器到底在做什么”。如果你不想记IP加端口也可以改成“基于名称”的门户类型但需要你有一个域名并把域名解析指向群晖。内网使用场景下基于端口的方式最简单可靠。5.4 外网访问的两种常见打开方式如果只在家里局域网用上述步骤已经足够。如果你希望出门在外也能打开导航站群晖提供了官方方案QuickConnect。在Web Station创建门户时或DSM的QuickConnect设置里可以把这个站点绑定到一个外网可访问的地址官方会帮你处理中间环节跟着向导填就行。如果你有自己的域名也可以走DDNS方案在群晖里配置动态域名解析让域名始终指向你家的公网IP再在路由器上把对应端口转发给NAS。这部分官方文档已经写得很详细每家路由器界面又不一样我就不在这里重复造轮子了。我的建议是没有强需求就先做好内网使用外网访问等有明确需要了再研究。6. 部署路上的真实踩坑403、端口占用、改了不刷新6.1 403 Forbidden最有可能是权限问题部署过程中最常遇到的错误是403 Forbidden页面完全无法打开感觉像文件不存在一样。我第一次遇到时排查了很久最后发现根本不是代码问题而是群晖文件权限没给够。Web Station里运行的网站默认使用的系统用户是http和你的管理员账号不是同一个身份。如果你把文件上传到web目录后没有给http用户开放读取权限Web服务器就没有资格去读取这些文件自然返回403。解决方法在File Station里右键web共享文件夹选择“属性”-“权限”点“新增”添加http用户并把权限设为“读取”。如果子目录和文件权限有问题就勾选“应用到所有子文件夹和文件”。改完以后刷新页面问题基本都能解决。6.2 找不到首页文件必须是index.html另一个常见问题是页面能打开但返回404或者直接显示文件目录列表。大部分Web服务器的默认首页文件名是index.html注意是小写。如果你把文件命名成Index.html、index.htm或者home.htmlWeb服务器不一定能识别。建站时一定要确认navsite目录下存在index.html这个文件其他几个文件名称大小写也尽量保持一致。HTML里引用的style.css、app.js、data.js实际文件名也必须完全一致Linux文件系统大小写敏感Style.css和style.css是两个文件。6.3 端口冲突导致站点启动失败新建站点时如果保存失败提示端口被占用说明你选的端口已经在被其他套件或站点使用。这种情况改掉端口重新保存就行不需要做其他排查。如果是已经运行过的站点突然打不开可以看看是否安装了新的套件把端口抢走了。少量套件在安装或更新时确实可能占用到范围内的随机端口。解决办法还是换端口优先选择8000段里不常见的数字。6.4 改了data.js页面却不更新浏览器缓存惹的祸明明在本地把data.js里的新链接加好了传到NAS以后打开导航页却还是老样子。这种情况大概率是浏览器缓存。静态站没有动态生成内容浏览器为了提高性能会把js、css这类资源缓存下来。简单粗暴的方式是按CtrlF5强制刷新或者打开开发者工具勾选“Disable cache”再刷新。更规范的做法是给脚本标签加版本号每次更新后改一下版本号浏览器就会当它是一个新文件。你可以把app.js?v20250101写成这样来强制浏览器重新加载。这是静态站日常维护中很实用的小技巧。6.5 一个让我白屏二十次的低级错误多余逗号JavaScript对语法错误的容忍度其实很低数据文件里一个多余逗号就可能导致整个SITE_DATA没有被定义导航页白屏。最典型的场景是const SITE_DATA [ { category: 工具, links: [ { name: 百度, url: https://www.baidu.com }, { name: 必应, url: https://www.bing.com }, // 这行末尾多了逗号也没事 ] // 这里数组末尾多了逗号在某些浏览器里就会报错 } ];不同浏览器对“尾随逗号”的容忍度不一样看起来在本地测试没问题换到另一台设备就白屏。最稳妥的做法是编辑器里装一个语法检查插件保存之前先看有没有红色波浪线。VS Code默认就会对JS文件做语法高亮错误一目了然。顺便说一下这也是我坚持用JS数组而不是JSON文件的原因之一。JSON对格式要求更严格注释都不允许写改起来压力大很多。7. 把导航站变成日常工具维护习惯与扩展方向7.1 新增一条链接的标准流程导航站用得越久链接越丰富维护效率就越重要。我现在新增一条链接的流程是在电脑上打开映射好的web网络驱动器用VS Code打开data.js找到对应的分类在links数组里加一行保存然后刷新浏览器。举个例子想加一个“团队知识库”的入口{ name: 团队知识库, desc: 内部文档与协作, url: http://192.168.1.50:8888, color: #3f51b5 }整个操作用时不到十秒。如果是晚上躺在沙发上用手机想记录一个链接我一般会在群晖的File Station里用内置文本编辑器打开data.js同样能完成修改。File Station的编辑器虽然功能没有本地编辑器强但应急改数据完全够用。7.2 不加HTTPS会被拦吗内网环境怎么处理纯内网访问用HTTP协议没有问题大多数设备不会拦截。但如果你通过域名在外网访问导航站现代浏览器会对没有HTTPS的页面给出“不安全”的警告地址栏总是有一个黄色感叹号观感不好。群晖对HTTPS的支持其实很完善。你只需要在“控制面板”-“证书”里新增一张Lets Encrypt证书前提是你有一个域名并完成了DDNS配置。证书申请成功后在Web Station对应的站点上绑定这张证书群晖会自动处理续期不需要你每三个月手动操作一次。如果只在局域网里用跳过这段完全没问题。7.3 从导航站延伸顺手做一个内网服务总入口导航站做好以后我的第一个扩展思路是把所有内网服务都收进去。除了群晖DSM和路由器后台还有打印机管理页、智能家居网关、软路由控制台、NAS上各种套件的管理入口全都可以在导航站里放一个卡片。这样我就不用记那么多IP和端口只要打开导航站点一下就进去了。更进一步你可以写一个探活脚本定时用HTTP请求检测这些内网服务的端口是否连通把结果渲染到导航页上。某个服务挂了卡片上就会显示离线状态。这个功能其实很有用因为内网服务太多以后经常会出现某个套件悄悄停止却没人发现的情况。不过这一部分属于进阶玩法等基础导航站稳定跑上一阵子再折腾也不迟。7.4 我的使用习惯与最后建议我现在把导航站同时设为电脑浏览器的主页和手机浏览器的书签每天早上打开浏览器第一眼看到的就是整整齐齐的分类链接几秒就能跳到想去的站点。相比以前在书签栏里找半天效率提升非常明显。有个很实在的建议导航站里不要放任何私密链接比如NAS的敏感目录、带密码的后台地址。静态站的所有文件对所有访问者都是公开的只要对方知道地址就能看到页面里的全部内容。虽然局域网相对可信但这个习惯最好一开始就养成避免哪天不小心把内网端口暴露了却不自知。再补充一个小习惯我会定期把web/navsite整个目录打个包备份到另一个存储空间。文件不大但里面存的是我筛选过一轮的常用链接丢了重新整理很费时间。备份一次后面就再也不用操心了。这个导航站在我的群晖上已经安安稳稳跑了一两年期间几乎没有需要我操心的时候。它不需要更新、不需要维护数据库、不需要担心后台被入侵偶尔加两条链接就够了。对我这种“只想用一个顺手的工具不想伺候一个复杂系统”的人来说它就是最合适的方案。如果你也被浏览器书签折磨过照着这篇文章搭一个应该能满足你对自建导航站的大部分期待。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →