[ 跳转到主要内容 · Skip to Content ]
文稿 / 开源与工具 / 在 NodeSeek 偶遇 CF-Navs:把个人导航站搬上零成本的 Cloudflare 边缘网络

在 NodeSeek 偶遇 CF-Navs:把个人导航站搬上零成本的 Cloudflare 边缘网络

告别需要挂着 Docker 与数据库守护进程的笨重面板,用 Workers + D1 + KV 搭一座永不掉线的数字书签屋

HalfAir · 文摘卡片 2026-11-04 · 开源与工具
“不要温和地走进那个良夜。”
前几天深夜逛 NodeSeek 论坛时偶遇了开源项目 CF-Navs。花二十分钟把它部署到 go.halfair.top 并迁入 13 个分类、101 枚书签后,我终于把那台常年只为跑个导航页而吃内存的容器给停掉了。

一、 一次论坛闲逛的偶遇:为什么我厌倦了重型导航面板

前几天半夜写完代码,端着水杯在 NodeSeek 论坛里漫无目的地刷帖子,偶然点进了坛友 @lbjxr 发的一篇开源自荐帖(post-818806-1),项目名叫 CF-Navs。

点开作者放出来的演示站看了一眼,我原本准备关掉浏览器的手停住了。

只要手里攒过几台云服务器、软路由或者家庭 NAS 的人,大概率都折腾过“个人导航站”。过去两年里,我也跟风换过好几套方案:最早在本地飞牛 NAS 的 Docker 里跑过 Sun-Panel 和 Homepage,后来又在云服务器上搭过基于 Node.js 的导航面板。这些工具刚装好的头两天确实让人赏心悦目,但日子一久,两处很难受的拧巴感就会慢慢浮上来:

第一处拧巴叫“入口与宿主的死锁”。导航站本来是所有服务的第一道总大门,结果为了跑这个大门,你得专门维护一台 24 小时开机的 VPS 或家庭服务器。一旦哪天家里宽带重拨换了公网 IP、或者云服务器到期忘了续费,你想打开导航站去找服务商后台地址,却发现连导航站自己都打不开了。

第二处拧巴叫“维护成本倒挂”。有些纯静态的开源导航页虽然能直接丢上 GitHub Pages,但每次在手机上看到一个好用的工具站想收进导航页,都得打开电脑拉代码、改几百行的 YAML 配置文件、提交 Git 再等三分钟构建。为了存一个网址搞出这么大阵仗,最后往往演变成半年都不想更新一次。

而那晚在 NodeSeek 看到的 CF-Navs,恰好踩中了这两者中间最舒服的那个平衡点:它不需要买任何 VPS,也不用改 YAML 重新构建,而是直接寄生在 Cloudflare Workers + D1 数据库 + KV 存储之上,既有后台可视化增删改查和拖拽排序,又能白嫖 Cloudflare 全球边缘节点每天十万次的免费额度。

二、 架构拆解:当 Astro 5 遇上 Workers + D1 + KV

顺着 GitHub 仓库翻了一遍 lbjxr/CF-Navs 的源码,能很明显地感受到作者在架构选型上的克制。整个项目没有引入任何臃肿的传统后端框架,而是把 Cloudflare 原生无服务器三件套用得极其干净:

1. 计算与渲染层(Cloudflare Workers + Astro 5 + Vue 3):前端采用 Astro 5 混合渲染配合 Vue 3 交互组件,平时访客打开首页时直接由边缘 Worker 读取 D1 并返回轻量 HTML;切入后台管理面板时则按需挂载拖拽排序与编辑弹窗。

2. 结构化持久层(Cloudflare D1 SQLite):分类(Categories)、书签站点(Sites)、私密可见性标记(is_private)以及全局站点配置全部存放在边缘 SQLite 数据库 D1 中,不仅支持毫秒级检索,还能随时在后台一键导出标准 JSON 快照。

3. 会话与鉴权层(Cloudflare KV):管理员登录态(Session Token)与短期高频缓存直接写入 SESSION 命名空间,边缘节点就近校验 Cookie,彻底省去了传统 JWT 无法主动吊销或 Redis 实例保活的麻烦。

4. 跨端生态闭环(WebDAV 自动备份 + 浏览器新标签页插件):除了网页端本身,仓库里还直接附带了支持坚果云 / Nextcloud / OpenList 的 WebDAV 云端备份模块,以及一套开箱即用的 Chrome / Edge / Firefox 浏览器扩展—⁠—装上之后,每次按 Ctrl + T 新建标签页,弹出来的就是你自己的边缘导航站。

