Booklore自建图书馆

最近体验了一款开源自托管电子书管理系统------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

相关推荐
optimistic_chen3 小时前
【Docker入门】Docker Image(Docker 镜像)
linux·运维·docker·容器·镜像
小林up3 小时前
Ubuntu使用阿里云安装docker
ubuntu·阿里云·docker
爱莉希雅&&&3 小时前
Docker 超详细全量笔记(含参数解释)
linux·运维·服务器·笔记·docker·容器
橙露3 小时前
Docker 容器化运维:镜像优化、容器编排与持久化存储方案
java·运维·docker
TDengine (老段)3 小时前
初学者使用 docker 快速体验 TDengine 功能
大数据·物联网·docker·容器·时序数据库·tdengine
德育处主任Pro4 小时前
『NAS』推荐几个绿联 NAS Docker 能用的镜像加速器
运维·docker·容器
Hello.Reader4 小时前
Flink 2.2 从本地 Standalone 到 Docker/Kubernetes,把 Hive 批流打通,并在 SQL 里接入 OpenAI 推理
docker·flink·kubernetes
J2虾虾14 小时前
Docker启动超时,吓得我一身汗
运维·docker·容器
码农小卡拉14 小时前
Ubuntu22.04 安装 Docker 及 Docker Compose v2 详细教程
ubuntu·docker·容器