用于跟踪个人图书馆的BookLogr

news2024/11/14 12:04:10

在这里插入图片描述

什么是 BookLogr ?

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

官方给的重要的提示:

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

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

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.cfhttp://192.168.0.197:5173前端 web 的访问地址
api.xxsu.cfhttp://192.168.0.197:5004API 服务的访问地址
auth.xxsu.cfhttp://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_SECRETGoogle 客户端密钥;
  • 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:删除主页并直接重定向到登录页面或库(如果您已经登录)。

更多环境变量的说明,请参考官方的 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 是一个开放的、可编辑的图书馆目录,旨在为每本出版过的书籍创建一个网页。截至 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

申请流量卡不通过,这是什么原因呢,又该如何解决?

在申请流量卡时,有些人会出现被拒绝的情况,你知道这是怎么回事吗?申请流量卡被拒绝又该如何解决呢?下面这些问题都给你整理下了! ​ 常见原因: 1.信息有误:收件人/办卡人:必须是同一…

How to specify the LangSmith project name for each Chain?

题意:如何为每个链指定LangSmith项目名称? 问题背景: According to the LangSmith documentation you need to set the LANGCHAIN_PROJECT environment variable to specify the project name in langsmith. 根据LangSmith的文档&#xff0…

Vmware ubuntu20.04 虚拟文件夹

目录 1.vmware 设置 2.ubuntu设置 1.vmware 设置 设置完成后我们开机 2.ubuntu设置 我们打开终端 输入命令 vmware-hgfsclient可以看到你当前的共享文件 然后我们输入以下命令,用于将共享文件夹挂载到虚拟机中 sudo vmhgfs-fuse .host:/ /mnt -o nonempty -o …

(24)(24.1) FPV和仿真的机载OSD(一)

文章目录 前言 1 参数 2 第二OSD 3 屏幕和屏幕切换 4 面板项目 5 呼号面板 6 用户可编程警告 7 使用SITL测试OSD 8 OSD面板列表 前言 使用 MAX7456 型芯片的板载操作系统和基于 MSP 的外部操作系统(包括 DJI 护目镜和使用DisplayPort 的护目镜&#xff09…

【IEEE Fellow特邀报告,JPCS独立出版】第四届电子通信与计算机科学技术国际学术会议(ECCST 2024,9月20-22)

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

delphi 11其中改变组件以及IDE的字体大小

1、先将form的font改好。 2、保证组件的parentfont为true即可。比如edit1.parentfont:true procedure TForm1.Button1Click(Sender: TObject); beginif self.FontDialog1.Execute() thenbeginform1.Font:self.FontDialog1.Font;self.Edit1.ParentFont:true;end; en…

string习题:字符串最后一个单词的长度

字符串最后一个单词的长度 因为原字符串中可能会有很多个单词,所以我们需要寻找字符串中的最后一个" "的位置pos 接着用(size-pos-1),这样计算出来的就是字符串中最后一个单词的长度 按照这样的逻辑,我们会…

MySQL 的binlog 、undolog 、redolog

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

1990-2022年 上市公司-战略差异度(原始数据、计算代码、参考文献和最终计算结果)

上市公司战略差异度是衡量企业在战略制定和实施过程中所展现的独特性和创新性的指标。它体现了公司对市场环境、行业趋势及自身能力的独特见解和战略布局。通过分析上市公司的战略差异度,可以深入理解企业的市场竞争策略、行业定位和发展方向。 战略差异度的重要性…

Docker镜像拉取失败解决方案

文章目录 问题及分析解决方案1.先排查DNS2.修改源3.代理配置4.重启docker服务 问题解决 问题及分析 今天我用docker拉取镜像的时候报错 error pulling image configuration: download failed after attempts6: dial tcp xxx.xx.xxx.xx:xxx: i/o timeout 连接超时大概率以下两个…

在 Mac 上进行本地 LLM 微调(M1 16GB)

适合初学者的 Python 代码演练 (ft. MLX) 欢迎来到雲闪世界。本文展示了如何使用 Google Colab 上的单个(免费)GPU 微调 LLM。虽然该示例(以及许多其他示例)可以在 Nvidia 硬件上轻松运行,但它们并不容易适应 M 系列 M…

Windows10点击文件夹右键卡死的解决办法

1、首先同时按下【WinR】打开运行页面,输入命令【regedit】按下回车或者点击确定。 2、打开注册表编辑器后,定位到如下位置“HKEY_CLASSES_ROOT\Directory\Background\Shellex\ContextMenuHandlers”。 3、然后在其中将所有名为“New”的文件或项全部删…

边缘计算平台模型-Gemma 2

我们生活在一个充满科技创新的时代,这已经成为我几乎每天都会重复的话题。这一次,我们带来了一个重磅消息:Google刚刚发布了Gemma 2,这是一款拥有22亿参数的指令调优模型。这意味着它已经在指令及其响应上进行了训练或微调。Gemma…

Navicat 数据传输详解(将源数据库的多个表结构与数据复制到目标数据库)

Navicat 数据传输详解(将源数据库的多个表结构与数据复制到目标数据库) 1.打开Navicat ,先连接源数据库和目标数据库。2.点击工具选项卡,选择数据传输3.左边是源数据库,右边是目标数据库。4.选择要同步的表。5.开始同步…

为什么很多人都无法解决 VSCode C 系列调试问题 (经验分享 有用)

目录 个人失败案例 断点打了 (也没用) lagunch配置了 (也没用) 插件安装了 (也没用) 无中文路径 (也没用) ​编辑 失败案例分析✨ llvm-mingw 编译器为例 main.cpp launch.json 个人失败案例 你们都很棒 很优秀 ,环境方面也正常,但为什么还是…

【海外高校联合支持举办 | 学术大咖fellow汇聚】2024年人工智能与数字化管理国际会议(ICAIDM 2024,9月20-22)

2024年人工智能与数字化管理国际会议将于2024年9月22-24日在中国江苏省南京市隆重召开。 在快速发展的数字时代,人工智能已成为驱动创新、优化运营和塑造未来的关键技术。随着人工智能技术的日益成熟及其在各行各业的深入应用,如何有效地进行数字化管理…

Elasticsearch大数据搜索引擎(经典版)(电子版教程)

前言 在信息时代,可供获取的数据加速涌现,我们可以通过搜索引警来挖掘大数据的价值,百度就是一个大的数据搜索引擎。Lucene 是一个 Java 语言开发的开源全文检索引擎工具包。Lucene 穿了一件json 的外衣,就是 Elasticsearch。Ela…

平衡三进制存算一体架构

PS:天天水一贴,快乐又舒心。。。 1、存算一体概念 最近想搞平衡三进制的虚拟机,但是写来写去都感觉不对味,能用是能用,但写起来感觉就是很奇怪,用了二种编码,想来想去是不够原生三进制的编写,有…

企业差旅支出“降本增效”CFO避坑指南之三—— 仅凭一单,更换差旅供应商?

在企业运营过程中,差旅支出是CFO们需要精细管理的重要成本项。然而,许多中小企业在商旅供应商的选择上,往往容易陷入“仅凭一单价格高,即更换差旅供应商”的误区。这种做法忽视了商旅市场的复杂性和多样性,可能导致企业…

通过 Python脚本,实现字体文件otf,ttf文件大小的减少

FontTools 是一个用于操作字体文件的 Python 库。它支持多种字体格式,包括 TrueType (TTF) 和 OpenType (OTF),并提供功能来编辑、合并、子集化和生成字体文件 前提:安装了 Python 1、安装 fonttools 库 pip3 install fonttools2、编写脚本…