文档阁 Docs Hub

科技智趣坊的文档归档中心:仓库里的 content/ 目录就是站点数据源,放一篇 Markdown 进去就多一篇文档,不改代码、不重新构建

v0.1.0

功能特性

📚

仓库即站点

站点内容直接读 content/ 目录:新增、修改、删除一篇 .md 就等于上线/下架一篇文档,不需要改代码、不需要重新构建前端

🔓

公开 / 内部双档

content/public/ 免登录阅读,content/internal/ 需登录;鉴权在服务端强制,未登录访问内部文档一律返回 404,不暴露文档是否存在

🔍

中文全文检索

SQLite FTS5 打底,自研中文分词注入(入库切单字 + 双字 + 三字,查询按双字取 AND);「合同」「玻璃」「端口」这类中文双字词也能命中,内置分词器做不到

🗂️

分类与标签

按目录自动成树,父节点计数为后代累计;文档在 frontmatter 里声明标签,标签云与分类树都按当前用户可见性过滤

🧊

3D 玻璃界面

3D 玻璃拟态卡片叠加极光背景,深浅主题各自配色;代码块类名级高亮,主题切换后可读性不走样

🖥️

PC 三栏 / 手机单栏

PC 端「分类树 / 正文 / 目录(TOC)」三栏并排;手机端收成单栏,分类走抽屉,底部悬浮玻璃 Dock 切换页面

⌘

⌘K 搜索面板

任意页面按下 ⌘K / Ctrl+K 唤起搜索面板,输入即搜,键盘上下选择、回车跳转,不用离开当前文档

✨

代码高亮与图表

