侧边栏壁纸
博主头像
翠南山 博主等级

行动起来,活在当下

  • 累计撰写 11 篇文章
  • 累计创建 6 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Nginx代理Calibre-Web服务

居不正
2023-01-10 / 0 评论 / 0 点赞 / 33 阅读 / 0 字

背景

最近在使用Calibre电子书的时候,突然发现Calibre可以作为服务器使用,而只需要使用浏览器访问相应的地址既可以阅读Calibre电子书库的内容,简单操作如下: calibre_wsiTtz41ze.gif 突然想到,Calibre是个跨平台的软件,是不是可以在服务器上搭建一个服务,那么就可以有自己的电子书服务了。于是,就从网上找了下,发现了一个果然存在这样的服务Calibre-Web,于是乎决定自己先本地搭建一个试一试。

搭建和设置Calibre-Web

搭建

首先谷歌了一下,发现Calibre-Web有docker镜像,那毫无疑问,就从Docker镜像开始了,自己也免得搞太多事情,找了一下,分别发现两个Docker镜像推荐人数比较多:

  1. 第一个下载量第一,本身质量可以保证;
  2. 第一个保持高频的更新,说明维护及时,而第二个最新的镜像已经一年了,可能维护不那么及时;
  3. 两个都简单搭建用了一下,两个对书籍元信息的刮削都有一些问题,但第一个源较多;

构建docker

对于docker,个人比较偏向于使用docker-compose,其主要原因是写好之后就是一条简单命令调用,用不着挂载分区什么的,下面是个人的docker-compose.yml文件:

version: "2.1"
services:
  calibre-web:
    image: lscr.io/linuxserver/calibre-web:latest
    container_name: calibre-web
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - DOCKER_MODS=linuxserver/mods:universal-calibre #optional
      - OAUTHLIB_RELAX_TOKEN_SCOPE=1 #optional
    ports:
	    - "8083:8083"
    volumes:
      - ./data:/config
      - ./library:/books
		# 这个部分待会会细说
      - ./NewDouban.py:/app/calibre-web/cps/metadata_provider/douban.py
    restart: unless-stopped

绝大部分是抄[官方的](linuxserver/calibre-web - Docker Image | Docker Hub),其中enviromentvolume在下图有提及: image.png 这里挑几个说一下:

  1. PUID/PGID:这两个需要和你构建docker的用户id一致,具体可以使用命令id $USER获取,如下图: image.png 其中uid对应PUIDgid对应PGID
  2. TZ:时区设置,具体有什么作用不太清楚,不过东八区可以使用Asia/Shanghai,对具体时区应该设定什么值感兴趣可以参考tz database - Wikipedia.
  3. DOCKER_MODS: 没研究过,不过官方推荐了就设定;
  4. OAUTHLIB_RELAX_TOKEN_SCOPE: 和上面那个一样,抄一下就好了;

