shiori 是一个自托管的书签库,主程序 35563008 字节。加一条书签时它会把页面正文抓下来存进 sqlite,源站关掉或者断网以后仍然能读。

它解决的问题是「收藏夹攒成一堆死链」。浏览器书签只存 URL,两三年后一半打不开;稍后读类服务又把内容放在别人服务器上。shiori 把标题、正文和标签都存进一个 73728 字节的库里,跟着你走。

这次全程离线跑了一遍:本地起一个 8001 端口的页面,加 4 条书签,起服务量响应,最后打开界面看列表。加一条 0.97 秒,服务 0.57 秒可访问。

一个 35563008 字节的书签库

官方 zip 13398573 字节,解开只有 3 个条目:主程序、README 和一份 LICENSE。没有安装向导,不写注册表。

文件字节作用
shiori.exe35563008主程序,CLI 与 Web 服务同一个文件
zip 整体13398573解压后 3 个条目
解压耗时0.2 秒SSD 上单次
版本命令182 毫秒三次 201 / 182 / 175

CLI 与 Web 服务是一个 exe

shiori add 是加书签,shiori server 是起界面,两个子命令共用同一个 35563008 字节的可执行文件。不需要额外装 node 或者反向代理,监听端口就能用。

# 三次耗时 201 / 182 / 175 毫秒
shiori version
Shiori version 1.8.0 (build da56f82faac5bf350fc4175e5ff50726cb10d956) at 2025-09-26

版本行里带完整构建哈希和打包时间。想确认手里这份是不是官方产物,比这一行比看文件名可靠。

装之前先定数据目录

它默认把数据放在用户目录下,多份实例容易混。用一个 --storage-directory 显式指定,库和归档都在这个目录里。

条件本次实测值说明
系统Windows 10 22H2(19045.6466)官方给 Windows x86_64 包
数据目录--storage-directory 指定不指定就落到用户目录
端口8085server 默认 8080
授权MIT可商用,可再分发

日志第一行就会提示:设了 --storage-directory 会覆盖环境变量 SHIORI_DIR。两份配置都在时以命令行为准,这是排查「数据写错地方」的第一条线索。

数据目录里是 4 个归档文件加一个库

4 条书签跑完,整个数据目录是 7 个文件 237568 字节。正文快照不塞进数据库,按 id 单独存成文件,每条 32768 字节。

路径字节说明
shiori.db73728标题、URL、摘要与标签的索引
archive/132768第 1 条的正文快照
archive/232768第 2 条的正文快照
archive/332768第 3 条的正文快照
archive/432768第 4 条的正文快照
合计237568含 sqlite 的写前日志与共享内存各 32768 字节

库和归档能分开处理

73728 字节的库里只有索引,正文全在 archive 目录。拷走库不拷 archive,列表还在但那几条打不开正文;反过来只拷 archive,文件在但不知道对应哪一条。

备份就把整个目录打一个包,237568 字节一次拷完。空间紧张时可以只留库、把 archive 里不常看的那几个删掉,代价是那些条目退回「只有链接」的状态。

两个 32768 字节的临时文件

目录里那两个 32768 字节的文件是 sqlite 的写前日志和共享内存,进程活着的时候才存在。正常退出之后只剩 73728 字节的库和 archive 目录,文件数从 7 掉到 5。

归档详情页长什么样

打开 /bookmark/4/archive 看到的是这份快照,不是原站。左上角是它的标记,右上角「View Original」指回抓取时的地址,下面是当时存下来的标题和正文。

/bookmark/4/archive          归档副本,读 archive/4
http://127.0.0.1:8001/page4.html    抓取时的原址

这条测试页的正文只有 8 个汉字,抓下来也就这么多。换成真实的文章页,这里是排版好的段落、列表和图片,读起来跟原站接近,但不再依赖原站能不能开。

位置实测内容作用
左上栞 shiori固定标记,说明这是归档副本
右上View Original跳到抓取时记下的原址
正文区第 4 页 / 正文 4存下来的标题与正文

原站那 8001 端口早就停了

截图时本地那个静态服务已经关掉,页面照样渲染。它读的是 archive/4 这个 32768 字节的文件,不发任何对外请求。

shiori 的归档详情页:左上角栞 shiori 标记,右上角 View Original,正文是抓取时存下的标题与内容

加一条书签 0.97 秒

抓一页本地静态页并归档,耗时 0.97 秒。它不是只存 URL,会把正文提取出来,命令行直接回显标题、摘要和标签。

步骤耗时 / 结果产物
加第 1 条(含归档)0.97 秒标题、摘要、标签各一行回显
加到 4 条库 73728 字节数据目录共 7 个文件
服务起来0.57 秒8085 端口可访问

归档是它的主要价值

回显里那行摘要就是从页面抓的正文,不是 meta 描述。源站改版或者下线以后,库里这份还在,73728 字节里存的是 4 条书签的正文。

加书签时服务器要能访问目标地址。目标在内网或者需要登录时,抓取会失败,这时候用 -o 只存链接不抓正文。

