用于跟踪个人图书馆的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: 安…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...