
BookLore 是一款用于组织、管理和阅读个人书籍(包括 PDF、EPUB 电子书等)的自托管 Web 应用程序。它提供直观、响应式的用户界面,使用户可以在家庭 NAS 或服务器上集中管理书籍收藏、跟踪阅读进度,并通过 Web 浏览器直接阅读或将目录推送到其他阅读设备。该项目开源托管于 GitHub,适合技术爱好者和有大量电子书的用户构建私人图书库。
BookLore 不依赖任何第三方云服务,所有数据托管在自己控制的环境中,用户对自己的图书和阅读记录拥有完全控制权。
项目地址:https://github.com/booklore-app/BookLore

核心特点
- 自托管部署:完全运行在 NAS 或个人服务器上,数据与隐私完全由用户掌控
- 现代化 Web 界面:响应式设计,支持桌面端与移动端浏览和阅读
- 图书集中管理:通过图书馆(Library)与书架(Shelf)结构对电子书进行分类整理
- 自动元数据识别:支持自动获取书籍封面、作者、简介等元数据,也可手动编辑
- 内置在线阅读器:直接在浏览器中阅读 EPUB、PDF,并记录阅读进度
- 多用户支持:可创建多个账号并分配不同访问与管理权限
- Docker 友好:官方推荐使用 Docker / Docker Compose,适合 NAS 环境快速部署
搭建部署
BookLore 推荐通过 Docker + Docker Compose 安装部署,适合在支持 Docker 的 NAS(如 Synology、QNAP)上运行。本次教程将以 Compose 的形式在群晖 NAS 上进行部署。
创建书籍目录
首先在群晖 NAS 中新建一个用于存放所有电子书的共享文件夹。

记得在配置用户权限时,给 ContainerManager 用户分配读写权限,以便 Docker 容器能够访问该目录。

创建完成后,将你的电子书文件上传到这个文件夹中。

创建持久化目录与配置文件
接下来,需要为 BookLore 创建持久化存储目录和配置文件。通常,我们可以将 Docker 相关的配置统一放在一个名为 docker 的文件夹中。
使用群晖的文本编辑器,在打算存放配置的目录(例如 /volume1/docker/BookLore)下创建一个名为 env.txt 的文件,并填入以下环境变量配置。

BOOKLORE_IMAGE_TAG=latest
TZ=Asia/Shanghai
# 这里自行配置一个强密码
MYSQL_ROOT_PASSWORD=设置一个复杂的密码
# 这个是存放持久化文件路径的位置,根据自己的目录进行修改
BOOKLORE_DATA_PATH=/volume1/docker/BookLore/data
BOOKLORE_BOOKDROP_PATH=/volume1/docker/BookLore/bookdrop
MARIADB_CONFIG_PATH=/volume1/docker/BookLore/config
# 这是存放书籍的共享文件夹的位置
BOOKLORE_BOOKS_PATH=/volume1/书籍专区
请注意:请将上述路径中的 /volume1/docker/BookLore 和 /volume1/书籍专区 替换为你自己 NAS 上的实际路径。
编辑完成后,将此文件重命名为 .env。这个文件将为我们后续的 Docker Compose 配置提供环境变量。

创建并启动容器
配置文件准备就绪后,打开群晖的 Container Manager。在“项目”标签页中,点击“新增”来创建一个新项目。项目名称可以自定义(例如 booklore),路径则选择我们刚刚创建了 .env 文件的持久化目录(如 /docker/BookLore)。

来源选择 “创建 docker-compose.yml”,然后将以下 docker-compose.yml 配置内容粘贴到编辑框中。为了加速镜像拉取,配置中已替换为国内的镜像加速地址。
services:
booklore:
image: ghcr.milu.moe/booklore-app/booklore:${BOOKLORE_IMAGE_TAG}
container_name: booklore
environment:
- TZ=${TZ}
- DATABASE_URL=jdbc:mariadb://mariadb:3306/booklore
- DATABASE_USERNAME=booklore
- DATABASE_PASSWORD=${MYSQL_ROOT_PASSWORD}
- BOOKLORE_PORT=6060
- SWAGGER_ENABLED=false
- FORCE_DISABLE_OIDC=false
depends_on:
mariadb:
condition: service_healthy
ports:
- "6060:6060"
volumes:
- ${BOOKLORE_DATA_PATH}:/app/data
- ${BOOKLORE_BOOKS_PATH}:/books
- ${BOOKLORE_BOOKDROP_PATH}:/bookdrop
healthcheck:
test: wget -q -O - http://localhost:6060/api/v1/healthcheck
interval: 60s
retries: 5
start_period: 60s
timeout: 10s
restart: unless-stopped
mariadb:
image: docker.1ms.run/linuxserver/mariadb:11.4.8
container_name: mariadb
environment:
- TZ=${TZ}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=booklore
- MYSQL_USER=booklore
- MYSQL_PASSWORD=${MYSQL_ROOT_PASSWORD}
volumes:
- ${MARIADB_CONFIG_PATH}:/config
restart: unless-stopped
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
interval: 5s
timeout: 5s
retries: 10
粘贴完成后,点击“下一步”,Container Manager 便会开始根据配置拉取镜像并构建容器。

访问并初始化服务
当容器状态显示为“运行中”后,便可以通过 http://你的NAS_IP:6060 来访问 BookLore 服务。首次访问时,需要设置一个初始的管理员账户。

创建完管理员账户后,系统会自动登录并进入主界面。

创建书库并导入书籍
现在,我们需要创建一个“图书馆”来容纳你的电子书。在主界面点击 “Create Your Library” 按钮开始创建。
第一步是设置图书馆的基本信息,如名称、图标和导入偏好。建议导入模式选择 “Each file is a book (Recommended)”。

第二步是关键,需要添加包含书籍文件的目录。点击 “Add Book Folder”,然后浏览并选择我们在 Docker Compose 配置中映射的 /books 目录(它对应着NAS上的“书籍专区”共享文件夹)。

添加完成后,点击 “Create Library”。BookLore 会自动扫描该目录下的电子书文件。稍等片刻,刷新页面,你就可以在图书馆中看到已成功导入的书籍,并且大部分书籍的封面、作者等元数据已被自动抓取。

点击任意一本书籍,即可使用内置的阅读器开始阅读,体验流畅的在线阅读。

至此,一个功能强大的私有电子书库就搭建完成了。通过将 BookLore 部署在家庭 NAS 上,你不仅实现了数据的完全自主,还获得了媲美商业应用的书籍管理和阅读体验。这正体现了 自托管 和 DevOps 实践在个人数字生活中的价值。如果你对更多有趣的 自托管项目 或技术分享感兴趣,欢迎在 云栈社区 与我们交流探讨。