[!caution] 启动docker前先手动创建文件夹,并确保所有文件夹的权限,否则可能碰到[[Nginx代理Calibre-Web服务#上传书籍显示read-only]]。

写好之后,在docker-compose.yml所在目录执行docker compose up -d即可(可能会有一些问题,比如作者碰到的一个问题可以参考[[Nginx代理Calibre-Web服务#运行Calibre-Web容器时碰到的一个问题]])。

尝试一下

搭建完成后,在浏览器输入地址和端口号,即可访问Calibre-Web的服务了。如下图: image.png

[!info] 默认用户名:admin 默认密码:admin123

设置

设置数据库

在刚进入服务的时候,需要设置书籍数据库。可以使用以下步骤生产初始数据库:

docker exec -it calibre-web sh #进入容器内部 
  
cd /app/calibre/bin #进入bin文件夹  
  
calibredb restore_database --really-do-it --with-library /books #创建一个数据库  
  
chmod a+w /books/metadata.db #添加写的权限  
  
exit  # 退出容器

设置语言

  1. 点击用户名 msedge_mSZu8whcrN.png
  2. 按以下操作修改 msedge_1bkm4yzXL4.png

启用上传权限

  1. 进入管理权限 image.png
  2. 编辑基本配置 image.png
  3. 启用上传功能 image.png

设置文件转换工具

设置文件转换服务的目的是为了保证文件转换功能的正常工作,设置完后就可以实现不同电子书格式的转换,例如epub到pdf等。具体操作如下: msedge_KQVXU2goyz.gif 主要就是:

  1. 设置Calibre 电子书转换器路径为/usr/bin/ebook-convert
  2. 设置KEpubify 电子书转换器路径为/usr/bin/kepubify

具体的说明请参考[Calibre-Web Docker官方文档](linuxserver/calibre-web - Docker Image | Docker Hub)中关于Application Setup部分。

设置豆瓣源

在上面几步设置好之后,基本上就可以开始使用calibre-web服务了。不过在个人使用的时候,发现一个问题,就是在获取元数据的时候一直报错。后来,查找发现,旧的豆瓣源失效了,需要使用新豆瓣源NewDouban. 回顾以下刚才的docker-compose.yml文件内容:

...
    volumes:
      - ./data:/config
      - ./library:/books
		# 这里设置豆瓣源
      - ./NewDouban.py:/app/calibre-web/cps/metadata_provider/douban.py
...

这里采用了挂载文件的方式来避免文件的拷贝。设置过后,即可在下载元数据中看到新豆瓣源。详情如下: msedge_ibFx7ATrMq.gif

Nginx代理

一般来说,大部分人拥有的服务器不到一台,那么在一台服务器上搭建不同的服务供自己使用就是顺理成章的。那么,搭建多了类似的服务一定会导致对外暴露的端口过多,不仅不安全,还不容易记忆。为此,我们搭建一个NGINX服务来做反向代理。

搭建Nginx服务

具体参考[[基于Docker搭建NGINX]]

设置反向代理

关闭Calibre-Web对外端口

既然需要使用Nginx作为反向代理,那么第一步肯定是关闭Calibre-Web服务的对外8083端口。

  1. 进入Calibre-Web目录,执行docker compose down;
  2. 做如下改动; image.png
  3. 执行docker compose up -d; 这时候再访问8083端口则无法访问Calibre-Web服务了。

配置Nginx服务

为了隔离性好一些,我们为不同的服务均创建一个conf文件,然后在nginx.conf中加入以下语句:

include /etc/nginx/conf.d/*.conf;

增加配置文件

/etc/nginx/conf.d/文件夹中创建calibre.conf文件。

配置HTTPS

为了安全起见,设置所有服务基于HTTPS,具体操作参考[[Nginx设置HTTPS服务]]。

配置反向代理

  1. 设置方向代理服务器,增加以下代码:
upstream calibre_server {
    server calibre-web:8083;
}

server {
    listen 443 ssl http2;
    server_name  192.168.3.74;
  
    ssl_certificate          /etc/nginx/certs/example.crt;
    ssl_certificate_key      /etc/nginx/certs/example.key;
    ssl_session_timeout  5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #

    error_page   500 502 503 504  /50x.html;
    
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #

    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}
    
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #

    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}

    location ^~ /calibre/ {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        # rewrite ^/calibre/(.*)$ $1 break;
        proxy_pass http://calibre_server/;
        # proxy_set_header作用:设置发送到后端服务器(上面proxy_pass)的请求头值 
        # 【当Host设置为 $http_host 时,则不改变请求头的值;
        #   当Host设置为 $proxy_host 时,则会重新设置请求头中的Host信息;
        #   当为$host变量时,它的值在请求包含Host请求头时为Host字段的值,在请求未携带Host请求头时为虚拟主机的主域名;
        #   当为$host:$proxy_port时,即携带端口发送 ex: $host:8080 】
        proxy_set_header Host $host;  
        proxy_set_header X-Real-IP $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件①    【 $remote_addr值 = 用户ip 】
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得用户的真实ip 需配置条件②
        # proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $http_x_forwarded_for; # $http_x_forwarded_for变量 = X-Forwarded-For变量
    }
}

增加完这些内容后,执行docker exec -it NGINX nginx -s reload重新加载nginx。打开浏览器,输入地址后发现报404错误,其表现如下: image.png

  1. 按F12打开浏览器(我用的时Edge浏览器)的调试工具,选择网络并重新刷新网页。 image.png 发现其重定向到了不带/calibre/路径的地址。 在配置文件中增加以下语句:
proxy_redirect http://$host/ $scheme://$host/calibre/;

重新载入nginx后打开网址,发现404不见了,登录页面出了点问题,如下: image.png 同样检查网络信息,发现大量静态文件无法载入: image.png

由于静态文件大部分是通过HTML文件中的href定义的,因此,查看一下网页源码,显示如下。 image.png 其静态地址均为/static/目录下,复制一下路径地址,显示为https://192.168.3.74/static/favicon.ico。显然其地址会被解析为root地址加上/static/favicon.ico

  1. 使用sub_filter模块变更静态文件路径地址。
sub_filter 'href="/' 'href="/calibre/';
sub_filter 'srcset="/' 'srcset="/calibre/';
sub_filter 'src="/' 'src="/calibre/';
sub_filter_once off;
sub_filter_types text/html;

再次刷新并重新加载后发现,世界开始美好了。 image.png

[!tip]

  1. 这里的修改除了href以外还有其他的原因是登录进去后有部分内容还是存在问题,只需要按照sub_filter说明进行修改即可。
  2. sub_filter_once off;这一句话不可获取,否则只有一个值被修改。

脚注

Calibre-Web FAQ

运行Calibre-Web容器时碰到的一个问题

在运行完docker compose up -d后,在浏览器输入网址,发现无法访问: msedge_U16FyULoRN.png 检查后发现,实际上时该docker在构建的时候需要从github中下载代码,没有挂梯子无法构建成功,挂上梯子重新执行即可,具体错误可以从docker compose logs中查看。

上传书籍显示read-only

如果上传书籍后碰到显示无法对只读数据库进行操作的问题,大概率是由于数据库文件夹的权限存在一些问题,暂时没有找到碰到该问题的解决办法,不过可以预防,预防方式为:

  1. 手动创建所有所有挂载volume的文件夹;
  2. 确保所有文件夹的所有者和读写权限,具体可以使用ls -l -R查看,权限和所有者修改方式如下:
chown -R $USER:$USER ./data ./library
chmod 0777 ./data ./library

Ningx FAQ

calibre-web无法解析

这个需要参考[[基于Docker搭建NGINX]]中的说明,简单分析如下:根据名称获取到ip地址属于DNS服务,NGINX的DNS服务不包含该域名对应IP地址的说明。因此,需要解决的是docker中的网络解析问题,一些细节可以参考文献6。

参考内容

  1. 【好玩儿的Docker项目】15分钟搭建一个在线电子书库/漫画/CG/画集库——Calibre-Web (laoda.de)
  2. 【好玩儿的Docker项目】15分钟搭建一个在线电子书库/漫画/CG/画集库——Calibre-Web_哔哩哔哩_bilibili
  3. GitHub - fugary/calibre-web-douban-api: 新版calibre-web已经移除douban-api了,添加一个豆瓣api实现
  4. nginx中的proxy_redirect的使用_健康平安的活着的博客-CSDN博客_proxy_redirect
  5. nginx中的sub_filter_择维士的博客-CSDN博客_nginx sub_filter
  6. Networking in Compose | Docker Documentation
0

评论区