2026/10/11 18:55:13

用 Docker 部署 Jump 个人仪表盘:从零搭建专属导航页

用 Docker 部署 Jump 个人仪表盘:从零搭建专属导航页 开头部分引导语最近总有朋友问我浏览器书签栏堆了几百条链接换台电脑就全乱了到底怎么打理才省心。我的建议一直很明确别再跟书签栏较劲了自己搭一个专属导航页。市面上这类项目不少挑来挑去我最后留下的是 Jump 个人仪表盘——界面干净、配置直观而且官方就直接提供了 Docker 化的部署方式从零开始到真正能用比你想象中快得多。这篇教程就是把我实际部署 Jump 的完整过程、关键配置和踩过的坑都记录下来适合手里有 NAS、云服务器或者闲置小主机又想折腾一个顺手导航页的人。哪怕你之前没碰过 Docker按着步骤往下走也能把专属导航页跑起来。不过我得先说清楚导航页这种东西功能贵在克制能在首页一键到达想去的网站就够了别一上来就塞几十个组件。1. 为什么自托管导航页值得折腾以及我为什么选中 Jump1.1 你的书签栏到底垮在哪了浏览器自带的书签功能十年前用是够用的现在真的顶不住了。我自己就是活例子工作资料、常用工具、娱乐站点、偶尔看一次的教程页面全堆在书签栏里时间一长连分类都懒得分完全变成一个“往里扔但不往外找”的仓库。更麻烦的是跨设备同步虽然浏览器厂商都提供了同步能力但偶尔也会出现不同设备不同步、书签顺序错乱的情况。而且浏览器书签本质上是线性列表密密麻麻排在菜单里找起来全凭记忆。自托管导航页解决的就是这件事把常用的网址放到一个网页里用大图标、分组和搜索框组织起来打开浏览器第一眼就是它比书签栏直观得多。Jump 个人仪表盘正是在这个场景下做得很成熟的一个方案——它把书签、搜索、天气、时钟这些东西整合在一个页面里配置不复杂默认样式也不丑尤其适合我这种不想花太多时间美化的人。1.2 Jump 做对了哪几件事当初我试过好几个导航项目最终留在 Jump 上主要是因为它抓住了几个核心痛点。第一书签分组很直观。它不像有些项目那样把书签塞进复杂的嵌套目录而是用分组卡片的方式呈现每个分组是页面上的一个区块区块里是链接图标一眼扫过去就知道去哪。分组之间还可以拖拽排序调整布局不需要改配置文件。第二搜索框是真能用。页面顶部内置了一个搜索框可以切换不同的搜索引擎也可以自定义搜索地址。我平时会习惯性地一进首页就直接敲关键词省掉先开搜索引擎再输入的步骤。第三小组件做得克制。它提供时钟、日期、天气、问候语这类小组件但不会强迫你全开。我实际用下来觉得时钟和问候语有价值天气开不开看个人开多了反而杂乱。第四Docker 部署非常省心。这也是这篇教程存在的直接原因。项目提供了现成的容器镜像数据通过挂载目录持久化升级、迁移、备份都很干净不需要在宿主机上装 Node 环境和一堆依赖。1.3 Docker 化部署到底图什么有人会问这东西不是直接跑 Node 服务就行了吗为什么非要绕一层 Docker我的体会主要有三点。第一是隔离。Jump 运行需要自己的一套运行时和依赖如果直接装在宿主机上时间久了容易和系统里的其他软件互相影响版本。Docker 把这一切打包进容器宿主机只需要有 Docker 就能跑。第二是升级和回滚方便。新版发布后拉新镜像、重建容器就行。要是新版有问题把之前的镜像标签改回去就能回到旧版本整个过程不会在系统里留下散落的依赖文件。第三是迁移简单。整个应用的所有状态都写在挂载目录里想迁移就打包那个目录到新机器上重新 compose 一下数据和配置全部回来。这个特性对 NAS 玩家和经常折腾服务器的人来说价值比省那几百兆内存大得多。当然Docker 也不是完全没有学习成本至少要理解镜像、容器、挂载卷这几个概念。但跳过了这些概念直接抄一篇 compose 文件先跑起来反而是入门最快的方式。下面我就按这个思路来写。2. 部署前需要搞定的三件事机器、环境、端口规划2.1 一台什么样的机器才够用先说结论Jump 的资源要求很低低到我都不好意思列配置要求。从我实际部署的情况看一个跑着 Jump 的容器内存占用大概在几百兆以内波动CPU 平时基本是空闲状态磁盘占用也就在百兆级别上下。所以只要你有任何一台能长期开机的 Linux 设备都可以拿来跑常见的云服务器、NAS、树莓派、旧笔记本甚至软路由都在可运行范围内。唯一要强调的硬性条件是必须能装 Docker。因为 Jump 官方给的部署方式就是容器化不走系统原生安装这条路。另外提醒一句如果用的是云服务器记得确认一下带宽和每月流量导航页本身流量很小但拉镜像那会儿会消耗一点流量平时访问倒是完全不心疼。2.2 把 Docker 和 Compose 装到位接下来先把环境准备好。我这里默认你的系统是 Linux 发行版具体安装 Docker Engine 和 Docker Compose 插件的方式不同系统差异比较大直接去 Docker 官方文档里找到对应系统的安装说明装完执行下面两条命令确认docker version docker compose version如果能正常输出版本号说明 Docker 和 Compose 都就位了。如果只有 docker version 有输出而 docker compose 报错很可能是 Compose 插件没装或者是用老式的 docker-compose 命令需要把命令换成 docker-compose 再试一次。后面我的教程统一用新版 docker compose 语法如果你还在用旧版记得把命令里的空格换成短横线也就是 docker-compose。这里我特别想强调一下不要在一开始就纠结 Docker 的底层原理先把它当成一个能跑程序的“盒子”跟着步骤把服务启动起来后面再慢慢理解也不迟。2.3 端口和目录规划先想清楚再动手动手写配置之前最好先花一分钟想清楚两件事容器端口映射到宿主机哪个端口数据目录放在哪个位置。Jump 本身默认监听某个内部端口这个不用管我们只需要把它映射到宿主机的一个空闲端口上。我这里建议避开 80 和 443因为这两个端口以后大概率要给 Nginx 之类的反代用导航页直接用一个高位端口比如 8080反而省事。数据目录建议放在一个专门的路径下比如/opt/jump-data注意不要随手放在 /root 或临时目录里一个是权限问题多另一个是备份的时候容易忘。目录规划好了后面写 compose 文件的时候直接把路径填进去就行。我把自己常用的规划列成一张表供你参考项目推荐值说明宿主机端口8080可改为其他未被占用的端口数据挂载目录/opt/jump-data所有配置和数据都存在这里容器重启策略unless-stopped机器重启后自动拉起服务时区Asia/Shanghai影响时钟组件的时间显示这张表里的推荐值不是固定的实际根据你的机器环境调整但思路是固定的端口要空闲、数据目录要持久化、重启策略要自动。3. 用 docker compose 拉起的完整过程命令、配置、首次启动验证3.1 写一份能跑的 compose 配置环境准备好之后就可以写 Docker Compose 配置了。先创建一个工作目录然后新建一个名为 docker-compose.yml 的文件内容大致如下services: jump: image: your-jump-image:latest container_name: jump ports: - 8080:8080 volumes: - /opt/jump-data:/app/data environment: - TZAsia/Shanghai restart: unless-stopped上面的镜像名我用的是占位写法实际部署时请以项目文档里提供的镜像地址为准。为什么我不给一个具体的镜像地址因为这类项目的镜像仓库地址会随版本和发布渠道变化照着写容易过期反而是查一次官方文档最可靠。这个配置文件的几个关键点我逐个说一下ports 里的 8080:8080是把宿主机的 8080 端口映射到容器的 8080 端口。冒号前的数字可以改冒号后的数字一般不要动。volumes 把宿主机目录 /opt/jump-data 挂载进容器的数据目录。这是整个部署里最重要的一行没有它容器一删数据全丢有它升级迁移都不怕。environment 里设置时区为 Asia/Shanghai这一步有些人会忽略结果容器用的是 UTC 时间页面里的时钟和日期会比本地时间差 8 个小时。restart 设为 unless-stopped意思是只要不是手动停止容器在服务器重启后会自动恢复对长期运行的服务很友好。3.2 启动并确认服务真的起来了配置文件写好后执行命令cd /path/to/your/compose/dir docker compose up -d第一次执行会先拉取镜像这个过程取决于网络情况可能需要一两分钟。看到类似 “Container jump Started” 的输出说明容器已经启动了。接着可以用下面几条命令做基本检查docker compose ps docker compose logs -fdocker compose ps 会显示容器的运行状态如果是 Up 就说明进程活着docker compose logs -f 会实时打印容器日志适合观察启动过程中有没有报错。看到日志里出现服务启动成功的提示后直接在浏览器里访问http://你的服务器IP:8080如果是在本机测试把 IP 换成 localhost 就行。此时你应该能看到 Jump 的界面不同版本的首次访问流程略有不同有的会先要求创建管理员账号有的直接进入主界面。按界面提示操作即可。3.3 启动失败的三个快速自检如果你打开浏览器发现页面打不开不要慌99% 的情况逃不出下面三个原因。第一端口没放行。云服务器的话去控制台的安全组里确认 8080 端口有没有在入站规则里放行如果是本机防火墙执行 systemctl stop firewalld 可以临时关掉防火墙排除问题但记得随后放行端口而不是彻底关闭防火墙。第二容器一直在重启。docker compose ps 里如果看到容器状态是 Restarting多半是配置有问题比如时区变量写错、挂载目录不存在用 docker compose logs 查看具体报错信息按提示修正。第三镜像拉不下来。网络原因导致镜像仓库连接超时可以设置镜像加速或者过一会儿重试 docker compose pull 再重新 up。这个问题在不同网络环境下表现差异很大我也没法给通用方案但记住一个原则先看日志日志永远比瞎猜管用。4. 第一次打开 Jump 之后哪些配置值得认真调4.1 书签分组逻辑别把导航页做成收藏夹的复刻服务跑起来只是第一步真正决定这个导航页好不好用的是你在里面怎么组织书签。很多人会犯一个错把浏览器书签原封不动导入结果导航页里还是几百个链接照样找不到东西。我的建议是在 Jump 里重新按“使用频率”而不是“资料类别”来分组。举个例子我自己的分组结构大概是这样的工作台项目后台、文档协作、邮箱、会议入口常逛技术社区、资讯站、视频平台工具翻译、剪贴板、图片压缩、随机密码生成资料库一般不放在首页用搜索框直达每一组里只放每天都会用到的链接偶尔才用一次的放进搜索引擎能搜到的地方让它在别处待着。这样首页的信息量就控制住了扫一眼就能找到目标。在 Jump 界面里新增分组和书签的操作非常直观找到“添加”按钮填标题和 URL 就行。如果以后链接多起来它的设置页面里还支持批量导入和导出建议一开始就把数据结构想清楚后面维护会省力很多。4.2 把搜索引擎替换成你真正常用的Jump 默认的搜索引擎可能并不合你的使用习惯但它允许自定义默认搜索源这块一定要在刚部署完顺手改掉不然每次进首页搜索都要先切换引擎。在搜索设置里通常能看到一组预设的搜索引擎选项选一个作为默认即可。如果你有自定义搜索需求比如经常搜特定网站的站内内容就找自定义搜索配置项填一个搜索 URL 模板一般是https://你的目标网站/search?q{keyword}把 {keyword} 当成占位符Jump 会把你输入的关键词自动填进去。不同版本对这个占位符的写法可能有差异具体看设置页里的提示说明。补充一个小技巧把常用网站的站内搜索都配置成独立的搜索源然后在名字里加上区分比如“某百科”“某代码搜索”这样在搜索框里切换时一目了然。4.3 小组件和布局信息密度要克制Jump 的很多组件默认是开着的但我强烈建议你不要全开。导航页的价值是让人一眼找到想要的链接而不是像一个电视购物页面一样到处闪烁。我自己的最终配置只保留了这几样顶部搜索框、日期、时钟、一条问候语其余天气、新闻类组件全部关掉。为什么不留天气因为我看天气有手机 App打开导航页是为了走不是停下来研究。如果换了新环境想调节布局绝大多数情况下不需要改代码直接在设置里拖拽组件顺序、调整分组位置就行。背景图和主题色可以稍微花点心思。我不建议用太花的壁纸因为导航页是高频页面背景太亮反而伤眼睛。选一张暗色调的纯色或渐变背景把默认主题切成暗色长时间盯着也不累。5. 部署之后的坑我一个个踩给你看5.1 端口冲突你的 8080 其实早就被占了我第一次部署的时候docker compose up 明明显示容器起来了但浏览器就是打不开。排查半天发现是之前测试别的服务宿主机 8080 端口已经被占用了。docker compose 里指定的映射端口如果被占用容器并不会直接启动失败它会处于一种“看起来没起来、实际上反复重启”的尴尬状态。遇到这种情况先用下面的命令查端口占用ss -tlnp | grep 8080找到占用进程后要么停掉那个服务要么把 compose 文件里的端口映射改成别的端口比如 8081。改完端口后注意必须执行docker compose down docker compose up -d很多新手会只执行 docker compose up -d结果发现端口没变原因是 up -d 默认只重建有变化的容器有时并不会帮你删除旧容器重建所以干脆养成习惯修改端口、挂载路径这类关键字段后先 down 再 up一步到位。5.2 时区错乱导致日期和时钟差 8 小时这个坑我差点没发现。有一天我打开导航页怎么都觉得时钟不太对对了一下电脑时间才发现慢了 8 小时。原因很典型容器镜像默认时区是 UTC如果你不显式设置环境变量容器里的时间就和北京时间差着 8 个小时。解决办法就是在 compose 文件的 environment 里加上environment: - TZAsia/Shanghai加完之后记得必须先 down 再 up让容器带着新环境变量重建。如果你在中国以外的地区可以把 TZ 换成对应的时区标识比如 Europe/Berlin、America/New_York语法一样。这个设置看起来不起眼但直接影响页面上所有和时间相关的组件部署完第一时间就要检查。5.3 挂载目录权限导致配置写不进去另一个高频问题是页面能正常打开但点保存设置之后刷新一下全都丢失或者日志里出现磁盘写入失败的报错。发生这种情况九成是数据目录的权限没配对。容器里的进程通常以某个固定用户运行这个用户在容器外对应一个 UID。而你的宿主机目录 /opt/jump-data 的属主和属组可能和容器里的用户根本不是同一个。最直接的解决办法是给目录授权给容器运行用户的 UID但如果你不清楚那个 UID可以用一个稳妥的常用做法chown -R 1000:1000 /opt/jump-data上面命令里的 1000:1000 是我在多数容器项目里常见的默认 UID不同镜像可能不同如果不生效就去看容器日志和项目文档确认。我其实不建议为了省事直接 chmod 777因为那会让目录完全开放写权限万一这台机器上还跑着别的服务安全上不划算。还有个操作细节要注意改完目录权限后不是所有问题都能立刻恢复很多时候需要重启容器才能重新读取挂载目录的权限信息改完权限顺手 docker compose restart 一下能省掉不少排查时间。5.4 升级别急着 pull先备份Jump 发布新版本后很多人第一反应就是 docker compose pull 然后 up -d。这个流程本身没问题但一定要在 pull 之前先备份数据目录。为什么因为 Docker 升级容器时虽然挂载目录里的数据不会被清掉但新版程序首次启动时可能因为数据格式变化而做一次不可逆的迁移。万一迁移出问题你想回退旧版本旧镜像可能还在但数据已经回不去了。所以我给自己定了一条规矩升级前先压缩打包数据目录备份文件按日期命名放到 /opt/backup 下。命令大概是tar -czvf /opt/backup/jump-data-$(date %Y%m%d).tar.gz /opt/jump-data真到需要回退的时候把 compose 文件里的镜像标签改成旧版本再 up -d然后从备份里恢复数据目录就行。这个习惯一开始会觉得多余但只要遇到过一次升级翻车你就会感谢当初留了备份。6. 把 Jump 真正变成“你的”导航页备份、定制和后续扩展6.1 迁移和备份整个导航页就一个文件夹用 Docker 部署 Jump 之后我发现它最舒服的一点是整个导航页的状态完全浓缩在一个数据目录里。所谓备份就是把文件夹打包所谓迁移就是把打包的文件搬到新机器上解包。具体操作流程如下在新机器上先把 compose 文件准备好数据挂载路径和旧机器保持一致然后停掉容器把旧目录的内容完整覆盖到新目录再启动容器打开浏览器你会发现书签、设置、主题全都在几乎不需要在界面上重新配置。我实际迁移过一次整个过程不到十分钟。这里有一个小提醒迁移时最好先 docker compose down 再覆盖数据避免容器正在运行的时候写入冲突。如果两家机器的路径不同可以在 compose 文件里改挂载路径但一定要保证目标目录里有完整的旧数据不要只复制配置文件而漏掉其他数据文件。6.2 自定义样式用最小成本改出个人风格如果看腻了默认界面Jump 通常会在设置里提供自定义样式的能力支持直接写一小段 CSS把导航页改成自己喜欢的样子。这是我最喜欢的定制方式因为它门槛低、见效快而且随时可以一键恢复默认。举个例子如果你想换掉页面的背景色、调整一下卡片的圆角可以写类似下面的内容body { background: #1a1a2e; } .bookmark-card { border-radius: 12px; }保存后刷新页面就能看到效果。如果你完全不懂 CSS也可以先从设置面板里提供的现成主题模板入手选一个顺眼的再慢慢微调。我个人不太建议上来就折腾大改导航页最重要的是稳定和顺手样式只是锦上添花。6.3 继续扩展的思路域名访问和访问控制部署到这一步导航页已经完全能用了。如果你想继续完善有两个方向值得花时间一是给它配一个好看的域名二是加一层访问控制。配域名这件事核心是把域名的解析指向你部署机器的公网 IP然后在路由器或云服务器的安全组里放行对应端口。如果你之前配置了反代工具还可以把 80 和 443 端口留给反代让导航页通过一个子路径或单独域名访问这样看起来会更像“正经服务”而不是裸奔 IP 加端口。访问控制方面如果 Jump 自身没有提供账号密码但你希望能限制访问最简单的做法是放在内网使用只在家里或公司局域网访问不上公网。如果非要公网访问建议通过反代统一加上认证而不是直接把端口暴露到公网。这一步做不做取决于使用场景但心里要有这个安全意识。最后再分享一个我自己的使用心得部署完 Jump 之后我把它设成了浏览器的新标签页每天打开浏览器第一眼就是它。界面干净书签分组明确搜索框顺手这种“少即是多”的使用体验是一堆动态组件堆出来的其他方案给不了的。导航页这个东西折腾到最后会发现越简单越耐用Docker 化只是让它更好维护、更好迁移真正让它被天天打开的还是那份恰到好处的克制。