
最近体验了一款开源自托管电子书管理系统------BookLore,感觉非常适合个人或小型社群搭建自己的数字图书馆。它支持多种电子书格式,拥有现代化的网页界面和多用户功能,能自动抓取封面和元数据,还支持OPDS和第三方阅读器同步。安装上手也比较简单,支持Docker部署。日常管理如新建Library、上传书籍、书架分类都很方便,统计和设置也很强大。唯一要注意的是资源消耗较高,适合配置稍高一点的服务器。
最近一直在找一个能放电子书的地方,也不算是一个仓库。但至少是平时要看的书可以放在这里,因为是通过Web打开,所以在不同的终端上可以保持相同的进度和书签。曾经使用过Calibre‑Web,这个是用得最多的,但是感觉UI比较传统。当然了,我是比较无知的,可能会有更好的项目。
1. 介绍
BookLore 是一款 自托管(Self‑Hosted)数字图书管理系统,旨在帮助用户优雅地管理、组织并阅读个人电子书收藏。它提供现代化、响应式的网页界面,支持多用户访问、多格式阅读、自动元数据抓取、智能书架等功能,让你可以在完全掌控数据的前提下,搭建属于自己的私有数字图书馆。
作为一个开源项目,BookLore 支持 EPUB、PDF、CBZ/CBX 等格式,并能从 Goodreads、Amazon、Google Books 等来源自动获取书籍封面与信息,实现"放进去即可归档"的顺畅体验。此外,它还提供多用户权限控制、BookDrop 自动导入、OPDS 支持、KOReader/Kobo 同步等高级功能,非常适合个人读者、家庭使用者、小型阅读社群,或希望替代 Calibre Web 的用户。
2. 安装
2.1 官方安装
官方Github上提供的安装操作已经足够用了,可以直接跑起来。
创建一个.env文件,包含如下信息。
plain
# 🎯 BookLore Application Settings
APP_USER_ID=0
APP_GROUP_ID=0
TZ=Etc/UTC
BOOKLORE_PORT=6060
# 🗄️ Database Connection (BookLore)
DATABASE_URL=jdbc:mariadb://mariadb:3306/booklore
DB_USER=booklore
DB_PASSWORD=ChangeMe_BookLoreApp_2025!
# 🔧 MariaDB Container Settings
DB_USER_ID=1000
DB_GROUP_ID=1000
MYSQL_ROOT_PASSWORD=ChangeMe_MariaDBRoot_2025!
MYSQL_DATABASE=booklore
Docker Compose文件内容如下。
yaml
services:
booklore:
image: booklore/booklore:latest
# Alternative: Use GitHub Container Registry
# image: ghcr.io/booklore-app/booklore:latest
container_name: booklore
environment:
- USER_ID=${APP_USER_ID}
- GROUP_ID=${APP_GROUP_ID}
- TZ=${TZ}
- DATABASE_URL=${DATABASE_URL}
- DATABASE_USERNAME=${DB_USER}
- DATABASE_PASSWORD=${DB_PASSWORD}
- BOOKLORE_PORT=${BOOKLORE_PORT}
depends_on:
mariadb:
condition: service_healthy
ports:
- "${BOOKLORE_PORT}:${BOOKLORE_PORT}"
volumes:
- ./data:/app/data
- ./books:/books
- ./bookdrop:/bookdrop
healthcheck:
test: wget -q -O - http://localhost:${BOOKLORE_PORT}/api/v1/healthcheck
interval: 60s
retries: 5
start_period: 60s
timeout: 10s
restart: unless-stopped
mariadb:
image: lscr.io/linuxserver/mariadb:11.4.5
container_name: mariadb
environment:
- PUID=${DB_USER_ID}
- PGID=${DB_GROUP_ID}
- TZ=${TZ}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
volumes:
- ./mariadb/config:/config
restart: unless-stopped
healthcheck:
test: [ "CMD", "mariadb-admin", "ping", "-h", "localhost" ]
interval: 5s
timeout: 5s
retries: 10
2.2 HTTPS
我的老习惯,肯定是放在Nginx反代的后面,提供HTTPS的连接。区别就是不需要再映射端口到外面了。还需要添加一个booklore的Docker网络,然后将booklore放到nginx的Docker网络中就OK了。
yaml
services:
booklore:
image: ghcr.io/booklore-app/booklore:latest
container_name: booklore
environment:
- USER_ID=${APP_USER_ID}
- GROUP_ID=${APP_GROUP_ID}
- TZ=${TZ}
- DATABASE_URL=${DATABASE_URL}
- DATABASE_USERNAME=${DB_USER}
- DATABASE_PASSWORD=${DB_PASSWORD}
- BOOKLORE_PORT=${BOOKLORE_PORT}
depends_on:
mariadb:
condition: service_healthy
expose:
- 6060
networks:
- nginx
- booklore
volumes:
- ./data:/app/data
- ./books:/books
- ./bookdrop:/bookdrop
healthcheck:
test: ["CMD-SHELL", "wget -q -O - http://localhost:${BOOKLORE_PORT}/api/v1/healthcheck || exit 1"]
interval: 60s
retries: 5
start_period: 60s
timeout: 10s
restart: unless-stopped
mariadb:
image: lscr.io/linuxserver/mariadb:11.4.5
container_name: mariadb
environment:
- PUID=${DB_USER_ID}
- PGID=${DB_GROUP_ID}
- TZ=${TZ}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASSWORD}
networks:
- booklore
volumes:
- ./mariadb/config:/config
restart: unless-stopped
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
interval: 5s
timeout: 5s
retries: 10
networks:
nginx:
external: true
booklore:
external: true
Nginx的配置文件我就抄别的APP的,改了一下反代的地址。
plain
server {
listen 443 ssl;
server_name YOUR_DOMAIN_NAME;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
# SSL/TLS Security Settings
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
# Enable HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://booklore:6060;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 50M;
}
}
3. 使用教程
新建完会让你设置admin的账号密码,然后就可以登录了。进来之后需要新建Library,才能上传书籍。有书之后的界面如下:

