Calibre 自建私人在线图书馆
Calibre 是一位印度大佬编写并维护的电子书管理软件,集成了电子书管理、分类、编辑、转换、搜索等等所有能想到的功能,kindle 用户肯定很熟悉啦。你可能不知道的是,它还有个内容服务器功能,如果能利用起来你可能就不需要什么 kindle 了,只需要有一个浏览器就能随时阅读并且同步进度,把任何手机平板笔记本变成云端阅读器!
虽然 Calibre 内容服务器的界面目前还比较简陋,但已经到了相当堪用的程度,用来自建个人在线图书服务再好不过。如果你有使用 NAS(或者云服务器更好),并且有阅读电子书的需求,一定要安装试用下 Calibre 的内容服务器哦。
这周我在本站上搭建了一个,目前使用体验很不错,挤地铁、吃饭、无聊的时候随时抽出手机打开 books.xcel.me 就能继续阅读,浏览器云端阅读的便携性是可以匹敌全平台的 kindle 的。下面简要提下在本站 ubuntu 16.04 上的搭建流程。
0x0 安装 Calibre
Calibre 的无头服务器和桌面版用的是同一份代码。如果你系统是 archlinux,pacman -S calibre
就能安装最新版,无需考虑依赖问题(比 ubuntu 方便多了呢)。
鉴于 ubuntu 提供的版本相当落后,这里建议使用 Calibre 官方提供的脚本来安装升级,反而不建议使用 apt
包管理安装。
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin
0x1 安装必要的依赖
使用 archlinux 的话就可以跳过这一步啦。虽然我们这里只需要无头 Calibre 内容服务,但它依赖的 Qt 无头库仍然依赖于 x11 的 libGL,ubuntu 服务器需要 apt
安装一个 libgl1-mesa-glx
。
0x2 配置图书馆目录、用户数据库
现在可以创建一个图书库啦,如果你本地已经有管理好的图书馆,可以上传整个目录。
像下面这样使用 calibredb
可以创建多个不同的图书馆目录,这里新建一个 /opt/library
目录:
calibredb --with-library /opt/library list
然后执行下面的命令,并选择新建一个新用户,创建一个用户数据库 users.db
。后续需要使用用户/密码来访问在线图书馆。
calibre-server --userdb /opt/calibre/users.db --manage-users
0x3 设置自动运行
新建 /etc/systemd/system/calibre.service
如下,带上刚刚新建的用户数据库和图书馆目录:
[Unit]
Description=calibre content server
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
ExecStart=/opt/calibre/calibre-server --listen-on 127.0.0.1 --port 8080 --userdb /opt/calibre/users.db --enable-auth --auth-mode=basic --ban-after=3 --ban-for=60 /opt/library
[Install]
WantedBy=multi-user.target
保存后 systemctl daemon-reload; systemctl enable calibre; systemctl start calibre
,设置开机启动同时开始服务。
这里有几处和安全有关的设置:
- 本站网络服务都使用
www-data
用户身份来运行,避免使用root
; - 网络服务只监听本地回环
127.0.0.1
或者 unixsocket,公网由 Nginx 反代,这样所有服务的安全问题、流量限制、缓存设置等都能方便地由 Nginx 统一管理; --ban-after=3
,--ban-for=60
,密码输错 3 次以后,IP 封禁 60 分钟才能再次尝试登录。Calibre 提供了简单的防爆破保护;--auth-mode=basic
只使用了基本模式验证身份,因为本站统一使用 https,简单验证即可。
0x4 设置 Nginx
新建 books.conf
:
server {
listen 80;
listen 443 ssl;
root /srv/calibre;
# ssl 证书文件和密钥
ssl_certificate /etc/nginx/ssl/pem;
ssl_certificate_key /etc/nginx/ssl/key;
# 一些加密设置
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.1 TLSv1.2;
location / {
if ($ssl_protocol = "") {
# http 请求跳转至 https
return 301 https://books.xcel.me$request_uri;
}
# 允许的请求大小上限,
# 如果需要上传体积较大的电子书,这里需要适当调大,这里设置为 50M
client_max_body_size 50M;
# 反代服务到 calibre 后端
proxy_pass http://127.0.0.1:8080;
}
}
保存并 reload Nginx,完成所有配置。