什么是 BookLogr ?
BookLogr
是一款网络应用,旨在帮助您轻松管理个人图书馆。这项自托管服务可确保您完全控制数据,提供安全且私密的方式来跟踪您拥有、阅读或希望阅读的所有书籍。您也可以选择向公众自豪地展示您的图书馆,与您的朋友和家人分享。
官方给的重要的提示:
- 该项目正在积极开发中。
- 预计会出现错误和重大变化。
BookLogr
和 Calibre
不同,并不提供书籍管理,而是类似于豆瓣的书影音档案,帮助用户收纳和归档自己的书籍,可以创建书单, 记录读书笔记,在阅读过程中,还可以对书籍进行打分、并写评论。这不仅有助于个人记录,也能与其他用户分享你的阅读体验。
BookLogr
跟老苏之前介绍过的 Koillection
或者 Ryot
有一定的相似之处。
构建镜像
官方没有提供镜像,但是 API
和认证服务提供了 Dockerfile
,前端则没有,老苏只是为了体验一下,没有像往常采用多阶段构建,而是采用了开发模式构建
认证服务
构建镜像的基本命令如下👇
# 拉取源代码
git clone https://github.com/Mozzo1000/auth-server.git
# 进入代码目录
cd auth-server
# 构建镜像
docker build -t wbsu2003/auth-server:v1 .
API 服务
构建镜像的基本命令如下👇
# 拉取源代码
git clone https://github.com/Mozzo1000/booklogr.git
# 进入代码目录
cd booklogr
# 构建镜像
docker build -t wbsu2003/booklogr:v1 .
前端
需要准备一个 Dockerfile
文件,这是一个以开发模式运行的容器,包含了运行所需要的库
# 使用 Node.js 作为基础镜像
FROM node:20.16
# 设置工作目录
WORKDIR /app
# 复制项目文件到工作目录
COPY . .
# 安装项目依赖
RUN npm install
# 运行 Vite 开发服务器
CMD ["npm", "run", "dev", "--", "--host"]
构建镜像的基本命令如下👇
# 假设你当前在 booklogr 目录, 需要进入子目录
cd web
# 将 Dockerfile 放入当前目录
# 构建镜像
docker build -t wbsu2003/booklogr-web:v1 .
顺便提一句,老苏所有折腾过的
dockerfile
都上传到了Github
:https://github.com/wbsu2003/Dockerfile/
反向代理
API
服务采用了 Python Flask
开发,所以又遇到了我们熟悉的跨域问题
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
中填入下面的内容
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
文件
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_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
文件
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
然后执行下面的命令
# 新建文件夹 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
是一个开放的、可编辑的图书馆目录,旨在为每本出版过的书籍创建一个网页。截至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/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