在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

安装

  • 执行安装:

安装calibre
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

Calibre Dockerfile
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 来构建个人电子书仓库。

另外,我有一些以前购买的电子书需要转换格式,所以我想进一步寻找全功能解决方法:

我准备实践后者

修正

pdfinfo

上传pdf文档发现不能形成封面,后台日志显示:

pdfinfo not found
FileNotFoundError: [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

参考