用于跟踪个人图书馆的BookLogr

什么是 BookLogr ?

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

官方给的重要的提示:

  • 该项目正在积极开发中。
  • 预计会出现错误和重大变化。

BookLogrCalibre 不同,并不提供书籍管理,而是类似于豆瓣的书影音档案,帮助用户收纳和归档自己的书籍,可以创建书单记录读书笔记,在阅读过程中,还可以对书籍进行打分、并写评论。这不仅有助于个人记录,也能与其他用户分享你的阅读体验。

BookLogr 跟老苏之前介绍过的 Koillection 或者 Ryot 有一定的相似之处。

构建镜像

官方没有提供镜像,但是 API 和认证服务提供了 Dockerfile,前端则没有,老苏只是为了体验一下,没有像往常采用多阶段构建,而是采用了开发模式构建

认证服务

构建镜像的基本命令如下👇

1
2
3
4
5
6
7
8
# 拉取源代码
git clone https://github.com/Mozzo1000/auth-server.git

# 进入代码目录
cd auth-server

# 构建镜像
docker build -t wbsu2003/auth-server:v1 .

API 服务

构建镜像的基本命令如下👇

1
2
3
4
5
6
7
8
# 拉取源代码
git clone https://github.com/Mozzo1000/booklogr.git

# 进入代码目录
cd booklogr

# 构建镜像
docker build -t wbsu2003/booklogr:v1 .

前端

需要准备一个 Dockerfile 文件,这是一个以开发模式运行的容器,包含了运行所需要的库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用 Node.js 作为基础镜像
FROM node:20.16

# 设置工作目录
WORKDIR /app

# 复制项目文件到工作目录
COPY . .

# 安装项目依赖
RUN npm install

# 运行 Vite 开发服务器
CMD ["npm", "run", "dev", "--", "--host"]

构建镜像的基本命令如下👇

1
2
3
4
5
6
7
# 假设你当前在 booklogr 目录, 需要进入子目录
cd web

# 将 Dockerfile 放入当前目录

# 构建镜像
docker build -t wbsu2003/booklogr-web:v1 .

顺便提一句,老苏所有折腾过的 dockerfile 都上传到了 Githubhttps://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
2
3
4
location /v1 {
add_header 'Access-Control-Allow-Origin' 'https://book.xxsu.cf';
proxy_pass http://192.168.0.197:5004;
}

这段代码的作用就是:

  • 为所有 /v1 开头的请求设置 CORS 头,允许来自 https://book.xxsu.cf 的跨域请求;
  • 将所有这些请求代理到本地的 5004 端口服务,也就是 API 服务;

所以你要根据自己的域名和 IP 进行修改

安装

因为涉及到多个容器,所以采用 docker-compose 方式安装

env.txt

首先要准备一个 env.txt 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FLASK_APP=api.app
FLASK_DEBUG=1
DATABASE_URL=postgresql://admin:password@booklogr-db/booklogr
AUTH_SECRET_KEY=ufmmCydg3sBhJa9zuWvgyfUoFzMXzVqjzdXzhWy9
AUTH_ALLOW_REGISTRATION=True
AUTH_REQUIRE_VERIFICATION=False
GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=xxx

# docker-compose
POSTGRES_USER=admin
POSTGRES_PASSWORD=password
POSTGRES_DB=booklogr

# web
VITE_API_ENDPOINT="https://api.xxsu.cf/"
VITE_AUTH_API_URL="https://auth.xxsu.cf"
VITE_GOOGLE_CLIENT_ID=xxx.apps.googleusercontent.com
VITE_DISABLE_HOMEPAGE=true

做个简单说明:

  • 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_ENDPOINTbooklogr API 服务的 URL
  • VITE_AUTH_API_URL:认证服务的 URL
  • VITE_GOOGLE_CLIENT_ID:需跟 GOOGLE_CLIENT_ID 一致;
  • VITE_DISABLE_HOMEPAGE:删除主页并直接重定向到登录页面或库(如果您已经登录)。

更多环境变量的说明,请参考官方的 wikihttps://github.com/Mozzo1000/booklogr/wiki/ENV-variables

docker-compose.yml

将下面的内容保存为 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
services:
booklogr-web:
image: wbsu2003/booklogr-web
container_name: "booklogr-web"
ports:
- 5173:5173
env_file:
- env.txt
depends_on:
- auth-api
- booklogr-api

booklogr-db:
container_name: "booklogr-db"
image: "postgres" # use latest official postgres version
# ports:
# - 5432:5432
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
env_file:
- env.txt
volumes:
- ./bdata:/var/lib/postgresql/data/ # persist data even if container shuts down

booklogr-api:
image: wbsu2003/booklogr:v1
container_name: "booklogr-api"
depends_on:
booklogr-db:
condition: service_healthy
env_file:
- env.txt
ports:
- 5004:5000

auth-db:
image: "postgres" # use latest official postgres version
container_name: "booklogr-auth-server-db"
# ports:
# - 5433:5432
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
environment:
POSTGRES_USER: "admin" # CHANGE THIS FOR USE IN PRODUCTION!
POSTGRES_PASSWORD: "password" # CHANGE THIS FOR USE IN PRODUCTION!
POSTGRES_DB: "auth-server"
volumes:
- ./adata:/var/lib/postgresql/data/ # persist data even if container shuts down

auth-api:
image: wbsu2003/auth-server:v1
container_name: "booklogr-auth-server-api"
depends_on:
auth-db:
condition: service_healthy
restart: always
environment:
FLASK_APP: "api.app"
DATABASE_URL: "postgresql://admin:password@auth-db/auth-server" # CHANGE THIS FOR USE IN PRODUCTION! Needs to be the same as the credentials in auth-db
env_file:
- env.txt
ports:
- 5003:5000

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 booklogr 和 子目录
mkdir -p /volume1/docker/booklogr/{adata,bdate}

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

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

# 一键启动
docker-compose up -d

文件结构如下

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

运行

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

第一次需要 Register 自己的账号

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

登录成功后的主界面

搜索一本书

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

Add to list 将书加入书单

可以选择阅读状态

添加成功会有提示

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

Profile 中查看

Open Library 会跳转到相应的网站

Open Library 是一个开放的、可编辑的图书馆目录,旨在为每本出版过的书籍创建一个网页。截至 201810 月,该平台已经收录了超过 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/booklogr

BookLogr
地址:https://demo.booklogr.app

Home · Mozzo1000/booklogr Wiki
地址:https://github.com/Mozzo1000/booklogr/wiki

internetarchive/openlibrary: One webpage for every book ever published!
地址:https://github.com/internetarchive/openlibrary