Markdown 表格、任务列表、脚注照常渲染;代码块按语言语法高亮,```mermaid 图表按需懒加载,不拖慢首屏

🐂

飞牛一键登录

从 smallgo 框架实例化,继承登录认证、飞牛 NAS 一键登录、用户权限、系统配置、备份恢复、审计日志与匿名统计

技术架构

后端技术栈

  • Go - 高性能编译型语言
  • Gin - 轻量级 HTTP 框架
  • GORM - ORM 框架
  • SQLite (FTS5) - 单文件数据库 + 全文检索
  • goldmark - Markdown 渲染
  • chroma - 代码语法高亮

前端技术栈

  • Vue 3 - 现代前端框架
  • TypeScript - 类型安全
  • Vite - 构建工具
  • Tailwind CSS - 原子化样式

部署方式

  • 飞牛 NAS(fnOS)FPK 包
  • Docker 多平台镜像
  • 裸二进制 + 内容目录
  • nginx 前置代理

文档阁基于 smallgo 应用框架实例化,登录认证、飞牛 NAS 一键登录、用户权限、系统配置、备份恢复、审计日志、匿名统计、实时通道与定时任务全部继承框架,业务模块位于 server/docshub/(扫描、索引、检索、渲染)。

⚠️ 一个必须记住的编译约束:SQLite 的 FTS5 扩展在 mattn/go-sqlite3 里默认不编译,构建时必须带 -tags sqlite_fts5,否则启动直接报 no such module: fts5。仓库里的 Makefile、Dockerfile、构建脚本、fnpack 与 CI 都已带上,手动 go build 时请自己补上。

快速开始

📦 当前状态:尚未发布安装包。文档阁于 2026-10-01 完成首次落地(v0.1.0),飞牛 fnOS 安装包(.fpk)、Docker 镜像与二进制发行包都还没有发布,官网暂不提供下载入口,请勿使用任何来路不明的安装包。

发布后会怎么分发

现在想先看看

从源码本地运行即可(首次启动会自动建索引,第一个注册的账号自动成为管理员):

# 1. 起后端(必须带 sqlite_fts5 构建标签)
cd server
go run -tags sqlite_fts5 . -content-dir ../content

# 2. 另开一个终端起前端(自动把 /api 代理到 :8501)
cd web
npm install
npm run dev            # 打开 http://localhost:3000
💡 提示:站点浏览公开文档本身不需要登录,登录只影响内部文档与后台管理;把文档放进 content/public/<分类>/ 或 content/internal/<分类>/,头部补上 frontmatter(title / description / tags / author / date / order)即可。

端口与仓库信息

默认端口 8501(HTTP,安装向导、-port 参数或 PORT 环境变量均可修改)
容器名 techfunway-docs-hub
数据卷 docs-hub-data → 容器内 /app/data(数据库、上传文件、日志)
内容目录 仓库 content/ → 容器内 /app/content(public/ 免登录,internal/ 需登录)
fnOS 包名 techfunway-docs-hub(桌面显示名「文档阁」)
源码仓库 仓库名 docs-hub(暂未公开),Go + Gin + GORM + SQLite FTS5 / Vue 3 + TypeScript + Tailwind
运行数据 本地 SQLite 数据库 + 全文检索索引,管理员可在应用内下载数据库快照备份
上游框架 smallgo,后端模块名为 smallgo/server

更新日志

v0.1.0 2026-10-01
  • 首个版本:仓库 content/ 目录即站点数据源,放入 .md 即上线,不改代码、不重新构建
  • 公开 / 内部双档:content/public/ 免登录,content/internal/ 需登录;鉴权在服务端强制,未登录访问内部文档返回 404
  • 中文全文检索:SQLite FTS5 + 自研中文 n-gram 注入,中文双字词也能命中
  • 分类与标签:目录自动成树(父节点计数为后代累计),frontmatter 声明标签
  • 3D 玻璃拟态界面 + 极光背景;PC 三栏、手机单栏 + 抽屉 + 底部玻璃 Dock;⌘K 搜索面板
  • Markdown 渲染支持表格、任务列表与脚注,代码块语法高亮,mermaid 图表懒加载
  • 继承框架全部公共能力:登录认证、飞牛 NAS 一键登录、用户权限、系统配置、备份恢复、审计日志、匿名统计
  • 迁移归档首批 27 篇应用设计文档(来自 contract / collect / rental / worklog / dsh-nas / bookmarks / reminders / notepad)
  • 📦 尚未发布安装包:飞牛 .fpk、Docker 镜像与二进制发行包均在准备中
  • 🔒 代码仓库暂未公开,进度见 GitHub 组织主页

常见问题

新增或修改一篇文档要重新部署吗?

不用。站点直接读 content/ 目录,放一篇 .md 进去(或改一篇已有的),刷新页面就是最新内容,不需要改代码、不需要重新构建前端;后端启动时会自动建索引。

公开文档和内部文档怎么区分?

由所在目录决定:content/public/ 免登录阅读,content/internal/ 需登录。鉴权在服务端强制,未登录访问内部文档返回 404(而不是 403,避免暴露文档存在性),搜索、标签云与分类树统计也一律按可见性过滤。

为什么中文两个字也能搜到?

SQLite FTS5 的内置分词器都不适合中文:unicode61 把整段汉字当一个词,trigram 以 3 个字符为最小单元,「合同」「玻璃」「端口」这类双字词实测命中 0 条。文档阁改用自研的中文 n-gram 注入——入库时切单字 + 双字 + 三字,查询按双字取 AND,双字词即可命中。

支持哪些文档写法?

标准 Markdown:标题、表格、任务列表、脚注、代码块都能渲染;代码块按语言语法高亮,```mermaid 图表按需懒加载。元数据写在文件头部的 frontmatter 里(title / description / tags / author / date / order),分类由所在目录自动决定。

文档数据存在哪里,会上传吗?

文档正文始终是仓库里的 Markdown 文件,站点不另存一份;账号、配置与检索索引保存在本地 SQLite 数据库(数据目录 data/),不上传云端。应用内置的匿名使用统计只上报版本与部署形态等设备信息,可在系统配置中关闭。