3.1 新建Library


新建Library需要指定在存在哪个系统的文件夹。因为是使用的Docker镜像,我们只映射了这两个文件夹,所以就选book就行了。Library就是图书馆,一个就够用了。分类可以靠书架Shelf。另一个bookdrop文件夹,是支持扫描新加图书的位置。

3.2 新建Shelf
书架就是对一类书的包含,直接新建就可以了。

3.3 上传书籍
上传有两种方式,一种就是通过我们刚才新建的Library。上传之后,需要重新刷新页面才能显示新上传的书籍。

还有一种方式就是通过另一个选项Bookdrop。

到这个Bookdrop区域,然后选择放到哪个Library里。对于一次上传多个文件,且需要放到不同的Library的情况下还是有用的。对于单Library的话,就更繁琐了。

3.4 书籍详情页
在All Books,Library或是Shelves里,鼠标放到书上会有两个图标。上面的是详情页,下面的直接阅读。

更新封面和详细信息
譬如这本书没有封面和详细信息,可以通过Search Metadata,单箭头来更新封面,双箭头更新详细信息,最后保存。


其它选项
可以给书籍打分,写笔记,还可以将书籍发送到邮箱。

3.5 打开书籍
它自带PDF和EPUB的阅读器。下面是PDF的阅读器的样子。

下面是EPUB的阅读器,感觉像是IPAD的IBOOK的感觉。


3.6 统计数据
它的统计功能实在是强大了,有Library和阅读信息的统计。对于喜欢数据的朋友来说是福音了。


3.7 设置
有各种的设置,包括阅读器,详细信息,邮件,用户,认证,设备等。

4. 资源消耗
由于后端是用Java写的,所以资源的消耗是相对比较高的。

现在是只有我一个用户,空闲的时候,占用400多M的内存。上传文件和打开书籍时,CPU和内存的占用都会提高。再加上数据库,一个人用的多时候会用到将近700M的内存。对于2核2G的轻量服务器,也就算是刚好够用吧,毕竟还得有几个其它的服务。

📚 延伸阅读
更多内容持续更新于我的博客:https://www.zenseek.site