站内已经写过音乐库、影视库和相册,媒体库这块就剩电子书没填。
我自己攒了六七百本 epub,之前散在电脑的下载文件夹、移动硬盘、"待整理"目录里,想找一本书得靠 Everything 搜。换成自建服务器之后,手机、平板、墨水屏打开浏览器就能接着上次的位置读,不用再同步文件。
这篇讲两件事:三个主流方案怎么选,以及Kavita 和 Calibre-Web 具体怎么部署。
| Calibre-Web | Kavita | Komga | |
|---|---|---|---|
| 定位 | 纯电子书 | 电子书 + 漫画 + 轻小说 | 漫画为主 |
| 是否依赖 Calibre | 必须(要 metadata.db) | 不需要,扫文件 | 不需要,扫文件 |
| EPUB 在线阅读 | 好 | 好 | 基础 |
| 漫画(CBZ/CBR) | 基础 | 好 | 最好 |
| 格式转换 | ✅ 50+ 格式(靠 Calibre) | ❌ | ❌ |
| Send to Kindle | ✅ | ❌ | ❌ |
| Kobo 同步 | ✅ | ❌ | ✅ |
| 内存占用 | 最低(空载 80MB) | 中(150-250MB) | 最高(JVM,空载 150MB+) |
| 路线 | 老牌,16.7k star | 全能,10.1k star | 漫画专精,6k star |
怎么选,一句话:
- 已经在用 Calibre 桌面版管理书库 → Calibre-Web,直接读你现有的库
- 从零开始,书和漫画混着放 → Kavita
- 几乎只存漫画 → Komga
如果你手上是一堆散装 epub、没有 Calibre 库,Kavita 会省事很多。Calibre-Web 不能直接扫散装文件,它读的是 Calibre 维护的那个 metadata.db 数据库 —— 这是新手最容易卡住的地方,后面会细说。
下面重点讲 Kavita,Calibre-Web 也会给出完整配置。
两个服务都不做转码,CPU 要求不高,瓶颈在硬盘。
| 内容类型 | 单本体积 | 1000 本大概占 |
|---|---|---|
| 纯文本 EPUB | 1-5MB | 3-5GB |
| 扫描版 PDF | 20-100MB | 30-80GB |
| 漫画单行本 CBZ | 50-200MB | 100GB+ |
规矩很简单:纯文字书库 20GB 够用,有漫画或者扫描版 PDF 就按 100GB 起算。买机器前先看看自己现有文件的总体积。
内存方面,Kavita 空载 150-250MB,跑起来给 1GB 绰绰有余;Komga 是 JVM,内存吃得凶一些。1 核 2G 是个舒服的起点,主要看硬盘够不够。
还有一点:Kavita 首次扫描大库时会生成缩略图,这个过程比较吃 CPU,几千本书可能要跑几十分钟。之后增量扫描就很快了。
Kavita 对目录结构很敏感,它不像网页相册那样能容忍你随便堆文件。
规则是这样的:
books/
├── 刘慈欣/
│ ├── 三体.epub
│ ├── 三体Ⅱ·黑暗森林.epub
│ └── 球状闪电.epub
├── 阿西莫夫/
│ └── 基地.epub
└── 漫画/
└── 进击的巨人/
├── 第01卷.cbz
└── 第02卷.cbz
要点:
- 一级子目录 = 一个系列,里面的文件是这个系列的各卷/各本
- 根目录下不要直接放书文件,Kavita 不会认,扫描会漏
- 系列名建议用作者名或者丛书名,方便后面按作者浏览
中文文件名要清理一下。 实测有几类字符会让 Kavita 解析出问题:
- 中文括号:
三体(一).epub→ 改成三体_I.epub或者直接三体1.epub - 特殊符号:
★、【】、emoji 这些,能删就删 - 罗马数字和圈码:
①②、Ⅲ之类,解析成卷号时经常出错
批量改名用个小脚本就能搞定,比事后一本本修书省事得多。
Linux 上的权限问题不能忘。 Kavita 容器以 UID 1001 运行,如果书库目录属于 root,扫描会直接报 UnauthorizedAccessException:
sudo chown -R 1001:1001 ~/ebooks/books
准备目录:
mkdir -p ~/ebooks/{config,books}
cd ~/ebooks
docker-compose.yml:
services:
kavita:
image: jvmilazz0/kavita:latest
container_name: kavita
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
ports:
- "127.0.0.1:5000:5000"
volumes:
- ./config:/kavita/config
- ./books:/books
三个注意点:
/kavita/config 这个路径不能改。 官方明确要求,改了容器起不来。里面放的是配置和 SQLite 数据库,是整个服务的核心,务必备份。
端口绑 127.0.0.1。 Kavita 本身有账号系统,直接暴露也不算裸奔,但走反代加 HTTPS 更稳妥 —— 尤其是你打算在外面用手机看漫画的时候。
PUID/PGID 不是必须的,Kavita 镜像固定用 1001,所以用 chown 把宿主机目录改对就行。
启动:
docker compose up -d
docker compose logs -f
第一次访问 http://你的IP:5000,会让你创建管理员账号。
第一步,加库。 进 Server Settings → Libraries → Add Library。
这里要选库的类型:纯文字书选 Book,漫画选 Manga 或 Comic(这两个的区别是阅读方向,Manga 默认右到左)。指向容器内的 /books。
Kavita 不会自动递归识别你所有分类 —— 如果你想给小说和漫画分别建库,就在宿主机上分两个目录,compose 里挂两个卷:
volumes:
- ./config:/kavita/config
- ./novels:/novels
- ./comics:/comics
然后在 Kavita 里建两个库分别指向它们。这样阅读体验会好很多,因为漫画要双页、右到左这些设置,小说不需要。
第二步,等扫描。 加完库会自动开始扫,界面上有进度。几千本书第一次扫要等一会儿。
第三步,处理元数据。 Kavita 会尝试从 ComicVine、AniList、MyAnimeList、Google Books 这些源刮削封面和简介。
这里要有个心理准备:中文书的元数据刮削基本指望不上。豆瓣不在支持列表里,大多数中文小说的标题在 Google Books 上要么搜不到,要么匹配到错误的版本。
现实的做法是:
- 英文书和漫画交给自动刮削
- 中文书手动改 —— 在书系页面点编辑,填标题、作者、简介,封面自己传一张
- 或者干脆接受"用文件名当标题",Kavita 的阅读体验不依赖元数据
如果你本来就整理得比较规整(作者/书名.epub 这种),刮削失败也不影响使用,只是列表看着朴素一点。
Calibre-Web 的部署同样简单,但它有一个前置条件:/books 目录里必须有一个 Calibre 库(也就是包含 metadata.db 的目录树)。它不会扫散装 epub。
如果你已经有 Calibre 桌面版建的库,直接把整个库目录传上去就行:
rsync -av ~/Calibre\ 书库/ user@server:~/ebooks/library/
没有的话,有两条路:在电脑上装 Calibre 建一个库(哪怕先放一本书)再传上去;或者用 calibredb 命令初始化一个空库。
docker-compose.yml:
services:
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- DOCKER_MODS=linuxserver/mods:universal-calibre
volumes:
- ./config:/config
- ./library:/books
ports:
- "127.0.0.1:8083:8083"
PUID/PGID 填宿主机上书库目录的属主(id -u 和 id -g 查)。
DOCKER_MODS 这行建议留着。 它会把 Calibre 的转换工具打进容器,代价是首次启动要多等 2-5 分钟下载,换来的是能在网页上做格式转换(epub 转 mobi 发给 Kindle 就靠它)。
启动后访问 http://你的IP:8083,默认账号是 admin,密码 admin123,登录后第一件事就是改密码。
然后进 Admin → Basic Configuration,把 "Location of Calibre Database" 设成 /books —— 注意这是容器内路径,不是宿主机的路径,这个坑很多人踩。
一个必须记住的禁忌:不要让 Calibre 桌面版和 Calibre-Web 同时写同一个库。 两边的 metadata.db 会互相覆盖,库直接损坏。要改元数据就停掉一边。
两个服务都建议走反代,原因不只是加密:
- 手机浏览器会限制非 HTTPS 页面的部分功能,剪贴板、PWA 安装这些都可能受影响
- 在外面用公共 Wi-Fi 看书,明文传输账号密码不合适
- Caddy 申请证书是自动的,没理由不做
Caddy 配置(以 Kavita 为例):
books.example.com {
encode gzip
reverse_proxy 127.0.0.1:5000
}
Calibre-Web 换一下端口就行。Kavita 需要 WebSocket 支持(阅读进度同步靠它),Caddy 的 reverse_proxy 默认会处理 Upgrade 头,不用额外配置;如果换成 Nginx,记得手动加坡:
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 2000m;
X-Forwarded-Proto 不设的话,Kavita 会以为自己跑在 HTTP 上,登录后可能陷入重定向循环。client_max_body_size 是给你从网页上传书用的,默认 1MB 传不了几本书。
反代的完整写法站内这篇 Caddy 反向代理指南有更细的说明。
这是自建书库最有价值的部分 —— 不用每次开浏览器。
通用方案是 OPDS,一个被电子书阅读器广泛支持的目录协议。两个服务都提供:
- Kavita:
https://books.example.com/api/opds/你的API密钥 - Calibre-Web:
https://books.example.com/opds
支持 OPDS 的阅读器不少:手机上的 KOReader、静读天下、KyBook,iOS 上的 Panels(漫画)。把 OPDS 地址填进去,书库就直接出现在阅读器里,选一本就能下载阅读。
Kavita 还支持 PWA:在手机浏览器里打开,选择"添加到主屏幕",用起来和原生 App 差不多,阅读进度会自动同步。
Calibre-Web 有两个独门功能:
- Send to Kindle:在网页上点一下,书直接发到你的 Kindle 邮箱。需要先在 Admin 里配好 SMTP(用 Gmail 的话要申请应用专用密码,不能用登录密码)
- Kobo 同步:Kobo 阅读器可以直接和 Calibre-Web 同步书库和阅读进度
至于墨水屏设备,大部分支持 OPDS 或者直接连网页版 —— 墨水屏浏览器体验一般,但如果设备支持 OPDS,体验会好很多。
要备份的东西有两块:书库本身(丢了得重新收集)和配置(库结构、用户、阅读进度)。
cd ~/ebooks
docker compose stop
tar czf ~/ebooks-backup-$(date +%F).tar.gz config books
docker compose start
书库体积大的话,每次全量打包不现实,那就分开处理:书库用 rsync 增量同步到另一台机器或者对象存储,配置目录每周打包一次。站内 VPS 挂载网盘扩容那篇讲的 rclone 挂载,很适合拿来做异地备份。
配置目录比书库更值得频繁备份 —— 书还能再找,阅读进度和整理好的元数据丢了是真的烦。
扫描不到书:按顺序检查三件事 —— 根目录下有没有直接放文件(不能放)、目录权限对不对(chown 1001:1001)、库类型选得对不对(小说选了 Manga 会导致解析异常)。
封面全是空白的:中文书刮削不到是常态。要么手动传封面,要么装个 Calibre 用 ebook-meta 批量写入封面。别指望自动刮削能搞定中文书。
打开书一直转圈:大 PDF 在浏览器里渲染很吃内存,手机尤其明显。建议 PDF 用外部阅读器通过 OPDS 下载后看,别在网页里硬啃。
Kavita 登录后跳转循环:反代没传 X-Forwarded-Proto,或者 Kavita 服务地址配置里的 Base URL 设错了。
Calibre-Web 报 "DB Location is not valid":/books 里没有 metadata.db。确认你的库是从 Calibre 导出的完整目录,不是只有 epub 文件的文件夹。
上传的书不显示:Calibre-Web 需要在 Admin → Feature Configuration 里打开 "Allow Uploads";Kavita 则要等下一次扫描或者手动点 Rescan。
硬盘满了:漫画和扫描 PDF 是体积刺客。定期看看 du -sh books/*,把读过的老漫画归档到网盘挂载目录里。
自建书库的收益不在省钱(Kindle Unlimited 一个月也就十几块),而在于你买的书、收集的书真正属于你自己,不会因为平台下架、账号封禁或者格式变更而消失。
配置上有两个判断要做好:书是不是 Calibre 库管的决定选 Calibre-Web 还是 Kavita;目录整理得规不规整决定后面用得顺不顺。技术上反而没什么难点,一个 Docker 容器的事。
延伸阅读:
