ARTICLE · 1337542
文档不出内网,还能自己做查重:这套开源企业知识库有点东西
前段时间帮一个设计院整理资料库。他们的诉求很具体:十几年的标准、图集、工法、评审报告,散在每个人的电脑和几个网盘里,要能搜、能看、能按部门分权限,最好还能对外发出去的稿子先查一遍重。
市面上的方案要么是网盘,权限粗得只有一个“能看不看”;要么是知识管理 SaaS,文档传上去就出了内网,评审报告这种东西根本不敢传。
后来翻到 Gitee 上这个 Castle 知识库,195 个 Star、85 个 Fork,MIT 协议,24 次提交。Java 占 94%,Spring Boot 2.7 打底,MySQL、Redis、Elasticsearch 一套标准配置,Docker 六个容器就能整起来。我把它跑了一遍,也把它仓库里的功能截图逐张看过了。
值得单独说一句的是:它自带一套文档查重,能出带“总文字复制比”“相似文献列表”“原文与来源对照”的报告单。这个功能放在一个开源知识库里,确实少见。
一、打开先看门面
首页是典型的门户结构:顶部导航按业务切(主题知识库、视频课程库、数据库、方案生成、方案学习、100 问、知识问答),中间一条大搜索框,下面挂一排热词,右侧是两个入口——“查重”和“我要发布”。再往下是知识分类和知识标签两栏,点一下就进对应的集合。

图1 首页:搜索入口、热词、查重与发布入口
这套导航其实透露了它的定位:不是一个“文件柜”,而是把文档、课程、方案、问答几类内容放在同一个知识体系里。分类管“这是什么业务”,标签管“涉及哪些主题”,两套维度可以同时用。
列表页的筛选做得比大多数文档系统细:标题、作者、所属分类(可多选)、所属领域、类型、是否发表、发布时间(近一个月到近一年,也能选起止日期),右边还挂着推荐知识和最近浏览。

图2 知识问答列表:多条件筛选、发布状态与浏览量
注意列表里的“浏览量”和“状态”两列——这套系统是带运营视角的,不只是存文件,还关心哪份材料被看了多少次、有没有发布出去。
二、功能拆开看,重点在后三样
(一)预览:能打开是一回事,能看清是另一回事
支持 txt、doc、docx、ppt、pptx、pdf 这些常见格式的在线预览,左侧缩略图导航,右侧正文,带页码、缩放、自动缩放、旋转和目录面板。它的预览不是把文件丢给浏览器硬解,而是走一个独立的 docpreview 服务(默认 8302 端口)转成图片流,所以老式的 .doc 和扫描件也能看。

图3 知识详情:分页缩略图、正文渲染与水印
这张截图里最该看的是那层淡淡的斜向水印,内容是用户名加日期。系统在预览和下载两个环节都打水印,这解决了内部资料最常见的一个漏洞:截图外流之后查不到是谁。
下载环节还能顺手转成 PDF。很多单位对外发文件只要 PDF,这个选项省掉了“先下 Word 再另存”的一步。
(二)查重:这套系统最不像“网盘”的地方
查重有两种模式。一种是单文件查重,你自己传两份文件互相比;另一种是本地库查重,传一份文件,跟整个知识库里的所有文件比。第二种才是真有用——新人交上来的报告是不是从库里某份旧稿改的,一跑就知道。

图4 查重报告单:总文字复制比、章节分布与相似来源对照
生成的报告单照着学术查重的格式做的:报告编号、检测时间、总文字复制比 3.3%、重复字符数 106、单篇最大重复字符数 47、总字符数 3195;往下是按章节铺开的重复比例条,再往下是相似文献列表(文件名、年份、相似比),最后是“原文内容 / 相似内容来源”左右对照,重复的地方直接指出来源文件。
技术上它用的是 HanLP 加 IKAnalyzer 做中文分词,再算文本相似度,报告渲染走 poi-tl 模板,版本差异用 java-diff-utils 算。都是能在内网自洽跑完的东西,不依赖任何外部接口,这一点对保密单位很关键。
它自己标了两条边界,我原样转述:查重暂不支持文件内的表格内容,也暂不支持图片文件。所以合同里的表格、扫描的手写稿,这套查重帮不上忙。
(三)历史版本:一种看全文,一种看差异
知识条目支持多版本留存。点“版本”会弹出一个窗口,左边列历史版本(V1.0、V2.0、V3.0 带时间),右上角切“全文”或“与上个版本的差异”。

