用于跟踪个人图书馆的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: 安…...
Java未来还是霸主吗?Java 在当今企业中的未来到底是什么?
Java 及其生态系统对于许多现代企业的成功至关重要。它是一种多功能语言,对许多用例提供强大支持,并具有强大的新功能来应对棘手的情况。但您可能会问自己:Java 的未来是什么? 尽管自 1999 年以来 Java 一直是软件开发领域的关键角…...
【C++】类和对象——Lesson2
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C 🚀本系列文章为个人学习笔记…...
常用传感器讲解十五--触摸传感器(KY-036)
常用传感器讲解十五–触摸传感器(KY-036) 具体讲解 这个比较简单,就是触摸后给个信号 电路连接 在Arduino上将VCC引脚连接到5V。 将GND连接到Arduino的GND。 将OUT连接到Arduino上的D2 代码实现 void setup() {pinMode(2, INPUT);Seri…...
web后端--Spring事务管理
事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下,只有出现RunTimeException才会回滚事务,rollbackfor属性用于控制出现何种异常类型,回滚…...
【Docker系列】Docker 中-d 和-it 的区别
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
PHP回收废品平台系统小程序源码
🌍绿色行动,从“回收废品平台系统”开始!🚚 🚪【家门口的环保站,废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已,不知该如何处理?现在,“…...
IIS解析漏洞~ IIS7.漏洞分析
IIS解析漏洞 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本),配合文件上传漏洞进行GetShell的漏洞! 1.2:IIS7.X 在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文…...
基于python+django的病人人信息管理系统及安全策略分析设计与实现
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...
前端必知必会-html表单的input属性
文章目录 HTML 输入属性value 属性readonly 属性disabled 属性size 属性maxlength 属性min 和 max 属性multiple 属性pattern 属性placeholder 属性required 属性step 属性autofocus 属性height 和 width 属性list 属性autocomplete 属性总结 HTML 输入属性 本章介绍 HTML <…...
设计模式:详细拆解策略模式
策略模式 既然是详解,就不以案例开头了,直奔主题,先来看看什么是策略模式。 模式定义 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式 使得算法可独立于使用它的客户而变化。 结构 Strategy&a…...
网站建设企业蛋糕/软文推广经典案例
git add -A和 git add . git add -ugit add . :监控工作区的状态树,运行会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。git add -u :仅监控已经被add的文件&…...
wordpress EDD Alipay/关键词seo排名公司
在亚马逊云科技,有着这么一群人,他们经常被认为只会写代码,而不善言辞。但这只是大家对他们的误解。他们的工作不仅需要懂开发、善沟通,还需要能够dive deep用户的需求。他们就是亚马逊云科技的 Software Dev Engineer!…...
做社区生意的网站/百度推广app下载
1、测试和生产共用一套zookeeper,怎么保证消费不冲突 ? 方案1、服务发布的group设置为不同; <dubbo:reference id"comm1" timeout"100000" interface"com.acq.facade.CommService" group"comm102&qu…...
小型购物网站开发/苏州百度推广公司
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] 2秒 ; -1秒1秒 < -0.05秒 > 下一个帧 -> -5秒ffmpeg-20160811-bin.7z转载于:https://www.cnblo…...
烟台电商网站建设/培训课程表
常用于长按录音等场景! 属性 属性简介默认step步长100smstart触发时长10*step事件 事件简介ngPress长按开始ngRelease长按释放ngPressing长按中,返回长按时长installyarn add iwe7-on-press 复制代码implements: [Iwe7OnPressModule] 复制代码<button (ngPress)&…...
wordpress上传文件类型限制/深圳高端seo公司助力企业
写在前面 嗯...打算开始每天写点啥了,不知道能坚持多久。 准备以一周为单位来进行更新,周一~周三写一些图形方面的内容,四~六是和图形没有什么太大关联的内容(意会就好),周日作为一个更新重点试着写一些乱七…...