TABLE 01 // 个人导航站三类主流技术方案横向对比
评估维度传统 Docker 容器面板(如 Sun-Panel / Homarr)纯静态 Git 导航页(YAML / JSON 驱动)**CF-Navs(Workers + D1 + KV)**
服务器与运维成本 需常年维持 VPS 或 NAS 开机,存在宕机连带失联风险 零成本(托管于 Pages),但无动态后台 零成本(白嫖 CF 每日 10 万次免费请求,免运维)
日常增删书签体验 网页后台直接添加,体验好 需改代码、提交 Git 并等待 CI 重新编译,极繁琐 网页后台可视化秒级添加、支持拖拽排序与图标自动抓取
公私书签分流能力 多数仅支持全站密码锁或固定单视图 不支持动态鉴权,内网 IP 容易暴露在源码中 原生支持分类/书签级私密开关,管理员登录后原地解锁内网面板
数据迁移与灾备 依赖拷贝容器挂载卷(Volume) 天然随 Git 仓库版本化保存 支持一键 JSON 导入导出 + WebDAV 定时云备份

三、 动手实录:二十分钟把 go.halfair.top 搬上边缘节点

看懂架构之后,我当场决定把自己的二级域名 https://go.halfair.top 腾出来,实测跑一遍完整部署。如果你也想搭一个,直接照着下面这五步走,二十分钟内就能跑通。

第一步:预先创建 D1 数据库与 KV 命名空间

登录 Cloudflare 控制台,在左侧菜单进入 存储和数据库 (Storage & Databases):

• 点开 D1 SQL 数据库 -> 创建数据库,名称填 cf-navs-db,创建后顺手复制它的 database_id(UUID 格式)。

• 点开 KV -> 创建命名空间(Namespace),名称填 SESSION,同样复制生成的 id。

第二步:Fork 仓库并校准 wrangler.json 绑定

把 lbjxr/CF-Navs Fork 到自己的 GitHub 账号下。打开仓库根目录的 wrangler.json,把刚才拿到的两个 ID 填进对应的绑定槽位里(或者在下一步的 Cloudflare 网页后台可视化绑定,但写进配置文件里最稳妥,后续自动部署不会丢绑定):

第三步:连接 Workers 构建管线并锁定 Node 24

进入 Cloudflare 控制台的 计算 (Workers & Pages) -> 创建应用程序 -> 导入现有 Git 存储库,选中刚刚 Fork 的 CF-Navs:

• 构建命令:填写 npm run build

• 构建环境变量(关键):点击添加变量,填入 NODE_VERSION = 24(Astro 5 与新版依赖在 Node 22/24 下构建最稳,避免默认旧版镜像报错)。

第四步:配置 SETUP_TOKEN 并触发重部署(最容易踩坑的一步)

首次构建跑完后,先别急着打开网页。进入该 Worker 的 设置 (Settings) -> 变量和机密 (Variables and Secrets),点击添加一条 Secret(机密):

• 变量名填 SETUP_TOKEN

• 变量值填一串你自己临时设定的高强度安装口令(例如 HalfAir-Init-2026!)

第五步:执行 /install 初始化并绑定自定义域名

重部署生效后,在浏览器访问 https://go.halfair.top/install,输入刚刚设定的 SETUP_TOKEN 和你自己的管理员密码,点击一键初始化—⁠—D1 数据库里的表结构就会在两秒钟内自动建好。初始化成功后,回到 Cloudflare 后台把 SETUP_TOKEN 这条机密删掉,整个安装闭环就彻底锁定了。

wrangler.json (D1 数据库与 KV 会话绑定核心配置)
json
{
"name": "cf-navs",
"main": "./dist/_worker.js/index.js",
"compatibility_date": "2026-03-01",
"compatibility_flags": ["nodejs_compat"],
"assets": {
"binding": "ASSETS",
"directory": "./dist"
},
"kv_namespaces": [
{
"binding": "SESSION",
"id": "在此填入你的_SESSION_KV_ID"
}
],
"d1_databases": [
{
"binding": "DB",
"database_name": "cf-navs-db",
"database_id": "在此填入你的_CF_NAVS_DB_UUID"
}
]
}

四、 书签大迁徙:13 个分类、101 枚站点的清洗与私密隔离

空架子搭好只是第一步,真正决定导航站好不好用的是里面的数据。

