
做私人漫画库这个事我琢磨了挺久。起因很简单硬盘里攒了几千本漫画本地用文件夹按“作者/作品名/卷/文件”的方式堆着想找一本得翻半天手机上想看一眼还得先传到网盘网盘还有审核和限速的问题。后来我把目光放到自托管方案上试过几套漫画管理程序最后定下来用 Teemii 做主程序再用 cpolar 把内网服务暴露到公网整套跑在 CentOS 上。现在不管是通勤路上、出差酒店还是蹲坑摸鱼只要是能联网的设备打开浏览器就能接着上次的进度看漫画收藏夹、阅读进度、书籍元数据全部统一体验接近商业漫画App但数据完全在自己手里。这套组合的核心价值在于CentOS 提供稳定可靠的服务器底座Teemii 负责漫画资源的管理、下载、元数据匹配和 Web 阅读cpolar 解决没有公网 IP 的情况下安全访问内网服务的问题。相比买商业漫画阅读服务它没有平台内容删减没有会员墙没有设备数量限制唯一需要花费的成本是一台常年开机的机器和一点点折腾时间。这篇文章我会把整个方案从头到尾拆开讲清楚包括为什么选这三个组件、每个环节怎么配置、我踩过的坑以及现在还在用的优化技巧。如果你手头正好有一台闲置的 CentOS 机器无论配置多低跟着操作就能拥有一套属于自己的私人漫画云。1. 整体思路与方案选型1.1 为什么是 Teemii先说说主程序。市面上能跑漫画库的程序不算少比如 Komga、Kavita、Calibre-Web 加漫画插件还有 Jellyfin 的漫画扩展我都简单试用过。它们各有优势Komga 对 CBZ/CBR 的支持非常成熟Kavita 的 UI 更现代但都有一个共同的短板它们更像“书架管理工具”对“获取新资源”这件事基本不提供帮助你得自己到处找文件、整理命名、手动补封面和元数据。对于已经有大量本地漫画的人这没问题但对想持续追更、把零散资源整理成规范库的人操作量太大了。Teemii 的定位完全不同。它把“搜索来源”“元数据匹配”“章节下载”“本地文件扫描”“网页阅读器”“多用户阅读进度同步”全部集成在了一个 Docker 容器里。它支持从漫画源站直接搜索作品、查看详情、一键拉取整部漫画的章节文件入库也能扫描你已有的本地 CBZ/CBR/ZIP 目录自动匹配封面、作者、简介、出版社、标签这类元数据。换句话说它既当下载器又当整理器还当阅读器。这一点非常契合“私人漫画库”的真实使用场景——既要收藏也要追更既要本地存量也要新内容。还有个容易被忽略的点是它的阅读体验。Teemii 的网页阅读器做得相当舒服支持双页/单页切换、滚动模式、亮度调节、进度记忆。我实测在同一局域网内打开大部头漫画翻页响应很快快进快退也不会卡顿。配合 PWA 特性还能把页面贴到手机桌面当 App 用全屏模式下基本看不出是个网页应用。1.2 为什么用 cpolar 内网穿透漫画服务器放家里或办公室的 CentOS 机器上最大的问题是怎么“出门也能刷”。家里宽带没有公网 IP或者有 IP 但不想折腾 DDNS、端口映射、路由器防火墙这些事。传统的做法是自己买一台云服务器把 frp 之类的客户端和服务端配置起来做反向代理这条路不是不行只是维护成本高而且面向新手很劝退。cpolar 是我后来换用的方案它的工作方式用大白话说就是在 CentOS 上装一个客户端它会主动连回 cpolar 的服务器cpolar 分配给你一个可公网访问的域名然后所有访问这个域名的流量都会被转发到你本地指定的端口上。整个过程不需要在路由器上做任何配置也不需要你有公网 IP效果等同于是把内网服务“打了一个洞”到公网。这里要强调一下这个“洞”不是 P2P 点对点隧道而是经过加密的服务器转发所以客户端本身承担的公网带宽压力不大实际阅读漫画的瓶颈主要在自家宽带上行速度和漫画文件大小。选它而不是自己搭 frp原因有三。第一上手成本极低装完客户端、填个 token、建条隧道就能通整个过程十分钟内搞定。第二它提供了 Web 管理面板隧道的实时流量、状态、日志都可视化出问题能直接看日志排查。第三免费档足够个人使用付费档解决了固定域名和带宽提升的需求预算上下都有选择余地。还有一点很实际cpolar 提供了标准 Linux 安装脚本对 CentOS 7.9 和 CentOS Stream 9 都适配得很好不像某些小工具需要源码编译半天。1.3 为什么选定 CentOS 作为底座其实这套方案在 Debian、Ubuntu 上也能跑但我最终选定 CentOS 系列作为长期运行的底座主要是看中它的稳定性和运维可控性。作为常年开机的服务器系统CentOS 的软件包变动很克制系统升级不会三天两头给你整出破坏性变更。内核和关键组件相对保守稳定虽然被一些人吐槽“老旧”但对我来说跑一个漫画库要的是三天不重启、一年不重装而不是天天追新版本。当然这里必须说清楚一个现状CentOS 7 已经停止维护了继续裸奔不太合适。如果你现在要新装系统我建议装 CentOS Stream 9 或者转向兼容性极好的 Rocky Linux 9本文里绝大多数命令在这两个系统上都能直接复用个别差异我会单独标出来。我自己环境里目前一台是 CentOS 7.9 在用一台是 CentOS Stream 9 在跑新服务两边都实测过完整流程。如果你手头已经有现成的 CentOS 机器先别管版本直接照着做就行。系统版本差异主要集中在 Docker 源、防火墙命令这类外围地方核心逻辑完全一样。2. 环境准备与基础安装2.1 CentOS 初始化与基础配置拿到一台裸机 CentOS 后我习惯先做三件小事更新软件源、配置主机名、关闭 SELinux 或者给它开对放行策略。前两件事很多人都会做第三件事经常被忽略但漫画库这种应用跑在 Docker 里SELinux 对容器挂载目录的访问控制很容易导致权限问题表现症状就是容器起了但读不到漫画文件、写入失败日志里报一堆 Permission denied排查起来非常上头。如果不想关闭 SELinux也可以只对特定目录设置正确的上下文但实操里还是直接临时改为 permissive 模式最省心。修改 /etc/selinux/config 里的 SELINUXdisabled重启后生效。如果你的数据盘是一块单独挂载的机械盘或 SSD比如 /data需要确保系统启动时能把这块盘挂载到位否则容器起来后面数据目录不存在Docker 会自动帮你建一个空目录漫画资料却找不到了。# 更新软件包索引和基础工具 yum update -y yum install -y vim wget curl net-tools unzip # 确认系统版本 cat /etc/redhat-release还有一个小细节容易被忽视就是时间同步。Teemii 下载漫画时会生成大量时间戳、更新元数据如果系统时间和真实时间差太多后续日志排查会非常痛苦。CentOS 默认带了 chrony 或 ntpd跑一下yum install -y chrony systemctl enable --now chronyd就行。时间对了下载任务队列的排序、阅读进度的记录才不容易出乱子。2.2 Docker 环境部署Teemii 官方推荐用 Docker 部署好处是依赖全打包在镜像里纯粹一条命令启动。CentOS 上没有 Docker 的话需要先装。CentOS 7 和 Stream 9 的 Docker 安装方式略有差异CentOS 7 走 docker-ce.repoCentOS Stream 9 可以直接用系统自带的 podman 或装 docker-ce。为了叙述统一下面以 Docker CE 标准流程为准两个系统都能用。# 安装 yum-utils 并配置 Docker 官方源 yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker 并设置开机自启 systemctl start docker systemctl enable docker # 验证安装 docker --version国内网络环境下拉取 Docker 官方镜像的速度可能不太理想。这里提供一个实用的本地化思路编辑 /etc/docker/daemon.json配置可用的镜像加速地址然后重启 Docker。不同的镜像加速地址稳定性差异挺大我会在后面的排查章节详细说。拉取 Teemii 镜像时建议指定版本号而不是 latest因为漫画库这种长期迭代的项目大版本更新很可能伴随数据库结构变化固定版本能避免莫名其妙升级后数据兼容出问题。2.3 创建数据目录与权限规划Teemii 的运行数据主要分三块应用配置库、漫画文件库、临时下载缓存。我喜欢把这三块分开放在数据盘的不同目录下既方便备份也方便迁移。比如# /data 是我的单独数据盘 mkdir -p /data/teemii/config mkdir -p /data/teemii/library mkdir -p /data/teemii/downloads chown -R 1000:1000 /data/teemiichown 到 1000:1000 是因为很多 Docker 镜像内部默认以 uid 1000 运行非 root 用户提前把目录属主配好可以避免容器内写文件时出现 “operation not permitted” 的问题。这里顺便说一个心得Teemii 的 config 目录存放的是数据库和用户配置这个目录的备份优先级要高于 library。因为漫画文件丢了可以重新下载但你的阅读记录、书架分组、收藏进度丢了那真是重头再来。3. Teemii 漫画库部署与配置3.1 一键启动服务Teemii 提供了官方的 docker-compose.yml但自己写几行 docker run 更直观。我这里用 8090 端口做演示实际你可以在 compose 里随意映射到宿主机的任意端口。第一次运行后打开http://服务器IP:8090会出现初始化页面要求创建管理员账号、设置服务器名称。这些都是纯粹的引导操作跟着点就行。# docker-compose.yml 示例按需调整端口和挂载路径 services: teemii: image: teeemii/teemii:latest container_name: teemii restart: unless-stopped ports: - 8090:8090 volumes: - /data/teemii/config:/app/config - /data/teemii/library:/app/library - /data/teemii/downloads:/app/downloads environment: - PUID1000 - PGID1000 - TZAsia/Shanghai启动命令依然是老几样docker compose up -d。启动后用docker logs -f teemii观察一下日志看到类似 “Server listening on port 8090” 的提示说明容器已经正常跑起来了。第一次访问 Web 界面时页面风格很清爽中文适配也做得不错整体上手难度很低。3.2 配置漫画源与元数据登录进入主界面后第一步是进设置页面配置漫画源。Teemii 默认支持接入多个公开漫画源这里以 MangaDex 这类站点为例在设置里选中启用并保存即可。配置完成后可以在搜索栏直接输入日文原版名称、英文名称或作者名进行搜索。搜索结果里会显示封面、状态、评分、标签这些元数据信息点击卡片进入详情页可以查看章节列表、简介和出版信息。Teemii 的元数据匹配做得相当智能它把作品名翻译成多种语言去源站匹配所以不必担心中文作品名搜不到英文源。实测我收藏的一套日漫日文原名直接复制进去也能精准命中。命中后你可以选择自动填充封面和标签或者手动编辑成自己习惯的分类方式。我个人喜欢把标签改成中文——“冒险”“日常”“热血”这样后续构建智能书架时用得上。这个自定义元数据的功能是很多人没注意到的隐藏价值点花十分钟打整之后的体验能提升一个档次。下载章节时可以在详情页选择批量下载整部或只下载指定卷、指定话数。Teemii 会生成一个下载队列后台逐个拉取图片资源并打包成标准格式存入 library 目录。下载进度可以实时查看失败的任务也有重试入口。实测下载速度取决于源站响应速度和本地带宽我家 500M 下行的宽带一套 200 话的漫画大概要十几分钟到半小时体感可以接受。3.3 本地存量漫画导入如果你和我一样之前已经用文件夹方式积累了海量漫画文件Teemii 提供两种导入方式一是直接扫描本地目录二是通过 Web 界面上传。直接挂载目录扫描是最省事的。在设置里指定本地分类目录的根路径Teemii 会递归扫描识别 CBZ、CBR、PDF、ZIP 等格式。扫描到文件后它会尝试通过文件名解析作品和卷次再交给元数据匹配器来补充封面与简介。文件名命名越规范识别成功率越高。我踩过的坑之一就是早期收藏的漫画文件名五花八门有的叫 “xxx 01.cbz”有的就叫 “123.zip”。实话说对命名混乱的存量文件任何自动化工具都救不回来我最后是写了个批处理脚本统一把文件名改成 “作品名 第xx话.cbz” 的格式再让 Teemii 扫识别率直接从六成跳到九成以上。这个经验你参考一下如果存量文件不多直接在界面上手动改元数据更快。3.4 多用户与阅读进度Teemii 原生支持多用户体系每个账号的书架、收藏、阅读进度互相独立。创建家庭成员的账号很简单在管理员后台添加用户即可。这一点对我这种家里多设备共用一台服务器的场景非常关键我手机上读到一半切到电脑上打开网页进度能无缝续上毫无割裂感。如果你有孩子甚至可以给子账号单独控制允许访问的书架类型把不合适的内容隔离掉。阅读器本身的功能我在前面提了一些这里重点说阅读进度同步机制的细节。它的进度触发条件是播放和滚动事件不是简单定时轮询所以正常阅读时基本不会丢进度。偶尔遇到看几十页后进度没变化多半是浏览器标签页长期后台挂起导致的刷新一下页面就好。真遇到同步失灵检查一下服务器时间是否正确我遇到过系统时间和北京时间差了好几个小时直接导致“昨天阅读到第50话今天打开变成第10话”的灵异事件。4. cpolar 搭建公网访问链路4.1 安装 cpolar 客户端先把 cpolar 客户端装到 CentOS 上。官方提供了一键安装脚本执行完会自动注册 systemd 服务。装完以后需要到 cpolar 官网注册账号拿到个人专属的 authtoken。这个 token 相当于把当前程序认证到你的账号下填一次就行。# 安装 cpolar curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash # 查看版本确认安装成功 cpolar version # 验证 token换成你自己的 authtoken cpolar authtoken xxxxxxxxxxxxxxxxxxxx安装完成后建议先执行一次cpolar start 黑名单之类的测试命令让隧道跑起来去官网的管理后台看一下在线状态。确认客户端正常连接后再把它配置成常驻服务。cpolar 支持通过 Web 面板来管理隧道也可以在命令行直接创建临时隧道后者更适合初筛端口是否通。实际长期使用我建议直接在 Web 面板里配置固定隧道因为面板里可以设置域名类型、流量限制、认证信息比命令行参数更直观。4.2 创建隧道与获取公网地址cpolar 的隧道本质就是把本地某个端口映射成一个公网可访问的 URL。对 Teemii 来说我们需要创建一条 HTTP 隧道指向宿主机 8090 端口。免费版会分配一个随机域名每次隧道重建后可能变化所以想要长期固定访问地址要么升级到付费档绑定子域名要么利用它每月免费提供的固定域名额度。我实操下来的一致性体验是免费档更适合短期测试真正作为日常访问入口固定域名几乎算是必需品。因为你要把它存到手机书签里、分享给家人一个稳定的 URL 才靠谱。# 命令行快速创建一条 http 隧道 cpolar http 8090执行后终端会输出一个形如https://xxxxxx.cpolar.top的公网地址。在自己手机的 4G 网络下直接访问这个地址如果能看到 Teemii 的登录页说明整条链路已经通了。注意这里一定要用手机流量测而不是连着自家 WiFi 测否则本质上还是局域网访问无法证明公网链路正常。4.3 配置域名与访问加固拿到可用的公网地址后接下来是加固和安全设定。这部分我最看重因为暴露到公网的服务面向的是整个互联网前面没有任何硬件防火墙安全必须自己负责。Teemii 本身有登录机制这挡住了大多数无效访问但纯裸奔 HTTP 链接理论上流量是明文传输的在公共 WiFi 下有一定被窃听的风险。cpolar 在付费档里可以启用 HTTPS强制加密流量建议有条件就开。系统层面还可以叠加一个简单的访问白名单。如果你对外提供服务只给自己和家里人用可以在 cpolar 面板里开启客户端 IP 限制只允许你日常出口的 IP 访问。当然这个对家里宽带动态 IP 用户不太友好所以更通用的做法是服务端强密码 HTTPS 定期检查日志。Teemii 的登录页面有基础的人机校验能力密码务必用长密码别再用 123456 这种糊弄自己。另外启动 Docker 容器时通过环境变量限制上传体积之类的事也可以考虑但既然只给自己看保持默认配置就好。4.4 开机自启与后台运行隧道配置好后最烦人的就是以后重启机器后还得手动执行命令。cpolar 官方推荐把它安装成系统服务安装脚本其实已经自动注册好了只需要 enable 一下。# 查看服务状态 systemctl status cpolar # 设置开机自启 systemctl enable cpolar # 查看所有服务与隧道运行状态 cpolar status如果 cpolar 客户端没有以服务方式运行而是用命令行cpolar start手动托起的关掉终端它就死了。我用 systemd 服务后CentOS 每次开机重启cpolar 自动连回服务器隧道自动恢复根本不用管。这里可以补充一个检查点确认隧道恢复后去公网地址刷新一下页面能正常打开 Web 登录页就说明没什么问题。整条链路现在算是彻底跑通了。4.5 出门刷漫画的实际体验部署完成后我在手机上把所有场景都试了一遍地铁上看漫画加载速度取决于头部流量的速度和家里上行带宽漫画页基本都是一两秒内加载出来翻页流畅度跟本地看没多大差别。酒店 WiFi、5G 网络下也都稳定。之前担心的“图片加载半天、进度丢到天边”的情况并没有出现。相比网盘分享链接那种等审核又限速的方案这套私人漫画库的体验是质的飞跃。5. 常见问题与排查技巧实录5.1 本地能打开公网却打不开遇到最多的故障就是本地访问正常但用 cpolar 分配的公网地址打不开页面浏览器提示超时或连接被拒绝。排查步骤按优先级来先确认 cpolar 隧道在线状态去面板看是不是离线了再确认 Teemii 容器监听的是不是 8090 端口docker ps看一下端口映射最后再看一下防火墙有没有放行对应 TCP 端口。# 查看监听端口 ss -tlnp | grep 8090 # 查看防火墙开放端口 firewall-cmd --list-ports systemctl status firewalld如果是防火墙没放行firewall-cmd --permanent --add-port8090/tcp firewall-cmd --reload即可。还有些 CentOS 机器我遇到过 cloud-init 网络问题导致出口带宽异常但这属于另类情况先按上面三步排查基本能解决九成问题。5.2 下载漫画速度奇慢或卡住不动Teemii 下载慢的原因通常是漫画源站的响应速度、本地网络出去到源站的链路质量以及同时下载任务数太多造成的互相争抢带宽。我的处理方式是控制并发把同时下载的章节数限制在两三本以内。另外下载任务卡住不动时把它们全部暂停等几分钟再点重试常常就恢复了。如果源站频繁超时可以考虑更换备用的漫画源Teemii 的配置里允许多个源同时启用搜索和下载时会自动选择可用性高的一个。5.3 免费域名变化频繁书签失效免费档分配的随机域名每次隧道重启都有可能变这个问题我在前面提过这里再补一个临时处理技巧如果你现在用的还是免费档可以让 cpolar 服务始终在线尽量避免重启隧道的操作域名就能在一段时间内保持稳定。但哪天服务器断电重启了域名还是有概率变化。长期用固定域名是真的省心毕竟手机书签、家人分享链接都基于它隔几天改一次谁也受不了。5.4 磁盘空间告急漫画图片文件就算压缩成 CBZ大部头作品动辄几百 MB几百套下来几百 GB 很轻松。我加了定时任务去清理下载缓存目录/data/teemii/downloads因为已经入库的文件其实不需要保留临时包。同时建议给 library 目录做硬链接或重复数据删除这个高级玩法我在第四部分还会提到。最直接的提醒是开一块大盘或者干脆做一个简单的磁盘监控脚本低于某个阈值就往手机推个通知。5.5 Docker 镜像拉取失败或超时前面我提到国内网络下 Docker Hub 慢这里详细说。修改 /etc/docker/daemon.json 配置镜像加速器然后systemctl restart docker。但说实话加速器的稳定性经常波动多配几个地址更保险。如果镜像一直拉不下来另一个偏方是先找一台能顺利拉取镜像的机器把镜像 save 成 tar 包再拷贝到 CentOS 上用 load 导入虽然麻烦点但绝对有效。5.6 CPU 占用高与内存不足Teemii 在批量下载大量图片时会做解压、缩略图生成和元数据计算瞬时 CPU 和内存占用会明显上升。我在 CentOS 上习惯用top和docker stats实时看占用基本能定位是哪个容器在吃资源。如果内存长期吃紧可以限制 Docker 容器的内存上限比如加mem_limit参数防止漫画库程序和其他服务互相挤兑。6. 进阶优化与长期维护建议6.1 给 Teemii 套一个 Nginx 反代其实 Teemii 自带 Web 服务但如果你记不住带端口的地址或者想统一管理多个自托管应用可以把它放在 Nginx 后面。CentOS 上装 Nginx配置一个 server 块将某个子域名的请求转发到 8090还能顺手加上 gzip 压缩。漫画图片多是重复度高的 PNG/JPGgzip 压不了多少但对 HTML、CSS、JSON 接口这类文本数据有效能显著提升 Web 界面的响应速度。6.2 数据备份策略私人漫画库最宝贵的资产不是漫画文件本身而是元数据和阅读进度。我每周用 cron 打包/data/teemii/config目录加密后传到另一台离线机器上。library 文件夹里的漫画文件我会用 rsync 增量同步到外接磁盘。做了这套策略后心理压力小了很多再也不用担心哪天真想扩容却发现数据已经找不回来了。6.3 与 Telegram/自建通知联动Teemii 有 Webhook 能力我利用它在下载任务完成时通过自建的消息推送机器人发个提醒。主要是“新章节更新了”“批量下载完成了”这类事件把通知推到手机通知栏比天天开着 Web 界面刷新更省事。不是所有人都需要这个功能但如果你的漫画更新很频繁这个自动化能帮你省掉不少无谓的刷新操作。6.4 更进一步家庭多媒体中心扩展漫画库只是自托管娱乐系统的一块拼图。同一台 CentOS 上已经跑着 Teemii 的话完全可以再叠加一个影音服务器把剧集、电影、音乐统一管理出门访问同样走 cpolar 的隧道。这样操作的本质逻辑是一样的本地存储、公网访问、多端同步。而 Teemii 因为这套组合跑得很稳定完全可以作为整个家庭私有云平台的试点项目验证成熟之后再推广到其他服务。7. 写在最后的一些体会折腾完这套系统之后我最大的感受是技术难度的最大敌人不是知识储备而是对“每一步为什么这么做”的清晰认识。Teemii 让我看到漫画库不该只是一个冷冰冰的文件柜它可以很智能地帮我维护元数据、追更、同步进度像一个安静的私人图书馆管理员。cpolar 解决了网络层最后十里路的困难不再需要为了远程访问去啃路由器文档也不用担心没有公网 IP 这件事。CentOS 作为整个地基给了我足够的稳定性让我可以搭完一次就放心用很久。如果看完这篇你准备动手搭我给几点非常具体的建议。第一先把数据目录规划好再装应用不要边装边改路径不然后面迁移会非常痛苦。第二cpolar 的固定域名建议直接安排别总想着免费档应付长期用固定域名真的省心。第三为了家人的使用体验多建几个独立账号各自的书架互不干扰比共用一个管理员账号不知道强多少。最后提醒一下版权意识确保接入的漫画源和内容来源合法合规下载和收藏的都是你有权保存的内容。做私人库是为了方便和热爱不是搬运盗版。这既是对创作者的基本尊重也是长期稳定使用的底线。