旧笔记本搭 Calibre-Web 电子书库:Docker 跑起来后,用 cpolar 在外网安全打开阅读入口
家里闲置的旧笔记本、小主机、迷你 PC,很适宜用来做一件低负载但很实用的事:整理自己的电子书和技术资料。
不要把它做成一个“公网文件下载站”。电子书库更宜定位成个人资料柜:平时在家里局域网阅读,出门时临时打开一个 HTTPS 入口,看完就关。这样既能复用旧设备,也不会把管理后台、SSH、整台机器都暴露出去。
这篇用 Docker 部署 Calibre-Web,再用 cpolar 临时开放阅读入口。重点不是堆功能,而是把“能用”和“安全收口”一起做完。
一、这套方案面向哪些人
面向这些人:
- 家里有一台旧笔记本、旧台式机、N100 小主机、NAS 或 Linux 盒子;
- 手里有合法购买、自己整理的 EPUB、PDF、MOBI、AZW3 等个人电子书;
- 想用浏览器统一管理封面、作者、分类和阅读进度;
- 平时在家用内网访问,出差、通勤、临时查资料时需要外网入口;
- 不想折腾公网 IP、路由器端口转发、证书申请和反向代理;
- 希望入口只在需要时打开,读完资料后马上关闭。
不面向这些情况:
- 用来分发侵权电子书;
- 长期面向陌生人开放注册;
- 把 Calibre-Web 当成公开下载站;
- 把宿主机 SSH、Docker 管理端口、书库目录直接暴露到公网。
这里只讨论个人合法书库整理和临时远程阅读,不提供任何盗版资源获取方式。
二、最终效果
部署完成后,家里旧设备上会有一个 Calibre-Web 服务:
旧笔记本 / 家用小主机 ├── Docker │ └── calibre-web 容器 ├── /srv/ebook-stack/config # Calibre-Web 配置 ├── /srv/ebook-stack/books # 个人合法书库 └── 8083 端口 # 局域网 Web 阅读入口局域网内访问:
http://旧设备内网IP:8083外出临时访问:
https://xxxx.cpolar.top安全边界是这几个:
- 只开放 Calibre-Web 的 Web 阅读入口;
- 不开放 SSH;
- 不开放 Docker Socket;
- 不开放宿主机文件管理器;
- 外网访问使用普通只读账号;
- 阅读结束后关闭 cpolar 隧道。
三、环境准备
下面以 Ubuntu Server / Debian 系 Linux 旧设备为例。桌面版 Ubuntu、Debian、Linux Mint 也可以照着做。
硬件参考:
| 项目 | 参考配置 |
|---|---|
| CPU | 双核以上即可 |
| 内存 | 2GB 起步,4GB 更舒服 |
| 磁盘 | 按书库大小准备,SSD 体验更好 |
| 网络 | 家庭宽带或普通内网均可 |
| 系统 | Ubuntu 22.04 / 24.04、Debian 12 |
软件准备:
- Docker Engine;
- Docker Compose 插件;
- cpolar 客户端;
- 一个可用的 cpolar 账号;
- 自己合法拥有的电子书文件。
先更新系统并安装基础工具:
sudo apt update sudo apt install -y ca-certificates curl gnupg lsb-release nano unzip安装 Docker:
curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker $USER让当前终端立即获得 docker 用户组权限:
newgrp docker检查 Docker 和 Compose:
docker version docker compose version能正常输出版本号,就可以继续。
四、目录规划:先把书库和配置分开
可以把 Calibre-Web 的配置和书库分开,后续备份、迁移、排错都清楚。
创建目录:
sudo mkdir -p /srv/ebook-stack/config sudo mkdir -p /srv/ebook-stack/books sudo chown -R $USER:$USER /srv/ebook-stack cd /srv/ebook-stack目录含义:
/srv/ebook-stack/ ├── docker-compose.yml ├── config/ # Calibre-Web 的数据库、设置、日志 └── books/ # Calibre 书库目录,里面需要有 metadata.db这里有一个关键点:Calibre-Web 读取的是 Calibre 书库结构,不是随便把 EPUB/PDF 文件丢进目录就结束。标准 Calibre 书库里会有一个metadata.db文件,Calibre-Web 依赖它展示书名、作者、封面和分类。
最稳的做法是:
- 在自己的电脑上安装 Calibre 桌面版;
- 新建一个书库;
- 导入自己合法拥有的电子书;
- 整理书名、作者、封面、标签;
- 把整个 Calibre 书库目录复制到旧设备的
/srv/ebook-stack/books。
复制完成后,旧设备上应该能看到metadata.db:
ls -lh /srv/ebook-stack/books/metadata.db如果这条命令能看到文件大小和时间,书库结构就准备好了。
五、Docker Compose 部署 Calibre-Web
在/srv/ebook-stack目录创建docker-compose.yml:
cd /srv/ebook-stack nano docker-compose.yml写入下面内容:
services: calibre-web: image: lscr.io/linuxserver/calibre-web:latest container_name: calibre-web environment: - PUID=1000 - PGID=1000 - TZ=Asia/Shanghai volumes: - ./config:/config - ./books:/books ports: - "8083:8083" restart: unless-stopped如果你的 Linux 用户不是 UID 1000,可以用下面命令查看:
id输出里会有类似内容:
uid=1000(admin) gid=1000(admin) groups=1000(admin),998(docker)把PUID改成uid的数字,把PGID改成gid的数字。
启动服务:
cd /srv/ebook-stack docker compose up -d查看容器状态:
docker compose ps查看日志:
docker logs -f calibre-web看到服务监听8083端口后,在局域网电脑或手机浏览器打开:
http://旧设备内网IP:8083旧设备内网 IP 可以这样查:
hostname -I首次登录 Calibre-Web,默认账号通常是:
用户名:admin 密码:admin123登录后立刻修改管理员密码。
进入初始化页面时,书库路径填写:
/books这个路径对应 Compose 里的挂载:
- ./books:/booksCalibre-Web 会读取/books/metadata.db,然后展示你的个人书库。
六、导入合法个人书库
如果你已经在桌面电脑上整理好了 Calibre 书库,可以用rsync复制到旧设备。假设旧设备 IP 是192.168.31.50,旧设备用户名是admin,本机 Calibre 书库目录是~/Calibre Library:
rsync -avh --progress "~/Calibre Library/" admin@192.168.31.50:/srv/ebook-stack/books/如果是在旧设备本机操作,也可以直接复制:
cp -a "/path/to/Calibre Library/." /srv/ebook-stack/books/复制后检查:
find /srv/ebook-stack/books -maxdepth 2 -type f | head ls -lh /srv/ebook-stack/books/metadata.db然后重启 Calibre-Web:
cd /srv/ebook-stack docker compose restart calibre-web进入 Web 页面后,检查这些内容:
- 书名是否正常;
- 作者是否正常;
- 封面是否显示;
- EPUB 是否能在线阅读;
- PDF 是否能在浏览器打开;
- 标签和分类是否符合预期。
如果后续还要继续加书,可选仍然用 Calibre 桌面版维护书库,再同步整个书库目录。这样metadata.db、封面、书籍文件结构都保持一致。
七、基础设置:先把账号权限收紧
不要急着开外网入口。先把 Calibre-Web 本身的账号和权限整理好。
1. 修改管理员密码
登录后进入:
Admin -> Edit Users -> admin把默认密码改成强密码。密码设置要点:
- 至少 12 位;
- 包含大小写字母、数字、符号;
- 不和邮箱、NAS、路由器密码重复。
2. 新建只读阅读账号
进入:
Admin -> Add New User创建一个专门外出阅读用账号,例如:
用户名:reader 角色:普通用户这个账号只用于阅读,不授予管理权限。
权限设置要点:
- 关闭管理权限;
- 关闭上传权限;
- 关闭编辑元数据权限;
- 关闭删除书籍权限;
- 关闭用户管理权限。
外网访问时只使用reader账号。管理员账号只在家里内网使用。
3. 关闭公开注册
进入管理设置,确认不开放匿名注册。个人书库不需要让陌生人注册账号。
4. 只在内网确认管理操作
新增书籍、修改封面、调整元数据这些操作,放在内网完成。cpolar 外网入口只用于临时阅读和验收。
八、用 cpolar 临时打开 HTTPS 阅读入口
Calibre-Web 在内网已经能访问后,再配置 cpolar。
cpolar 的作用是把本机8083端口映射成一个公网 HTTPS 地址。这样你在外面用手机、平板、公司电脑打开这个地址,就能访问家里旧设备上的 Calibre-Web。
先在旧设备上安装并登录 cpolar。不同系统安装命令以 cpolar 控制台给出的命令为准,常见流程是:
cpolar authtoken 你的认证Token启动一个临时 HTTP 隧道:
cpolar http 8083终端会输出类似这样的地址:
Forwarding https://xxxx.cpolar.top -> http://localhost:8083把https://xxxx.cpolar.top复制到手机浏览器,就能看到 Calibre-Web 登录页。
外网访问时使用刚才创建的reader账号登录,不使用管理员账号。
常用验证命令
在旧设备上确认 Calibre-Web 本地可访问:
curl -I http://127.0.0.1:8083确认容器端口映射:
docker compose ps确认 cpolar 进程存在:
ps aux | grep cpolar | grep -v grep当你不需要外网阅读时,回到运行cpolar http 8083的终端,按:
Ctrl + C隧道就会关闭,公网地址也随之失效。
九、安全边界:只开放阅读入口,不开放整台机器
这一步很重要。很多自托管服务出问题,不是因为工具本身不好,而是把范围开大了。
这套方案的安全边界可以按下面做:
| 项目 | 做法 |
|---|---|
| Calibre-Web 8083 | 通过 cpolar 临时开放 |
| SSH 22 | 不通过 cpolar 开放 |
| Docker Socket | 不开放 |
| 路由器端口转发 | 不配置 |
| 管理员账号 | 只在内网使用 |
| 外网账号 | 使用只读 reader |
| 开放时间 | 阅读时打开,结束后关闭 |
| 书库内容 | 只放个人合法资料 |
再加一个本机防火墙规则也很实用。Ubuntu 可以使用 UFW:
sudo ufw allow from 192.168.0.0/16 to any port 8083 proto tcp sudo ufw allow from 10.0.0.0/8 to any port 8083 proto tcp sudo ufw allow from 172.16.0.0/12 to any port 8083 proto tcp sudo ufw enable sudo ufw status numbered这组规则允许常见内网网段访问8083。cpolar 在旧设备本机连接localhost:8083,不依赖路由器公网端口。
如果你的家庭网段是192.168.31.0/24,也可以收得更窄:
sudo ufw allow from 192.168.31.0/24 to any port 8083 proto tcp sudo ufw enable不要添加下面这种规则:
sudo ufw allow 22SSH 没有外网阅读需求,就不要顺手开放。
十、移动端访问体验
Calibre-Web 的移动端体验比直接翻文件夹舒服很多。手机浏览器打开 cpolar HTTPS 地址后,可以完成这些操作:
- 按书名、作者、标签查找;
- 在线阅读 EPUB;
- 打开 PDF;
- 查看封面和简介;
- 继续上次阅读位置;
- 把页面添加到手机桌面。
手机上可以这样用:
- 打开
https://xxxx.cpolar.top; - 使用
reader账号登录; - 找到要看的书;
- 进入在线阅读;
- 阅读结束后退出登录;
- 回到旧设备终端关闭 cpolar 隧道。
如果你用的是 iPhone,可以在 Safari 里选择“添加到主屏幕”。如果你用的是 Android,可以在 Chrome 里选择“添加到主屏幕”。这样下次打开更像一个轻量阅读 App。
PDF 文件体积较大时,手机流量消耗会比较明显。外出阅读时更宜使用 EPUB、TXT、体积较小的 PDF。大体积扫描版 PDF 放在 Wi-Fi 环境下阅读更稳。
十一、备份要点:别只备份书籍文件
Calibre 书库不是一堆孤立文件,它还包含元数据数据库。备份时要把整个/srv/ebook-stack一起备份。
手动打包:
cd /srv sudo tar -czf ebook-stack-$(date +%F).tar.gz ebook-stack ls -lh ebook-stack-$(date +%F).tar.gz恢复时:
cd /srv sudo tar -xzf ebook-stack-2026-07-08.tar.gz cd /srv/ebook-stack docker compose up -d定期备份时,至少包含:
/srv/ebook-stack/docker-compose.yml /srv/ebook-stack/config /srv/ebook-stack/booksbooks里有书籍文件、封面和metadata.db;config里有 Calibre-Web 的用户、设置、阅读状态等数据。
十二、常见问题和排错
1. 打开页面提示找不到书库
先检查metadata.db是否存在:
ls -lh /srv/ebook-stack/books/metadata.db再检查容器内是否能看到:
docker exec -it calibre-web ls -lh /books/metadata.db如果宿主机有、容器内没有,检查 Compose 挂载路径:
volumes: - ./books:/books修改后重启:
cd /srv/ebook-stack docker compose down docker compose up -d2. 登录后看不到书
确认初始化时填写的书库路径是:
/books不是:
/srv/ebook-stack/books容器内只能看到挂载后的路径/books。
3. 封面不显示
先看书库目录是否完整:
find /srv/ebook-stack/books -name "cover.*" | head如果封面文件存在,重启服务:
docker compose restart calibre-web如果 Calibre 桌面版里也没有封面,先在 Calibre 桌面版补齐封面,再重新同步书库。
4. 中文文件名乱码
Linux 服务器可以统一使用 UTF-8。检查当前语言环境:
locale安装中文 UTF-8 环境:
sudo apt install -y locales sudo locale-gen en_US.UTF-8 zh_CN.UTF-8文件名同步时使用rsync,不要用会改编码的老旧 FTP 工具。
5. 容器启动后访问不到 8083
检查容器状态:
docker compose ps检查端口监听:
ss -lntp | grep 8083检查日志:
docker logs --tail=100 calibre-web如果端口被占用,改 Compose 里的宿主机端口,例如:
ports: - "18083:8083"然后访问:
http://旧设备内网IP:18083cpolar 也对应改成:
cpolar http 180836. cpolar 地址能打开,但登录后很慢
先看书库文件大小和网络环境。扫描版 PDF、图片版资料、超大 EPUB 都会增加加载时间。
可以做三件事:
- 移动端优先阅读 EPUB;
- 大 PDF 在 Wi-Fi 下打开;
- 给旧设备接有线网,减少无线抖动。
7. 忘记关闭公网入口
如果 cpolar 是在前台运行的,回到终端按:
Ctrl + C如果 cpolar 在后台运行,先找进程:
ps aux | grep cpolar | grep -v grep结束进程:
pkill cpolar再从外网浏览器刷新 cpolar 地址,确认页面已经无法访问。
8. 想限制外网只读
用独立reader账号,不给它上传、编辑、删除、管理权限。外网登录时只用这个账号。
管理员账号不要保存在手机浏览器里,也不要发给别人。
十三、日常使用流程
搭好以后,日常流程可以固定成这样:
在家整理书库 -> Calibre 桌面版导入合法电子书 -> 同步到 /srv/ebook-stack/books -> 内网打开 Calibre-Web 检查封面和分类 -> 外出需要阅读时运行 cpolar http 8083 -> 用 reader 账号登录 HTTPS 地址 -> 阅读结束后 Ctrl + C 关闭隧道对应命令清单:
# 进入项目目录 cd /srv/ebook-stack # 启动 Calibre-Web docker compose up -d # 查看状态 docker compose ps # 查看日志 docker logs --tail=100 calibre-web # 临时开放外网 HTTPS 阅读入口 cpolar http 8083 # 停止服务 docker compose down如果只是关闭外网入口,不需要停 Calibre-Web,直接停止 cpolar 即可。Calibre-Web 留在内网继续运行,家里设备还能正常访问。
十四、写在最后
旧笔记本做电子书库这件事,价值不在于“把服务暴露到公网”,而在于把个人资料整理成一个随时能查、能读、能备份的系统。
Calibre-Web 负责把书库变得好浏览,Docker 负责让部署可迁移,cpolar 负责在需要时给一个临时 HTTPS 入口。三者配合起来,旧设备就不只是吃灰机器,而是一个轻量的个人知识柜。
我的做法很简单:默认内网使用,外出临时打开;默认只读账号,管理只在内网做;默认读完关闭,不把临时入口当长期公网服务。
这样用起来省心,也更安全。