此前我的书签散落在三个地方:旧版静态导航页(MeNav)、本地飞牛 NAS 上的 Sun-Panel 容器,以及浏览器收藏夹里积攒了好几年的 HTML 书签文件。趁着这次迁入 go.halfair.top,我干脆写了一段二十几行的本地清洗脚本,把三处数据源合并去重,剔掉早就失效的死链,最终规整出了 13 个一级分类、共计 101 枚高频站点,压成一份标准的导入包一键灌进了 D1 数据库。

生产环境排障清单:初始化报错与图标抓取优化

OPS

若访问 /install 提示数据库未绑定或未初始化,请依次检查:1. wrangler.json 中的 database_id 是否与 D1 控制台一致;2. Worker 设置中的变量名是否严格大写为 DB 和 SESSION;3. 修改绑定后是否执行了 Redeploy。此外,针对部分内网 IP(如 192.168.x.x)无法被公网 Favicon 接口抓取图标的情况,建议直接在书签编辑框中使用内置的 Lucide 矢量图标名或填入图床上的透明 PNG 图标链接。

我把个人博客(halfair.top)、自建图床(img.halfair.top)、GitHub、NodeSeek、常用 AI 工具和开发文档全部设为公开分类,任何朋友打开 go.halfair.top 都能直接当成工具箱用;而家里的 OpenWrt 软路由后台(192.168.100.1)、PVE 虚拟化节点、飞牛 NAS 控制台和 qBittorrent 面板,则统统勾选了私密标记(Private)。未登录状态下连分类名字都不会在源码里出现,只有我自己点右上角小锁头登录后才会原地展开。

五、 客观评价:它的长板、局限与适用人群

把 https://go.halfair.top 设为所有浏览器的新标签页主力入口并重度用了一周后,我觉得很有必要抛开滤镜,客观聊聊 CF-Navs 的真实长板与物理边界。

先说让我决定长期留用它的三个绝对长板:

1. 真正意义上的“零心智负担”:不用操心 SSL 证书续期,不用担心 Docker 容器半夜 OOM 挂掉,也不用花一分钱续费服务器。只要 Cloudflare 还在,这个入口就永远在线。

2. 克制而顺手的交互细节:很多开源导航站喜欢塞满花里胡哨的天气预报、股票行情或者炫光动效,看三天就腻了;CF-Navs 的版面非常干净,搜索框支持首字母快速过滤,深浅色切换丝滑,手机端自适应也很到位。

3. 恰到好处的权限颗粒度:分类级与单站点级的私密隐藏开关,完美解决了“既想把导航站公开挂在博客顶栏分享给别人,又想拿它当自己内网设备跳板”的矛盾。

再说两个受限于 Serverless 架构的客观局限:

1. 无法从边缘节点直接 Ping 通你的家庭内网:因为代码跑在 Cloudflare 的公网边缘节点上,它自带的“站点连通性在线检测”自然没法跨越 NAT 去探测你家里的 192.168.100.x 软路由是不是活着(除非你把内网服务通过 Cloudflare Tunnel 暴露到了公网域名)。

2. 不适合做重度硬件监控大屏:如果你追求的是像 Homepage 那样在卡片上实时跳动本地 Docker 容器的 CPU 负载、硬盘温度和下载速率,那还是得在局域网里留一个本地面板;但如果你要的是一座随时随地秒开、数据完全自主可控、能在三秒内帮你跳去目标网页的云端书签屋,CF-Navs 是我今年在开源社区里淘到的最称手的一件小兵器。

感兴趣的朋友可以直接去 lbjxr/CF-Navs 仓库看看,或者点开我的在线实例 https://go.halfair.top 体验一下实际速度。

好的工具就像玄关墙上的钥匙挂钩——平时你几乎注意不到它的存在,但每次推门伸手,钥匙一定稳稳地挂在老地方。
— HalfAir 折腾手记
参考资料与延伸阅读 · References 共 3 篇
  1. [01]

    最初在 NodeSeek 社区偶遇该项目的原帖讨论与作者更新记录

  2. [02]

    项目源码仓库,基于 Astro 5 + Vue 3 + Cloudflare D1/KV 构建

  3. [03]

    本文实测部署的线上生产实例(已完成 13 大分类、101 枚书签迁移与内网私密隔离)

读后表态 · Reactions 读完觉得怎么样?顺手点张贴纸留个脚印吧

评论与留言

STANDBY...
SELF-HEALING v2
正在准备评论区运行环境...

全局全文搜索与快捷命令面板

快捷指令 PAGEFIND · STANDBY
检索结果 19 ENTRIES