图5 历史版本:版本列表与全文查看
差异模式是我更看重的那个。选两份文件做对比,界面会左右并排,改动处绿色高亮,行号对齐,一眼能看出“这版到底动了哪几句”。制度文件、标准汇编这类东西,改一个字都可能影响执行口径,靠人眼对两版 Word 是不现实的。

图6 版本对比:左右并排的差异高亮
(四)自定义知识模型:不同业务用不同字段
这一块容易被略过,但它决定了这套系统能不能“长”成业务系统。后台可以新建属性模板,给某一类知识定义自己的字段:字段标题、表单类型(单行文本、多行文本、日期、附件、下拉框)、是否必填、是否启用、是否支持搜索,逐条开关。

图7 属性模板:为不同知识类型自定义字段与搜索属性
举个例子:制度类要“制度编号、制度名称、制度内容、制定日期、附件”;工法类要“工法编号、适用工序、工艺要点、验收标准”。字段不同,检索入口就不同,这比强行把所有资料塞进同一个表单要合理得多。
(五)权限:五档,不是“能不能看”这么粗
权限是按知识分类配的,成员或组织架构挂到分类上,然后选一档:仅可查看、可下载、可新增、可编辑、可管理。每一档具体能干什么,界面上直接列了清单——可查看只能看;可下载多一个下载;可新增多一个批量添加;可编辑再加新增和改;可管理连删除、删评论都能做。

图8 知识分类权限:五档权限与成员授权
这个设计比“一个角色管全部”要细。实际场景里经常是:标准规范全公司可看,但只有标准化办公室能改;评审报告只有项目组能下载,其他部门看都看不到。分类级授权配合组织架构,正好对上这种需求。
(六)检索、词云、推荐与视频库
全文检索支持关键词高亮,ES 打底,字段级搜索可以按标题、作者、分类、时间组合。详情页右边有一朵词云,是用这篇文档的分词结果画的,点词能继续搜;下面挂推荐知识和最近浏览,走的是浏览行为数据。
视频也是一等公民:视频课程库、视频分类单独管理,在线播放,跟文档共用一套权限。做内部培训的单位不用再另找一个视频平台。
(七)后台与个人中心:运营要看的东西都在这儿
后台左侧是模块菜单(主题知识库、知识分类、知识标签、首页配图、通用模块),二级菜单按业务分(数据库、方案生成、方案学习、100 问、知识问答、视频课程库),顶部还挂着组织权限、应用中心、模板引擎。分类、标签、权重、封面图这些都能在这里改,不用动代码。

图9 后台管理:知识分类维护与多业务模块
个人中心是给普通用户看的:累计上传 22 份、累计下载、评论次数、订阅数四个数字卡片,下面两张统计图(按业务模块的文章数、按月份的趋势),再下面是最近浏览和最近下载。左侧还有我的订阅、我的知识、我的收藏、记录、查重记录。