0.57 秒起一个书签站

shiori server 起来之后浏览器打开就是界面,不需要另配 nginx,也不依赖外部数据库。默认监听 8080,这次改成 8085 避开占用。

项值
启动到可访问0.57 秒
数据文件4 条书签共 7 个文件
数据库73728 字节的单文件 sqlite
依赖无,exe 自带

登录用的是内置账号

第一次打开是登录页,账号 shiori 配密码 gopher 就能进,这是打包时的默认值。进得去说明库里已经建好了一个管理员账号。

这个默认值必须改。库文件在数据目录里,谁拿到文件就等于拿到入口;改成自己的密码再往外暴露端口。

界面就三块

登录后是卡片式列表,左边一条窄导航,顶部一个搜索框。实测 4 张卡片并排铺开,标题分别是第 4 页 / 第 3 页 / 第 2 页和一篇用来测试离线归档的页面,每张显示摘要、标签与域名。

登录后的卡片列表:4 张卡片并排,第 1 张显示摘要、归档与测试两个标签、域名 127.0.0.1
区域实测内容用途
顶部搜索框占位文字 Search url, keyword or tags按标题、URL 与标签一起搜
卡片列表4 张卡片,倒序标题与摘要直接可读
左侧竖栏首页、设置、退出设置里改标签与主题
卡片右上编辑、删除、归档三个图标鼠标移上去才出现

标签在卡片上是可点的

加书签时用 -t 测试,归档 给了两个标签,界面上就是两个小胶囊。点其中一个等于按标签过滤,不用回搜索框打字。

标签也跟着存进 73728 字节的库里,导出时会写进 Netscape 书签格式,换工具不丢。

四个真会踩的地方

默认账号能直接进

账号 shiori 配 gopher 是打包默认值,实测首次登录就通了。端口一旦对外,等于把书签库敞开。

重启以后登录态失效

启动日志里有一行 warning:SHIORI_HTTP_SECRET_KEY 没设,用的随机值,重启会让所有会话失效。想保持登录,把这个环境变量固定下来。

两个数据目录的优先级

命令行参数和环境变量都在时,日志明确写 --storage-directory is set, overriding SHIORI_DIR。写错一处就会看到空库。

目标抓不到就只有链接

加书签时服务器访问不到目标地址,正文抓不下来,只剩标题和 URL。内网页面、需要登录的页面都属于这类,用 -o 明确只存链接。

和浏览器书签的差别在哪

同样存 4 个页面,浏览器书签栏占的是一条记录加一个缩略图,正文不在里面;shiori 占 237568 字节,其中 131072 字节是四条正文。差别就在这 131072 字节上。

做的事浏览器书签shiori v1.8.0
存标题与 URL存存
存正文快照不存存,每条 32768 字节
原站下线后还能读不能能,走本地 archive 文件
跨机器带走要登录账号同步拷 237568 字节的目录
搜索范围标题与 URL标题、URL 与标签
四条正文合计不占空间131072 字节
本次样本4 个页面4 条书签

它不抓图片以外的资源

归档存的是正文结构,不是整站镜像。外链图片和样式表按原地址加载,原站关掉以后图片位置是空的,文字还在。要连图一起留,得配 -o 之外的镜像方案,这一项本次没有验证。

启动日志里三行值得读

用 server 起服务时终端只打三行有用的信息,全部和「数据落在哪」有关。第一次跑就把这三行看完,后面省掉很多弯路。

--storage-directory is set, overriding SHIORI_DIR
warning: SHIORI_HTTP_SECRET_KEY not set, sessions reset on restart
listening on 127.0.0.1:8085
行含义要不要处理
第 1 行命令行参数盖掉了环境变量确认路径写对就行
第 2 行没设密钥,会话每次重启作废长期用就固定一个值
第 3 行实际监听地址,这里是 8085对外要改 0.0.0.0

一天存 20 条要占多少空间

按每条归档 32768 字节算,20 条是 655360 字节,一个月三十天约 19.6 MB。这个量级比装一个桌面客户端还小。

量归档字节折算
1 条3276832 KB
20 条655360640 KB
600 条(一个月 20 条)1966080018.75 MB
7300 条(两年每天 10 条)239206400228 MB

库本身不跟着涨那么多:73728 字节装 4 条索引,一万条也就是几兆。真正吃盘的是 archive 目录里的正文文件。

什么场景值得上

收藏技术文章、运维手册这类「过两年还要回头看」的页面最合适。4 条书签占 73728 字节,一千条也就几十兆,硬盘上不占地方。

要长期留存时,归档这份副本比书签本身值钱。源站改版、域名过期或者文章下架,书签里那行摘要还是 4 条里唯一留得下的东西。

反过来,只是存几个常去的网址,浏览器自带的书签栏够用。shiori 的价值在「内容留下来」,不在「链接记得住」。

项目数值
exe 字节35563008
zip 字节13398573
加一条书签0.97 秒
服务可访问0.57 秒
书签条数与库字节4 条 / 73728