返回

文章详情

书架 – 自托管的电子书库,运行在对象存储上

Hacker News2026年8月24日 23:00

一个自托管的图书馆,为您已经拥有的电子书提供服务。一个服务器渲染的页面列出了这些书籍,使用搜索框进行过滤,提供下载,并在浏览器中阅读 — EPUB 和 PDF,各自都有自己的阅读器 — 作为通过 R2 的 Cloudflare Worker,或作为在磁盘目录上的 Node 服务器。以上所有内容都可以通过 npm run demo 实现 — 一个生成的公共领域书目架子,因此可以在不先找书的情况下重复截图。开始使用 Node 24 或更高版本,以及类 Unix 系统:同步工具找到它的图像工具,因此不支持 Windows。封面效果更好,需要安装 cwebp 和 pdftoppm — 请参见发布,或者使用 Docker,它同时提供这两个工具。git clone https://github.com/murerkinn/bookshelf.git cd bookshelf npm install 将一些书籍(EPUB 或 PDF)放入 books/,然后选择图书馆的存放位置。使用 Docker 最简单的路径,并且镜像自带 cwebp 和 pdftoppm,因此封面效果正确,无需在宿主上安装任何东西。mkdir books && cp ~/Downloads/*.epub books/ docker compose run --rm sync --create docker compose up -d 然后书架在 http://localhost:3000 。标志参数会穿透,所以 docker compose run --rm sync --force 和 --dry-run 的行为与本地一致。一个命名卷 library 存储已发布的书籍和应用对它们写入的所有内容 — 配置文件和阅读位置 — 因此它是唯一需要备份的东西。该镜像为文件系统提供商构建:它是一个 Node 服务器,Cloudflare 不需要容器。它以非 root 用户运行,并创建 /data 由该用户拥有,因此命名卷继承应用可以写入的所有权。如果您更愿意绑定挂载主机目录,请先更改所有权:chown -R 1000:1000 /srv/bookshelf 在您拥有的机器上,无需 Docker 不需要任何地方的帐户。将 bookshelf.config.json 指向一个目录,发布到其中并运行应用:npm run sync -- --create # 构建 library/,然后发布到 shelf-data/ npm run build npm start -w @bookshelf/app library/ 是同步工具构建的树;目录是发布的地方,存放正在提供的书籍。将其保留在仓库之外 — shelf-data/ 已经是。关于 Cloudflare 需要一个 Cloudflare 帐户和 npx wrangler login。有两个已入库的文件携带此项目自己的桶和 Worker 名称,旨在进行编辑 — 请参见 R2 提供商。npm run sync -- --create # 创建桶,然后上传到其中 npm run deploy 这两个需要关于哪个桶存放图书馆达成一致,否则应用将提供一个空书架。在任何上传之前都会相互检查,如不匹配则会报告,而不是通过发布。一个演示书架 没有书籍在手,或者想要一些值得截图的东西?九本生成的公共领域书籍 — 八本 EPUB 和一本 PDF,因此两个阅读器都离书架只有一步之遥 — 不下载任何东西:npm run demo # 写入 books/ 然后通过上述任何方式发布和提供。书名和作者都是真实作品,早已超出版权,因此这些书籍看起来像个书架;内部的文本是占位符。请注意,这个仓库中的配置指向 R2,因此 npm run sync 会指向那里,除非您修改它。一个公共实例 任何陌生人可访问的内容都应该拒绝被更改:BOOKSHELF_READ_ONLY=1 存储继续提供服务并停止接受。无法添加、重命名或删除配置文件,阅读位置回归在浏览器中 — 与不能写入的提供程序相同的降级,因为对应用而言,这是相同的情况。切换现有配置文件仍然有效;那是一个 cookie,而不是更改。它在写入发生的地方强制执行,而不是通过隐藏表单,因此直接提交相关操作也会得到相同的拒绝。没有身份验证。任何可以访问该应用的人都可以阅读和下载整个图书馆,因此请将其放在您信任的网络上或在某些会询问身份的后面。参见尚未完成。命令 所有这些命令在仓库根目录运行;Turborepo 首先会构建任务所依赖的内容。npm run dev # 本地开发服务器,针对本地 R2 桶 npm run sync # 构建图书馆并将其上传到桶 npm run build # 构建每个工作区 npm run check-types # 检查每个工作区的类型 npm run preview # 本地构建 + 运行 Worker npm run deploy # 构建 + 部署到 Cloudflare Workers npm test # 测试套件 npm run lint # 整个仓库的 lint 工具 npm run cf-typegen -w @bookshelf/app 编辑 wrangler.jsonc 后重生 cloudflare-env.d.ts。文档 如何发布一个图书馆,同步工具,它的标志和封面 图书馆格式 最终呈现于桶的内容,以及为什么它是可再生的 存储提供商 合同,以及两个已交付提供商各自可以做什么 Cloudflare R2 配置、部署、在本地发布 文件系统 在您自己的机器或 VPS 上运行它 配置文件 谁在阅读,以及他们读到哪里 在浏览器中阅读 如何达到页面 架构 端口、适配器和组合根 演示图书馆 如何实现

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