不用数据库也能建电子书库?Bookhoarder 让我把 EPUB 全搬进群晖

简介

什么是 Bookhoarder ?

Bookhoarder 是一个开源的 EPUB 电子书库,无需数据库,仅使用对象存储即可持久化所有数据。它可以帮助用户在一台设备上集中管理 EPUB 收藏,并在浏览器中直接阅读。

主要特点

  • 浏览器内阅读:基于 epub.js 的在线阅读器,支持按用户记录阅读进度、评分和书架。
  • 元数据管理:通过 Open Library 自动查询书籍元数据和封面,也支持手动编辑;可为每本书添加标签和系列信息,并支持标签过滤。
  • 智能书架:自动计算「未读」「正在阅读」「已完成」「五星」等智能书架,方便快速筛选。
  • 多用户支持:支持 admin/reader 多角色,可为每个用户设置独立密码。
  • 推送与下载:支持通过 SMTP 将书籍发送到电子阅读器,并提供 OPDS 目录源(/opds),可直接从兼容 OPDS 的阅读器应用浏览和下载。
  • 一键备份:管理员可在设置中一键备份,默认仅导出元数据,也可完整导出包含所有 EPUB 和封面。
  • PWA 支持:可安装为 PWA,从手机或桌面主屏幕快速访问。
  • 可插拔存储:存储驱动支持本地磁盘或 S3 兼容对象存储(MinIOCloudflare R2Backblaze B2),并支持目录前缀以便共享存储桶。
  • 开源免费:基于 AGPL-3.0 协议开源,可免费使用和修改。

应用场景

  • 个人电子书收藏:集中管理本地 EPUB 文件,上传后即可在浏览器中阅读,无需额外阅读器。
  • 家庭共享书库:多用户 + 角色权限,家庭成员可共用一套书库,各人阅读进度互不干扰。
  • 电子阅读器联动:通过 OPDS 目录或 SMTP 推送,把书直接传到 Kindle 等设备上阅读。
  • 开发者测试:官方提供 docker compose up 一键启动(含本地 MinIO),开发人员可以快速搭建测试环境。

Bookhoarder界面截图

Bookhoarder 是一个「上传即读、无需数据库」的轻量级 EPUB 电子书库。

安装

在群晖上以 Docker 方式安装。

本文写作时, 官方预构建镜像 ghcr.io/bookhoard/bookhoarderlatest 版本对应为 v0.20.0

提示:该项目包含多个服务,建议使用 docker-compose 进行部署,可以自动处理服务间的依赖关系。appBookhoarder 本体)+ minio(本地 S3 存储)+ minio-init(自动创建存储桶)。其中 minio-init 会在 minio 健康检查通过后自动创建 bookhoard 存储桶,app 服务会等存储桶就绪后才启动。

docker-compose 安装

采用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
version: '3.8'

services:
app:
image: ghcr.io/bookhoard/bookhoarder:latest # 官方预构建镜像
container_name: bookhoarder
restart: unless-stopped
ports:
- "3278:3000" # Web 界面
environment:
STORAGE_DRIVER: s3
S3_ENDPOINT: http://minio:9000 # 指向本地的 MinIO 服务
S3_BUCKET: bookhoard # 存储桶名称
S3_ACCESS_KEY: bookhoard # MinIO 访问密钥
S3_SECRET_KEY: bookhoard123 # MinIO 密钥
# S3_PREFIX: "" # 可选:与其他应用共享存储桶时,指定子目录前缀
depends_on:
- minio-init

minio:
image: minio/minio:latest
container_name: bookhoarder-minio
restart: unless-stopped
command: server /data --console-address ":9001"
ports:
- "19000:9000" # S3 API
- "19001:9001" # MinIO 管理界面
volumes:
- ./data/minio:/data # MinIO 数据持久化
environment:
MINIO_ROOT_USER: bookhoard
MINIO_ROOT_PASSWORD: bookhoard123
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 5s
retries: 5

minio-init:
image: minio/mc:latest
container_name: bookhoarder-minio-init
depends_on:
minio:
condition: service_healthy
entrypoint: >
/bin/sh -c "
mc alias set local http://minio:9000 bookhoard bookhoard123 &&
mc mb --ignore-existing local/bookhoard
"

注意:如果 docker-compose 的版本支持,建议将

1
2
depends_on:
- minio-init

改为

1
2
3
depends_on:
minio-init:
condition: service_completed_successfully

然后通过 SSH 登录到您的群晖,执行下面的命令:

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 bookhoarder 和 子目录
mkdir -p /volume1/docker/bookhoarder/data/minio

# 进入 bookhoarder 目录
cd /volume1/docker/bookhoarder

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中访问 http://<群晖IP>:3278 即可进入 Web 界面

MinIO 管理界面可通过 http://<群晖IP>:19001 访问(账号 bookhoard / 密码 bookhoard123)。

首次使用会创建第一个用户(Profile),该用户自动成为管理员,如果觉得看着不爽,可以改显示的名字

进入 Library 上传 EPUB 文件

上传完成之后

在书库中点击书籍即可在线阅读

或通过 OPDS 目录(/opds)在电子阅读器应用中浏览下载

注意事项

  1. 数据持久化MinIO 的数据目录 ./data/minio 已挂载到宿主机;如果删除该目录,所有书籍和元数据都会丢失,请注意备份。
  2. 端口冲突:默认占用 3278Web)、19000S3 API)、19001MinIO 管理界面)三个端口,如被占用需修改映射。
  3. 默认凭据MinIO 默认账号密码为 bookhoard / bookhoard123,生产环境建议修改,并同步更新 app 服务中的 S3_ACCESS_KEYS3_SECRET_KEY
  4. 复用现有 S3:如果已经有 MinIOCloudflare R2Backblaze B2,可以去掉 miniominio-init 服务,只保留 app 并把 S3_ENDPOINT 指向你的存储服务。
  5. Open Library 限流:建议设置 OPENLIBRARY_CONTACT 为邮箱或联系 URL,元数据和封面查询的速率限制可提升 3 倍(3 req/s vs 1 req/s)。
  6. 许可证:项目采用 AGPL-3.0,自托管使用没有问题;如果修改后作为网络服务对外提供,需向用户开放修改后的源码。
  7. 安全建议:为每个用户设置独立密码,管理员账号不要使用弱密码。

参考文档

bookhoard/bookhoarder: Self-hosted EPUB library — no database, just object storage
地址:https://github.com/bookhoard/bookhoarder

Bookhoarder - 官方网站
地址:https://bookhoarder.dev

Bookhoarder - 官方文档
地址:https://docs.bookhoarder.dev

Deploy with Docker | Bookhoarder
地址:https://docs.bookhoarder.dev/deployment/docker

Storage backends - Local disk | S3 | Cloudflare R2
地址:https://docs.bookhoarder.dev/storage

minio/minio - Docker 镜像
地址:https://hub.docker.com/r/minio/minio