图10 个人中心:上传统计、月度趋势与浏览下载记录
三、它是怎么搭起来的
这套系统的架构不复杂,但该有的组件一个不少。docker-compose 里一共六个服务,互相用内网网络通信,只有 nginx 对外暴露端口。
表1 Docker 编排中的六个服务
服务 | 作用 | 说明 |
mysql | 主数据库 | MySQL 8.0.39,库名 knowledge_base_v2,首次启动自动导入初始化脚本 |
elasticsearch | 全文检索 | 7.17.28 单节点模式,带中文分词插件,堆内存默认 512M |
redis | 缓存与会话 | 带密码启动,应用连 1 号库 |
knowledgebase | 后端主应用 | Spring Boot 2.7,Java 8 编译,端口 8200,上下文 /zsk |
docpreview | 文档转图预览 | 8302 端口,负责把 doc、ppt、pdf 渲染成页面图片 |
nginx | 前端与反向代理 | 对外只开 23000,映射到容器内 80 |
后端的技术栈是 Spring Boot 2.7 + MyBatis-Plus + Druid + MySQL,中文分词用 HanLP 和 ikanalyzer,文档转换用 wkhtmltopdf 加 docpreview 服务,模板渲染用 Beetl 和 poi-tl,差异对比用 java-diff-utils。前端是独立的 Vue 工程,用户端在另一个仓库 knowledgebase-member 里。
这套组合不算新,但都是国内企业环境里跑得最稳的那一批。好处是运维熟悉,坏处是组件多,内存开销不小——ES 加 MySQL 加应用,8G 内存是起步线。
四、什么样的单位该考虑它
设计院、施工单位的标准与工法库。截图里那些 T/CEC 102.x 标准、工法实例、方案模板,正是这类单位的日常。按专业分类建库,按部门授下载权,历史版本留着改版痕迹,招标前查一遍重,四个需求一次覆盖。
制造业的工艺与设备文档中心。SOP、作业指导书、设备手册、点检表,版本多、改动频繁。自定义知识模型可以给不同文件类型配不同字段,历史版本加差异对比能追到“哪一版改了参数”。
咨询、律所、会计所的知识资产库。这类机构最怕两件事:报告被抄、资料外流。前者用本地库查重,后者用预览和下载水印,权限细到分类。而且整套跑在内网,客户资料不出门。
高校、职院的课程与成果库。视频课程库放录课,文档库放讲义和论文,学生提交的作业可以直接跑查重,比外挂一个查重网站便宜得多,也不受次数限制。
医院、药企的规范与培训资料。制度、SOP、培训课件、考核记录,按科室授权。这类场景对数据落地位置极其敏感,能私有化部署本身就是硬指标。
内部问答与经验沉淀。导航里有“100 问”和“知识问答”两个模块,本质是把老员工的经验按问题组织起来,新人按问题找答案,而不是按文件夹找文件。
要给客户交付一套“知识管理系统”的集成商。MIT 协议,代码完整,六个容器一键起,改个 logo 和首页配图就能交付。比从零搭一套省几个月。
五、Windows 下怎么部署
两条路线:想最快看到东西走 Docker,想改代码或者机器不支持虚拟化就走源码。
表2 两条部署路线
路线 | 适合谁 | 前置条件 | 耗时 |
Docker Desktop | 只想用、要交付、机器配置够 | Windows 10/11 64 位、WSL2、8G 以上内存 | 30 分钟左右(含等库导入) |
源码本地跑 | 要改配置、改代码、ARM 机器 | JDK 8、Maven、MySQL 8、Redis、Elasticsearch 7.17 | 1.5 到 3 小时 |
(一)路线 A:Docker Desktop,六个容器一起起
先把 Docker Desktop 装好,安装时勾上 WSL 2 后端,装完重启一次。等右下角鲸鱼图标稳定,在 PowerShell 里执行 docker --version 和 docker compose version,两个都能出版本号再往下走。
项目根目录里有个 docker 文件夹,编排文件就在里面,官方镜像放在阿里云容器镜像服务上,国内拉取速度还行。
git clone https://gitee.com/hcwdc/knowledgebase.git cd knowledgebase\docker docker compose up -d |
起来之后不要急着访问。MySQL 的初始化脚本体积很大,第一次启动要跑五到十分钟,这期间前端会返回 502,属于正常现象。可以盯一下 MySQL 容器的日志,等它不再刷 INSERT 再打开浏览器。
docker compose ps docker compose logs -f mysql |
确认六个容器都是 Up 之后,访问 http://localhost:23000,用默认账号 admin、密码 admin 登录。
如果页面一直是 502,先重启一次再等两分钟;还是不行就看 mysql 和 knowledgebase 的日志,九成是数据库还没初始化完,或者 ES 没起导致应用启动失败。
docker compose restart |
所有数据落在 docker\data 下面,mysql、elasticsearch、redis、nginx 各一个子目录。备份就是停掉容器、拷这个目录,迁移到另一台机器也一样,这点比装在系统里的服务省心。
(二)路线 B:源码部署,环境得自己备齐
这条路要准备的东西多一点,但可控性最好。JDK 必须是 8,Spring Boot 2.7 虽然能跑更高版本,但这个项目的编译目标和依赖都是按 1.8 定的,用 17 大概率在启动阶段就报模块错误。Maven 不用单独装,仓库自带 mvnw.cmd。
第一步,建库导数据。MySQL 8 装好后建一个 utf8mb4 的库,名字建议就用 knowledge_base_v2,然后用 Navicat 或命令行把 doc\db\gitee_knowledge_base.sql 导进去。这个脚本不小,导入过程要耐心等。
CREATE DATABASE knowledge_base_v2 DEFAULT CHARACTER SET utf8mb4; mysql -uroot -p knowledge_base_v2 < doc\db\gitee_knowledge_base.sql |
第二步,改配置。打开 castle-fortress-admin\src\main\resources\application-dev.yml,把数据库、Redis、Elasticsearch 的地址换成本机的,再把几个路径改成 Windows 绝对路径。原文件里留的是作者自己机器上的 D 盘路径,照抄会启动失败。
spring.datasource.url: jdbc:mysql://127.0.0.1:3306/knowledge_base_v2 ?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai spring.redis.host: 127.0.0.1 spring.redis.port: 6379 spring.elasticsearch.rest.uris: 127.0.0.1:9200 castle.cms.templatePath: D:\CastleKB\cmsTemplates\ castle.addons.path: D:\CastleKB\addons\ pdf.html.toll: D:\wkhtmltopdf\bin\wkhtmltopdf.exe |
第三步,编译打包。在仓库根目录执行 mvnw.cmd,第一次会把依赖全下一遍,国内网络建议在 Maven 的 settings.xml 里配好阿里云镜像,否则要等很久。
mvnw.cmd clean package -DskipTests |
第四步,启动。产物在 castle-fortress-admin\target 下,用 java -jar 起,指定 dev 配置,服务监听 8081。启动日志里如果出现词典路径相关的报错,先看第六条常见问题。
java -jar castle-fortress-admin\target\castle-fortress-admin.jar --spring.profiles.active=dev |
第五步,前端。后台管理界面随 admin 模块一起打包,起来就能访问 http://localhost:8081;面向读者的用户端在另一个仓库 knowledgebase-member,需要装 Node 后单独构建,把接口地址指到 8081。想省这一步,就直接走 Docker 路线,nginx 那一层已经把前端带上了。
要跑生产配置就换 --spring.profiles.active=prod,端口变 8200,上下文路径变 /zsk,访问地址相应变成 http://localhost:8200/zsk。正式对外建议前面再挂一层 Nginx,开 HTTPS。
(三)几个必须对的配置项
下面这几项在 application-dev.yml 和 docker-compose 里都能找到,配错一项就起不来或者用不了。
表3 部署时必须核对的配置项
配置项 | 作用 | 常见值 |
server.port | 应用端口 | dev 为 8081,prod 为 8200 |
context-path | 访问前缀 | prod 下为 /zsk |
datasource.url | 数据库连接 | 必须带 serverTimezone=Asia/Shanghai 与 characterEncoding=UTF-8 |
redis.database | Redis 库号 | 默认 1,不是 0,容易连错 |
elasticsearch.rest.uris | 检索服务地址 | 单机 127.0.0.1:9200 |
lexicon 路径 | HanLP 中文词典目录 | 容器里是 /app/lexicon,本机要指到实际目录 |
pdf.url | docpreview 预览服务 | 默认 8302 |
pdf.html.toll | wkhtmltopdf 可执行文件 | Windows 下填 exe 的绝对路径 |
(四)Windows 上最容易卡住的六件事
这些是 issue 区和实际部署里反复出现的,按顺序排查能省不少时间。
表4 Windows 部署常见问题
现象 | 原因 | 处理 |
启动报 lexicon.path 相关错误 | 词典目录没配或文件缺失 | 确认 lexicon 目录存在且路径可读;容器里固定 /app/lexicon,本机改成绝对路径 |
库里时间比实际晚 8 小时 | 连接串漏了时区参数 | url 里补 serverTimezone=Asia/Shanghai |
中文乱码、搜索不出中文 | 库或表不是 utf8mb4 | 建库时指定 utf8mb4,导入脚本前确认字符集 |
上传成功但搜不到 | ES 没起或索引没建 | 先访问 9200 确认节点可用,再重启应用让它重建索引 |
下载 PDF 失败或空白 | wkhtmltopdf 未安装、路径错 | 装上后配绝对路径,路径含空格要用引号包住 |
Docker 起来一直 502 | MySQL 初始化脚本还没跑完 | 等 5 到 10 分钟,docker compose logs -f mysql 看进度,必要时 restart |
另外还有两条环境层面的:官方镜像只提供 x86 版本,ARM 架构的机器(比如部分轻薄本)跑不起来,只能自己拉代码改镜像;镜像从阿里云仓库拉,如果公司网络有限制,先在 Docker Desktop 里配好镜像加速地址。
六、几句实话
更新节奏慢。整个仓库 24 次提交,最后一次在八个月前,issue 里还挂着一个“启动报 lexicon.path 错误”的未结项。功能是齐的,但别指望提个需求两周就合进去。用之前先自己完整跑一遍,别直接上生产。
查重的边界要提前说清。不支持表格内容、不支持图片文件查重,这两条作者写在 README 里。合同、扫描件、带大量表格的技术文件,查重结果会失真,别拿它当知网用。
组件多,机器别太小气。ES、MySQL、应用、预览服务四个吃内存的,8G 是底线,16G 才舒服。挂在 4G 的小主机上,检索会慢到影响体验。
部署门槛不算低。“一键起”指的是六个容器一起编排,前提是你机器上 Docker 已经能用。完全没碰过命令行的同学,会在 WSL2、镜像拉取、502 这几步上耗掉大半天。
在线演示环境目前打不开。README 里给的演示地址访问返回 502,估计是服务器停了。好在仓库 doc/img 里的十张功能截图是完整的,看效果不受影响;想真机体验,还是自己本地起一套更靠谱。
说这些不是劝退。功能覆盖面、查重这个差异点、以及完整的商用级权限模型,放在开源项目里确实不多见。只是它更适合“有人能折腾环境”的团队,而不是点开即用的个人工具。
七、项目地址
后端主仓库在 Gitee,MIT 协议,商用没问题。文档站和语雀手册都比较完整,部署前建议先翻一遍概述那页。
Gitee 主仓库:
https://gitee.com/hcwdc/knowledgebase用户端仓库:
https://gitee.com/hcwdc/knowledgebase-member在线文档:https://doc.icuapi.com/knowledge/gaishu
操作手册:https://www.yuque.com/hcwdc/castleknowledge
这款开源合同公文管理系统让Word在线编辑、PDF盖章、公文套红一站搞定
开箱即用|唛盟 mdp‑lcode,一套 MIT 完全开源企业级低代码平台(文末附源码地址)
GeekAI:把 ChatGPT、MidJourney、Suno 和即梦塞进一个站点,还能自己部署













































































