背景
最近在使用Calibre电子书的时候,突然发现Calibre可以作为服务器使用,而只需要使用浏览器访问相应的地址既可以阅读Calibre电子书库的内容,简单操作如下: 突然想到,Calibre是个跨平台的软件,是不是可以在服务器上搭建一个服务,那么就可以有自己的电子书服务了。于是,就从网上找了下,发现了一个果然存在这样的服务Calibre-Web,于是乎决定自己先本地搭建一个试一试。
搭建和设置Calibre-Web
搭建
首先谷歌了一下,发现Calibre-Web有docker镜像,那毫无疑问,就从Docker镜像开始了,自己也免得搞太多事情,找了一下,分别发现两个Docker镜像推荐人数比较多:
- [linuxserver/calibre-web](linuxserver/calibre-web - Docker Image | Docker Hub)
- [technosoft2000/calibre-web](technosoft2000/calibre-web - Docker Image | Docker Hub) 简单看了一下这两个项目的介绍,最后选择了第一个,有以下原因:
- 第一个下载量第一,本身质量可以保证;
- 第一个保持高频的更新,说明维护及时,而第二个最新的镜像已经一年了,可能维护不那么及时;
- 两个都简单搭建用了一下,两个对书籍元信息的刮削都有一些问题,但第一个源较多;
构建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),其中enviroment
和volume
在下图有提及:
这里挑几个说一下:
PUID/PGID
:这两个需要和你构建docker的用户id一致,具体可以使用命令id $USER
获取,如下图: 其中uid
对应PUID
,gid
对应PGID
。TZ
:时区设置,具体有什么作用不太清楚,不过东八区可以使用Asia/Shanghai
,对具体时区应该设定什么值感兴趣可以参考tz database - Wikipedia.DOCKER_MODS
: 没研究过,不过官方推荐了就设定;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
的服务了。如下图:
[!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 # 退出容器
设置语言
- 点击用户名
- 按以下操作修改
启用上传权限
- 进入管理权限
- 编辑基本配置
- 启用上传功能
设置文件转换工具
设置文件转换服务的目的是为了保证文件转换功能的正常工作,设置完后就可以实现不同电子书格式的转换,例如epub到pdf等。具体操作如下: 主要就是:
- 设置Calibre 电子书转换器路径为
/usr/bin/ebook-convert
- 设置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
...
这里采用了挂载文件的方式来避免文件的拷贝。设置过后,即可在下载元数据中看到新豆瓣源。详情如下:
Nginx代理
一般来说,大部分人拥有的服务器不到一台,那么在一台服务器上搭建不同的服务供自己使用就是顺理成章的。那么,搭建多了类似的服务一定会导致对外暴露的端口过多,不仅不安全,还不容易记忆。为此,我们搭建一个NGINX服务来做反向代理。
搭建Nginx服务
具体参考[[基于Docker搭建NGINX]]
设置反向代理
关闭Calibre-Web
对外端口
既然需要使用Nginx作为反向代理,那么第一步肯定是关闭Calibre-Web服务的对外8083端口。
- 进入
Calibre-Web
目录,执行docker compose down
; - 做如下改动;
- 执行
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服务]]。
配置反向代理
- 设置方向代理服务器,增加以下代码:
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错误,其表现如下:
- 按F12打开浏览器(我用的时Edge浏览器)的调试工具,选择网络并重新刷新网页。 发现其重定向到了不带/calibre/路径的地址。 在配置文件中增加以下语句:
proxy_redirect http://$host/ $scheme://$host/calibre/;
重新载入nginx后打开网址,发现404不见了,登录页面出了点问题,如下: 同样检查网络信息,发现大量静态文件无法载入:
由于静态文件大部分是通过HTML文件中的href
定义的,因此,查看一下网页源码,显示如下。
其静态地址均为/static/
目录下,复制一下路径地址,显示为https://192.168.3.74/static/favicon.ico
。显然其地址会被解析为root地址加上/static/favicon.ico
。
- 使用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;
再次刷新并重新加载后发现,世界开始美好了。
[!tip]
- 这里的修改除了
href
以外还有其他的原因是登录进去后有部分内容还是存在问题,只需要按照sub_filter说明进行修改即可。sub_filter_once off;
这一句话不可获取,否则只有一个值被修改。
脚注
Calibre-Web
FAQ
运行Calibre-Web
容器时碰到的一个问题
在运行完docker compose up -d
后,在浏览器输入网址,发现无法访问:
检查后发现,实际上时该docker在构建的时候需要从github中下载代码,没有挂梯子无法构建成功,挂上梯子重新执行即可,具体错误可以从docker compose logs
中查看。
上传书籍显示read-only
如果上传书籍后碰到显示无法对只读数据库进行操作的问题,大概率是由于数据库文件夹的权限存在一些问题,暂时没有找到碰到该问题的解决办法,不过可以预防,预防方式为:
- 手动创建所有所有挂载volume的文件夹;
- 确保所有文件夹的所有者和读写权限,具体可以使用
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。
参考内容
- 【好玩儿的Docker项目】15分钟搭建一个在线电子书库/漫画/CG/画集库——Calibre-Web (laoda.de)
- 【好玩儿的Docker项目】15分钟搭建一个在线电子书库/漫画/CG/画集库——Calibre-Web_哔哩哔哩_bilibili
- GitHub - fugary/calibre-web-douban-api: 新版calibre-web已经移除douban-api了,添加一个豆瓣api实现
- nginx中的proxy_redirect的使用_健康平安的活着的博客-CSDN博客_proxy_redirect
- nginx中的sub_filter_择维士的博客-CSDN博客_nginx sub_filter
- Networking in Compose | Docker Documentation
评论区