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,完成所有配置。