用于跟踪个人图书馆的BookLogr
什么是 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-webcontainer_name: "booklogr-web"ports:- 5173:5173env_file:- env.txtdepends_on:- auth-api- booklogr-apibooklogr-db:container_name: "booklogr-db"image: "postgres" # use latest official postgres version# ports:# - 5432:5432 restart: alwayshealthcheck:test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]interval: 10stimeout: 5sretries: 5env_file:- env.txtvolumes:- ./bdata:/var/lib/postgresql/data/ # persist data even if container shuts downbooklogr-api:image: wbsu2003/booklogr:v1container_name: "booklogr-api"depends_on:booklogr-db:condition: service_healthyenv_file:- env.txtports:- 5004:5000auth-db:image: "postgres" # use latest official postgres versioncontainer_name: "booklogr-auth-server-db"# ports:# - 5433:5432restart: alwayshealthcheck:test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]interval: 10stimeout: 5sretries: 5environment: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 downauth-api:image: wbsu2003/auth-server:v1container_name: "booklogr-auth-server-api"depends_on:auth-db:condition: service_healthyrestart: alwaysenvironment: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-dbenv_file:- env.txtports:- 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
相关文章:

用于跟踪个人图书馆的BookLogr
什么是 BookLogr ? BookLogr 是一款网络应用,旨在帮助您轻松管理个人图书馆。这项自托管服务可确保您完全控制数据,提供安全且私密的方式来跟踪您拥有、阅读或希望阅读的所有书籍。您也可以选择向公众自豪地展示您的图书馆,与您的…...
深入解析JVM垃圾回收机制:Full GC、Minor GC与Major GC
目录 引言垃圾回收的基本概念 什么是垃圾回收GC的分类JVM内存模型 堆内存非堆内存Minor GC 触发条件运行机制对性能的影响...

Windows10点击文件夹右键卡死的解决办法
1、首先同时按下【WinR】打开运行页面,输入命令【regedit】按下回车或者点击确定。 2、打开注册表编辑器后,定位到如下位置“HKEY_CLASSES_ROOT\Directory\Background\Shellex\ContextMenuHandlers”。 3、然后在其中将所有名为“New”的文件或项全部删…...
C# 设计模式之单例模式
总目录 前言 本文是个人基于C#学习设计模式总结的学习笔记,希望对你有用! 1 基本介绍 定义:确保一个类只有一个实例,并提供一个全局访问点。 本质就是保证在整个应用程序的生命周期中,任何一个时刻,单例…...

【组合数学】【Python】【小练习】一、斯特灵近似式求阶乘
一、问题介绍 斯特灵(Stirling)近似式,是数学分析中,用于求阶乘近似值的一个常用公式,其简单的表述形式为: 二、Python实现 使用Python,循环从n1至n98,分别输出n的阶乘值、斯特灵公…...

【IEEE Fellow特邀报告,JPCS独立出版】第四届电子通信与计算机科学技术国际学术会议(ECCST 2024,9月20-22)
2024年第四届电子通信与计算机科学技术国际学术会议将于2024年9月20-22日在中国上海举行。 会议旨在为从电子与通信、网络、人工智能与计算机技术研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发展趋势,拓宽研究思…...

DockerCompose部署示例
目录 前言 1. 初识DockerCompose 2. 安装DockerCompose 3. 部署微服务项目 1)找一个目录,创建一个新的cloud-demo文件夹。 2)在cloud-demo文件夹创建一个docker-compose.yml文件,然后编写下面内容: 3)…...

【云原生】Helm来管理Kubernetes集群的详细使用方法与综合应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
电源插头应该统一方向
大家在使用插排的时候就会发现,有的横向,有的竖向。 国家强制规定,统一方向,插排能方便使用。...
大学新生编程入门最佳攻略
引言 编程的重要性:简述编程在当今社会的地位,为何它是大学生的必备技能。目标设定:明确文章旨在帮助新生从零基础开始,逐步成长为编程高手。 方向一:编程语言选择 1. 编程语言概览 介绍几种流行语言:如…...

MySQL 的binlog 、undolog 、redolog
Binlog (二进制日志) bin Log 作用 用于记录所有修改数据库数据的 SQL 语句或行级别的变化,主要用于主从复制和数据恢复。 binlog格式 STATEMENT模式:binlog里面记录的就是SQL语句的原文。优点是并不需要记录每一行的数据变化,减少了binlo…...

【计算机网络】三次握手、四次挥手
问:三次握手 四次挥手 TCP 连接过程是 3 次握手,终止过程是 4 次挥手 3次握手 第一步:客户端向服务器发送一个带有 SYN(同步)标志的包,指示客户端要建立连接。 第二步:服务器收到客户端的请求…...
Spring Boot中的全局异常处理:@RestControllerAdvice的应用
在现代Web开发中,异常处理是一个不可或缺的部分。良好的异常处理不仅能提高系统的健壮性,还能提升用户体验。在Spring Boot中,全局异常处理的实现可以通过使用RestControllerAdvice注解来完成。本文将详细介绍如何使用RestControllerAdvice和…...
指令数据的构建
文章目录 基于现有的 NLP 任务数据集构建基于日常对话数据构建基于合成数据构建指令微调(Instruction Tuning)是指使用自然语言形式的数据对预训练后的大语言模型进行参数微调,这一术语由谷歌研究员在 2022 年的一篇 ICLR 论文中正式提出。在另外一些参考文献中,指令微调也…...

论文解读(14)-GeoCLIP
加油,加油! 原文: GeoCLIP: Clip-Inspired Alignment between Locations and Images for Effective Worldwide Geo-localization (2309.16020 (arxiv.org)) 这一篇的重点在于范围放宽到全球了 摘要 首先指出了目前…...

MySQL基础练习题16-电影评分
题目 准备数据 分析数据 总结 题目 查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名。 查找在 February 2020 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称。 准备数据 ## 创建库 create database db; u…...

CRMEB-众邦科技 使用笔记
1.启动项目报错 Unable to load authentication plugin ‘caching_sha2_password’. 参考:http://t.csdnimg.cn/5EqaE 解决办法:升级mysql驱动 <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</ar…...

npm与webpack的学习笔记
npm 定义:npm是Node.js标准的软件包管理器。它起初是作为下载和管理Node.js包依赖的方式,但其现在也已成为前端JavaScript中使用的工具。 包 包:将模块、代码、其他资料聚合成一个文件夹 包的分类: 项目包:主要用…...
Vue 生命周期选项:2.x 与 3.x 的全面解析及案例分享二
目录 Vue3.X生命周期 介绍 流程图 案例 this.$nextTick Vue 生命周期选项:2.x 与 3.x 的全面解析及案例分享一-CSDN博客 Vue3.X生命周期 介绍 beforeCreate:在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。此时无法访…...
Linux centos7 安装sftp
这里写自定义目录标题 指定 SSH 默认端口 (通常是22)添加自定义端口确保 SFTP 子系统配置存在匹配自定义端口的配置 在 CentOS 7 上安装 SFTP 并使用自定义端口 22345 启动,同时不影响现有的 SSH 登录,可以按照以下步骤进行配置: 步骤 1: 安…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...