在Alpine Linux上安装Calibre
我在 Kindle在,书未老 和 Kobo电子阅读器 上阅读电子书,需要有一个电子书管理平台来维护之前在国内亚马逊购买的大量电子书。虽然每次在 macOS 上安装Calibre非常方便,但是我更想部署一个服务器,类似于NAS这样存储电子书,又能够随时通过浏览器访问。
选择Alpine Linux作为底层平台是因为想要追求硬件充分发挥性能,我现在特别沉迷于轻量级系统,想要把服务性能最大化。并且,我逐步把服务都迁移到类似 Raspberry Pi 这样的小型系统上,锱铢必较在所难免。
备注
Alpine Linux使用了 musl 库来代替标准 glibc ,对于 Calibre 官方二进制包无法直接使用,需要自行编译或使用alpine linux仓库方式安装。
使用软件仓库安装calibre
将系统升级到 edge 版本
由于我实践发现无法同时并存stable和edge仓库,所以按照 alpine linux升级到滚动版本 edge 完成升级
首先修订仓库
/etc/apk/repositories 配置 edge 仓库#/media/sda1/apks
#http://dl-cdn.alpinelinux.org/alpine/v3.22/main
#http://dl-cdn.alpinelinux.org/alpine/v3.22/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing
系统升级:
edge 版本# 先完成完整的系统升级
apk upgrade -aU
# 安装转换脚本
apk add merge-usr
# 测试转换脚本(模拟运行,没有实际执行,实际上就是替换 usr 目录等链接)
merge-usr --dryrun
# 如果没有报错,则实际执行
merge-usr
# 卒后清理掉转换脚本
apk del merge-usr
安装
执行安装:
apk update
apk add calibre
初始化数据库
calibre服务运行需要一个 library 目录,该目录下需要有一饿 metadata.db ,有两种方式创建:
方法一: 使用 calibredb list 命令去查看一个空目录,此时会自动生成一个空的 metadata.db
calibredb list 目录# 创建一个Library目录
mkdir -p /calibre/library
# list一次Library目录,就会在该目录下创建 metadata.db 初始化数据库
calibredb list --library-path /calibre/library
此时输出是空的内容
calibredb list 目录是空的id title authors
但是会看到 /calibre/library 目录下创建了一个 metadata.db
方法二: 导入一个电子书目录,此时会自动初始化 library 目录:
# 创建一个Library目录
mkdir -p /calibre/library
# 通过add电子书来初始化Library目录
calibredb add /media/books/toadd/* --library-path /calibre/library
创建用户账号(可选)
对于需要保护访问,可以创建用户账号数据库,然后启动 calibre 服务 指定使用用户数据库认证
管理用户数据库使用参数
--manage-users:
# 单独创建用户数据库目录,方便后续docker挂载
mkdir -p /calibre/auth
# 管理用户数据库
calibre-server --userdb /calibre/auth/users.sqlite --manage-users
# 此时进入交互模式,按照菜单提示添加用户账号
# 启动calibre-server时候使用参数 --userdb /calibre/auth/users.sqlite --enable-auth
启动
以
/calibre/library目录为工作目录,启动calibre服务:
calibre 服务# calibre-server 启动时可以指定Library目录
# --daemonize 需要结合 --log 参数,这个 --log 参数可以直接吐出给控制台,也可以是一个日志文件
/usr/bin/calibre-server --userdb /calibre/auth/users.sqlite --enable-auth \
--log /dev/stdout --daemonize /calibre/library
源代码编译安装
准备
Alpine Linux是一个非常精简的系统,默认环境footprint极小,所以需要安装一些必要的编译工具和开发库:
sudo apk add musl-dev gcc python3-dev libxslt-dev sqlite-dev jpeg-dev py3-six py3-setuptools zlib-dev
下载Calibre源码
Docker容器安装
Docker Hub: alpine 官方提供了 edge 版本镜像,所以可以非常容易完成安装部署:
定义
Dockerfile,使用官方edge镜像: 需要激活edge/testing才能获取安装calibre
FROM alpine:edge
ENV container=docker
# Now calibre in edge/testing
RUN echo "https://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories
RUN apk update && apk upgrade
# Calibre and pdf utils
RUN apk add --no-cache calibre poppler-utils py3-pypdf
# Calibre Init - prepare volume
RUN mkdir -p /calibre/library
RUN mkdir -p /calibre/auth
# Calibre Init Liberty
# RUN calibredb list --library-path /calibre/library
# Calibre create users db
# create:
# calibre-server --userdb /calibre/auth/users.sqlite --manage-users
# run with users auth (daemon)
# /usr/bin/calibre-server --userdb /calibre/auth/users.sqlite --enable-auth --log /dev/stdout --daemonize /calibre/library
# Please use:
# docker run -dt --name alpine-calibre --hostname alpine-calibre \
# -p 8080:8080 \
# -v /Users/admin/docs/calibre/library:/calibre/library \
# -v /Users/admin/docs/calibre/auth:/calibre/auth \
# alpine-calibre:latest
RUN echo "/usr/bin/calibre-server --userdb /calibre/auth/users.sqlite --enable-auth /calibre/library" > /calibre/run.sh
RUN chmod +x /calibre/run.sh
# run service when container started - calibre
EXPOSE 8080:8080
VOLUME ["/calibre/library", "/calibre/auth"]
ENTRYPOINT ["/calibre/run.sh"]
备注
我在其他主机上完成 users.sqlite 认证数据库生成,以及初始化 metadata.db 生成,然后在运行容器时作为卷映射入docker容器,以实现数据存储在Host主机上
构建镜像:
docker build -t alpine-calibre .
运行容器:
用户认证数据库通过
/calibre/auth目录挂载主机/Users/admin/docs/calibre/auth文件users.sqlite图书目录通过
/calibre/library目录挂载主机/Users/admin/docs/calibre/library
docker run -dt --name alpine-calibre --hostname alpine-calibre \
-p 8080:8080 \
-v /Users/admin/docs/calibre/library:/calibre/library \
-v /Users/admin/docs/calibre/auth:/calibre/auth \
alpine-calibre:latest
容器中运行脚本 /calibre/run.sh 来运行 calibre-server ,前台运行,日志直接打印到控制台
备注
实际上 Calibre 自带的 calibre-server 比较简陋,缺乏现代WEB外观,使用不便。现在非常流行的 Docker LinuxServer.io 提供了基于 GitHub: janeczku/calibre-web 的美观页面,能够形成类似豆瓣的电子书阅读页面,提供的镜像 GitHub: linuxserver/docker-calibre-web 部署方便快捷,推荐使用
我这里只是一个较为简陋的自用web,有时间再尝试 calibre-web
使用
calibre-server 其实是一个受限制的Calibre,只提供基本的浏览、阅读和下载功能,核心的电子书转换、插件管理、电子书编辑等都没有提供,并且界面使用极不方便。所以后续我计划改为采用 linuxserver/colibre-web 来构建个人电子书仓库。
另外,我有一些以前购买的电子书需要转换格式,所以我想进一步寻找全功能解决方法:
一种是考虑采用 X持久化远程应用Xpra ,但是需要有一个客户端来配合
另一种我考虑采用 Apache Guacamole:无客户端远程桌面网关 这样能够实现企业级集群系统
我准备实践后者
修正
pdfinfo
上传pdf文档发现不能形成封面,后台日志显示:
pdfinfo not foundFileNotFoundError: [Errno 2] No such file or directory: 'pdfinfo'
这个 pdfinfo 工具包含在 poppler-utils 软件包中,所以通过如下方式补充安装:
poppler-utils 获得 pdfinfo 工具apk add poppler-utils
安装以后确实不再报告找不到 pdfinfo ,但是还是报告错误
pdfinfo 错误 raise RuntimeError('Failed to run pdfinfo')
RuntimeError: Failed to run pdfinfo
这说明通常python环境缺少了类似 pypdf 命名的包,通常 pip install pypdf 能够解决这样的问题。不过,在Alpine Linux发行版中,这个软件包称为 py3-pypdf :
py3-pypdf 模块包apk add py3-pypdf
参考
How to Install Calibre on Alpine Linux Latest 实践发现Calibre安装脚本会提示需要标准glibc库,所以需要自己从源代码编译,或者使用alpine官方仓库安装