旧笔记本搭 Calibre-Web 电子书库:Docker 跑起来后,用 cpolar 在外网安全打开阅读入口

旧笔记本搭 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 依赖它展示书名、作者、封面和分类。

最稳的做法是:

  1. 在自己的电脑上安装 Calibre 桌面版;
  2. 新建一个书库;
  3. 导入自己合法拥有的电子书;
  4. 整理书名、作者、封面、标签;
  5. 把整个 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:/books

Calibre-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 22

SSH 没有外网阅读需求,就不要顺手开放。

十、移动端访问体验

Calibre-Web 的移动端体验比直接翻文件夹舒服很多。手机浏览器打开 cpolar HTTPS 地址后,可以完成这些操作:

  • 按书名、作者、标签查找;
  • 在线阅读 EPUB;
  • 打开 PDF;
  • 查看封面和简介;
  • 继续上次阅读位置;
  • 把页面添加到手机桌面。

手机上可以这样用:

  1. 打开https://xxxx.cpolar.top
  2. 使用reader账号登录;
  3. 找到要看的书;
  4. 进入在线阅读;
  5. 阅读结束后退出登录;
  6. 回到旧设备终端关闭 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/books

books里有书籍文件、封面和metadata.dbconfig里有 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 -d

2. 登录后看不到书

确认初始化时填写的书库路径是:

/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:18083

cpolar 也对应改成:

cpolar http 18083

6. 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 入口。三者配合起来,旧设备就不只是吃灰机器,而是一个轻量的个人知识柜。

我的做法很简单:默认内网使用,外出临时打开;默认只读账号,管理只在内网做;默认读完关闭,不把临时入口当长期公网服务。

这样用起来省心,也更安全。