用于跟踪个人图书馆的BookLogr
什么是 BookLogr ?
BookLogr是一款网络应用,旨在帮助您轻松管理个人图书馆。这项自托管服务可确保您完全控制数据,提供安全且私密的方式来跟踪您拥有、阅读或希望阅读的所有书籍。您也可以选择向公众自豪地展示您的图书馆,与您的朋友和家人分享。

官方给的重要的提示:
- 该项目正在积极开发中。
- 预计会出现错误和重大变化。
BookLogr 和 Calibre 不同,并不提供书籍管理,而是类似于豆瓣的书影音档案,帮助用户收纳和归档自己的书籍,可以创建书单, 记录读书笔记,在阅读过程中,还可以对书籍进行打分、并写评论。这不仅有助于个人记录,也能与其他用户分享你的阅读体验。
BookLogr 跟老苏之前介绍过的 Koillection 或者 Ryot 有一定的相似之处。
构建镜像
官方没有提供镜像,但是 API 和认证服务提供了 Dockerfile,前端则没有,老苏只是为了体验一下,没有像往常采用多阶段构建,而是采用了开发模式构建
认证服务
构建镜像的基本命令如下👇
1 | # 拉取源代码 |
API 服务
构建镜像的基本命令如下👇
1 | # 拉取源代码 |
前端
需要准备一个 Dockerfile 文件,这是一个以开发模式运行的容器,包含了运行所需要的库
1 | # 使用 Node.js 作为基础镜像 |
构建镜像的基本命令如下👇
1 | # 假设你当前在 booklogr 目录, 需要进入子目录 |
顺便提一句,老苏所有折腾过的
dockerfile都上传到了Github:https://github.com/wbsu2003/Dockerfile/
反向代理
API 服务采用了 Python Flask 开发,所以又遇到了我们熟悉的跨域问题
1 | Access to XMLHttpRequest at 'http://192.168.0.197:5004/v1/books' from origin 'http://192.168.0.197:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. |
没有找到相关的设置,所以还是使用 npm 来解决。由于不涉及公网访问,本文还是采用了 tailscale + npm 方案
文章传送门:用自定义域名访问tailscale节点
假设我们访问地址如下:
| 域名 | 局域网地址 | 备注 |
|---|---|---|
book.xxsu.cf |
http://192.168.0.197:5173 |
前端 web 的访问地址 |
api.xxsu.cf |
http://192.168.0.197:5004 |
API 服务的访问地址 |
auth.xxsu.cf |
http://192.168.0.197:5003 |
认证服务的访问地址 |
前端在 npm 中的设置,另外两个服务除了域名和端口,其他是一样的

SSL 中照例都勾选了

API 服务和认证服务的设置到此就结束了,但是前端 Web 还有个关键的步骤,需要在 Advanced 中填入下面的内容
1 | location /v1 { |

这段代码的作用就是:
- 为所有
/v1开头的请求设置CORS头,允许来自https://book.xxsu.cf的跨域请求; - 将所有这些请求代理到本地的
5004端口服务,也就是API服务;
所以你要根据自己的域名和 IP 进行修改
安装
因为涉及到多个容器,所以采用 docker-compose 方式安装
env.txt
首先要准备一个 env.txt 文件
1 | FLASK_APP=api.app |
做个简单说明:
DATABASE_URL:如果数据库的相关设置做了修改,这里也要跟着变;AUTH_SECRET_KEY:随机字符串;AUTH_ALLOW_REGISTRATION:是否允许未经身份验证的用户注册账户;AUTH_REQUIRE_VERIFICATION:当允许注册时,是否求用户验证其电子邮件地址;GOOGLE_CLIENT_ID:如果您想允许使用Google进行身份验证,请将其更改为您自己的Google客户端ID,如果你不使用,保留默认就可以,千万别注释,会导致页面白屏;GOOGLE_CLIENT_SECRET:Google客户端密钥;POSTGRES_USER:数据库用户;POSTGRES_PASSWORD:数据库用户对应的密码;POSTGRES_DB:数据库库名;VITE_API_ENDPOINT:booklogr API服务的URL;VITE_AUTH_API_URL:认证服务的URL;VITE_GOOGLE_CLIENT_ID:需跟GOOGLE_CLIENT_ID一致;VITE_DISABLE_HOMEPAGE:删除主页并直接重定向到登录页面或库(如果您已经登录)。
更多环境变量的说明,请参考官方的 wiki:https://github.com/Mozzo1000/booklogr/wiki/ENV-variables
docker-compose.yml
将下面的内容保存为 docker-compose.yml 文件
1 | services: |
然后执行下面的命令
1 | # 新建文件夹 booklogr 和 子目录 |
文件结构如下

如果一切正常,应该有 5 个容器

运行
在浏览器中输入 https://book.xxsu.cf 就能看到主界面

第一次需要 Register 自己的账号

如果显示需要验证码,不用管它,直接 Login 就行

登录成功后的主界面

搜索一本书
需要将
openlibrary.org加入到科学网的黑名单,否则是搜不到内容的

点 Add to list 将书加入书单

可以选择阅读状态

添加成功会有提示

在 My Library 中进入相应的状态,可以找到添加的书籍

在 Profile 中查看

点 Open Library 会跳转到相应的网站
Open Library是一个开放的、可编辑的图书馆目录,旨在为每本出版过的书籍创建一个网页。截至2018年10月,该平台已经收录了超过36万本书籍。这个项目类似于维基百科,用户可以自由地编辑和贡献内容。

下拉可以借阅

随便翻一翻

如果看书完了,可以 Set as finished,然后可以打分,并分享到 Mastodon

还可以写Notes

Add note

随便写点啥

在书库里会有相应的显示

参考文档
Mozzo1000/booklogr: A simple, self-hosted service to keep track of your personal library 📚
地址:https://github.com/Mozzo1000/booklogrBookLogr
地址:https://demo.booklogr.appHome · Mozzo1000/booklogr Wiki
地址:https://github.com/Mozzo1000/booklogr/wikiinternetarchive/openlibrary: One webpage for every book ever published!
地址:https://github.com/internetarchive/openlibrary