ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CentOS上搭建私人漫画库:Teemii管理库+cpolar内网穿透,手机随时刷漫画

CentOS上搭建私人漫画库:Teemii管理库+cpolar内网穿透,手机随时刷漫画 我自己的漫画收藏早就乱得没法看了。硬盘里塞了十几个文件夹有早年买的电子版有从旧平板里导出来的截图还有一大堆不知道什么时候存进去的单行本。每次想找某一话得翻半天目录。更要命的是出门在外想刷一刷什么也看不了网盘不是限速就是失效。后来我干脆在CentOS服务器上搭了一套私人漫画库浏览器随时打开出门用手机也能刷收藏。核心就两个东西Teemii负责管理漫画库并提供阅读页面cpolar负责把内网服务安全地暴露到公网。这套方案不挑机器一台闲置的x86小主机或者旧电脑都能跑起来。这篇东西写给谁如果你手头正好有一台CentOS系统的服务器或者愿意装一个平时又有囤漫画、想随时看的习惯那跟着我做就行。不需要编译源码不需要懂Kubernetes所有东西都用Docker容器跑操作路径很清晰。我尽量把每个步骤背后的原因也讲明白免得你抄完命令不知道怎么改。1. 为什么是Teemii和cpolar自建漫画库的方案选型1.1 漫画库工具那么多为什么挑Teemii先聊聊选型。自建漫画阅读服务其实有几条路。老牌的Calibre主要是管理电子书的虽然也能塞漫画但它的长处是元数据整理和格式转换对漫画这种“按话分章节、还要保留阅读进度”的场景支持得比较生硬。还有一类是纯静态的漫画阅读器比如把漫画文件夹丢进Nginx写个简单的列表页但这样没进度记录、没有封面缓存、也没有多端同步基本回到十年前的个人网站时代。Teemii是面向漫画场景的专用服务。它有几个点特别对我胃口。第一它自带一个现代化的Web阅读器翻页、缩放、进度记忆都做得比较细手机上打开就是移动端适配的界面不用额外装App。第二它能扫描你本地的漫画文件夹自动生成封面和章节索引你不需要按照某种苛刻的命名规范来整理文件。第三它接入了在线漫画源可以在应用里直接搜索并拉取章节文件入库。第四它由Docker分发部署就是一条docker compose命令的事不需要手动折腾Node环境、数据库配置。当然Teemii也不是没有缺点。它的项目迭代速度不算快一些功能还停留在“能用但不够精致”的阶段比如在线源的解析偶尔会抽风有些站点改版后需要等社区修复。但考虑到自部署的灵活性和我对漫画管理的基本需求它已经是同类里最顺手的一个了。1.2 cpolar在整个链路里的作用服务搭好了接下来是更麻烦的问题怎么在外面访问如果你有公网IP可以直接端口映射如果没有常规做法是租一台带公网IP的云主机做反向代理或者用frp、ZeroTier这类工具组网。但说实话这些方案对普通用户都有点门槛。路由器要支持端口转发运营商给不给你公网IP全看运气frp自己搭中转服务器又是一笔额外运维负担。cpolar的思路是你在内网跑一个客户端它主动跟cpolar的服务器建立加密隧道然后cpolar给你分配一个公网访问地址。别人访问这个地址数据就被转发到你内网的服务上。你不需要公网IP不需要改路由器不需要买云主机。客户端还是以systemd服务的形式常驻运行开机自启基本一劳永逸。我最终选择cpolar还有一个很现实的原因它有免费套餐个人玩完全够用。免费档支持创建两个隧道对于只暴露Teemii这一个服务来说绰绰有余。付费版提供固定域名和更高的带宽但我先用免费的跑通了后续有需要再升级。2. CentOS服务器准备从系统到容器的基座2.1 系统版本选型CentOS 7还是Stream 9标题里写的是CentOS但CentOS本身也是个大家族得先确认你手上是哪一代。CentOS 7在2024年6月30日已经正式停止维护了官方软件源全部移到了vault仓库直接用yum安装软件会报404。我在一台老机器上踩过这个坑折腾了一个小时才反应过来是源失效。如果你手上已经有CentOS 7的机器也不是不能用但必须先把yum源切换到vault镜像我后面会给出处理方法如果你是从零开始装我更推荐直接上CentOS Stream 9它还在持续维护Docker的支持也更好。无论哪个版本安装系统时都建议用Minimal最小化安装不要带图形界面。服务器跑图形桌面纯属浪费内存和CPUTeemii本身是Web应用你不需要在本机打开任何窗口。我实测过最小化安装的Stream 9加上Docker、Teemii和cpolar内存占用大概在1.2GB到1.5GB之间2GB内存的小机器也能跑。装完系统第一件事建议顺手做几个常规操作用cat /etc/centos-release确认版本用free -h和nproc看一下内存和CPU核心数心里有个底。然后更新系统dnf update -y这一步时间长短取决于网络。国内服务器建议先换阿里云镜像源CentOS Stream 9的源配置在/etc/yum.repos.d/下面把baseurl指到mirrors.aliyun.com即可网上有现成的repo文件替换后重新makecache。2.2 挂载数据硬盘与目录规划漫画库最占资源的是磁盘一部完整的漫画动辄几个GB所以一定要把数据放在大容量分区上。如果你的服务器有一块独立数据盘需要手动挂载如果就一块系统盘这节可以跳过但建议至少看一下分区情况。lsblk假设你看到一块未分区的新盘/dev/sdb传统做法是fdisk分区、mkfs格式化、mount挂载三步走。但如果你不打算把这块盘拆成多个分区也可以一步到位mkfs.xfs /dev/sdb mkdir -p /data/teemii mount /dev/sdb /data/teemii这里我用的是XFS文件系统CentOS默认支持得最好。格式化之前务必确认盘符选对了这一步没有任何后悔药误格式化系统盘只能重装。关键点是开机自动挂载。如果你不想每次重启都手动打mount命令就编辑/etc/fstabecho /dev/sdb /data/teemii xfs defaults 0 0 /etc/fstab然后执行mount -a验证一下没有报错就说明配置没问题。为什么要单独规划目录因为Teemii容器化部署时会把漫画文件持久化挂载到宿主机上如果后面容器升级、甚至换了一个新的Docker编排文件只要挂载目录不变数据就都在。我习惯把所有自建服务的数据都放在/data下面每个服务一个子目录结构清晰备份也方便。2.3 安装Docker与Compose插件Teemii官方推荐用Docker部署所以这一步是整个流程的基础设施。CentOS Stream 9安装Docker可以用官方脚本也可以配置docker-ce仓库后用dnf装。我这里用仓库方式因为以后升级、卸载都更规范dnf config-manager --add-repohttps://download.docker.com/linux/centos/docker-ce.repo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin systemctl enable --now docker如果你安装的是CentOS 7且已经切换到了vault源同样配docker-ce仓库但需要额外安装container-selinux之类的依赖有时候要从vault的extras仓库里手工拉包比较折腾。建议老机器实在搞不定就直接换Stream 9省得浪费时间。装完之后验证一下docker version docker compose version两条命令有输出就说明环境OK了。这里我特意装了docker-compose-plugin而不是老旧的docker-compose二进制新版Docker直接把Compose做成了子命令语法更简洁也不需要单独维护Python依赖。后面部署Teemii会用到docker compose文件。3. Teemii漫画库部署实战3.1 编写docker-compose.yml并启动Teemii在Docker Hub上的镜像名是teemii/teemii官方文档建议映射3000端口。这里给一份我实际在用的编排文件做了精简和注释services: teemii: image: teemii/teemii:latest container_name: teemii restart: unless-stopped ports: - 3000:3000 volumes: - /data/teemii:/app/data environment: - TZAsia/Shanghai把这段保存成/data/teemii/docker-compose.yml然后在同目录执行docker compose up -d我解释一下几个关键配置为什么这么写。restart: unless-stopped意味着除了你手动停止容器挂了会自动拉起服务器重启后也会自动恢复这对一个面向日常使用、不希望手动干预的服务来说非常重要。volumes这一行把宿主机的/data/teemii目录映射进容器内的/app/dataTeemii会把数据库文件、漫画元数据、封面缓存、导入的本地漫画全部写在这里后期备份只需打包这个目录。TZ环境变量指定时区不设的话日志时间会差8个小时。启动后等十几秒让容器完成初始化然后浏览器访问http://服务器IP:3000。如果你看到Teemii的欢迎页面说明容器起得没问题。首次打开会要求配置管理员账号和管理员密钥这个密钥是Teemii初始化后端管理接口用的建议设置一个随机字符串而不是简单密码后面在线源拉取、库管理都要用到它。3.2 初始化媒体库和文件目录结构设置完管理员账号下一步是建立媒体库。Teemii支持创建多个库它内部叫Media Library比如“日漫”“国漫”“欧美漫画”分开管理。每个库对应宿主机上的一个目录创建库时让你填目录路径这里填的是容器内的路径不是宿主机路径。所以要搞清楚映射关系宿主机/data/teemii对应容器内/app/data那么在Teemii里填“/app/data/manga”就会落到宿主机的/data/teemii/manga目录。我的建议是创建一个主库就行路径填/app/data/manga不用一开始就建一堆分类。库创建后Teemii会扫描这个目录并开始为已有的漫画文件生成封面和索引。扫描速度取决于文件数量几百本的话几分钟内能完成。这一节补一个关于目录规划的细节。Teemii对漫画文件和封面的识别逻辑比较依赖文件命名但它的容错率比很多同类工具高。我试过乱七八糟的命名比如“海贼王_第100话_标题.jpg”它也能根据文件名里的数字识别出章节顺序。但如果你希望展示效果更精致入库前最好用统一的命名规则作品名/第001话/001.jpg 作品名/第001话/002.jpg这个层级关系简单直接Teemii能非常准确地识别作品、章节和页序。如果文件名里不带话数它会把这一整个目录当作一个长条单章阅读器里翻页会变得很长体验会差不少。3.3 入库漫画的三种方式与效率对比Teemii导入漫画的主力方式有三种我每种都用过说说实际感受。第一种本地文件批量导入。把自己电脑里的漫画目录直接拷贝到服务器的/data/teemii/manga下面然后在Teemii后台点“扫描媒体库”新文件就会被识别。这种方式最可控、速度最快毕竟数据全在自己手里。拷贝可以用scp、rsync如果在局域网内rsync的效率明显更高rsync -avh --progress /本地漫画目录/ root服务器IP:/data/teemii/manga/第二种通过在线漫画源搜索并拉取。Teemii集成了多个在线漫画源你在后台搜索关键词它会列出结果选中的作品会按章节逐个下载到本地库。这个功能最爽的地方在于遇到想看的新作品不用去网上找下载包直接在Teemii里搜一下就能入库。但要注意在线源的稳定性和可访问性受网络环境影响国内网络访问某些海外源速度很慢甚至超时需要耐心一点。我的经验是单章下载没问题整部几百章一次性批量拉取容易在中途失败最好是分几次操作失败了在任务列表里重新排队。第三种URL直链导入。如果你有一个漫画文件的直接下载链接可以填进去让Teemii拉取。这种方式适合补漏比如某个单行本只有特定网盘链接。我用的不多因为直链经常失效。三种方式的效率排序本地rsync导入明显快于在线拉取在线拉取又比找资源再上传快得多主要是省去了你手动找资源的时间。我日常的流程是已经有的存量漫画用rsync一次性灌进去新追的漫画直接在Teemii里搜源下载。注意用在线源拉取时请务必确认你所在地区对这个源的内容访问没有法律限制同时只收录有授权或允许个人备份的内容。私人图书馆的核心在于“备份自己已有的收藏”而不是大规模搬运传播。4. cpolar内网穿透把书架装进口袋4.1 安装cpolar客户端并注册认证Teemii已经能在内网访问了但出门还得靠cpolar。第一步是安装cpolar客户端。CentOS上官方提供了一键脚本也可以下载rpm包本地安装。我用的脚本方式curl -L https://www.cpolar.com/static/downloads/install-release/cpolar.sh | sudo bash脚本会安装cpolar二进制到/usr/local/bin并注册一个systemd服务。安装完成后先验证一下版本cpolar version然后需要去cpolar官网注册一个账号注册是免费的。注册后在后台的“验证”页面能找到你的authtoken这个token是客户端和你的账号绑定的凭证需要执行cpolar authtoken 你的token这条命令会把token写进cpolar的配置文件后续启动隧道就能在dashboard里看到了。4.2 创建HTTP隧道映射Teemii的3000端口cpolar创建隧道有命令行和后台两种方式。我习惯先在后台操作逻辑更直观登录cpolar dashboard进入“隧道管理”点“创建隧道”协议选HTTP本地地址填localhost:3000然后提交。创建成功后cpolar会分配一个公网地址形式类似https://xxxx.cpolar.top。分配地址之后还要让客户端真正把这台隧道建起来。执行cpolar start teemii其中teemii是你给隧道起的名字。如果你希望cpolar一直后台运行直接使用systemd服务systemctl start cpolar systemctl enable cpolar查看隧道状态用cpolar status输出里能看到隧道的公网地址、本地转发地址和连接状态。此时你用自己的手机浏览器打开这个https地址就能看到Teemii的登录页了。整个链路的公网访问部分到这里就通了。这里我特别提醒一下免费版cpolar分配给用户的公网地址是随机生成的每次重启隧道或者服务端重新分配地址可能会变。这意味着你今天用这个地址访问过几天可能就失效了需要去dashboard里查新的地址。对临时体验来说无所谓但如果你天天都要用地址老变就太烦了。解决办法是升级到付费版里的固定域名功能或者走cpolar的免费固定域名活动具体以官方当前政策为准。我自己的做法是先免费跑通流程确认没问题后再考虑固定域名避免一开始就投入成本。4.3 让公网访问更顺手的安全加固cpolar给你的是一个公网可达的地址意味着任何人都可能扫到这个域名并尝试访问你的Teemii。虽然Teemii本身有管理员密码保护但有些配置还是值得做一下。第一不要用默认的3000端口直接映射到公网。虽然cpolar的随机URL本身就起了一定的混淆作用但在Teemii的容器端口映射上可以改成随机高位端口比如ports: - 18723:3000这样即使有人扫描IP也不容易直接定位到服务。cpolar那边本地地址填localhost:18723即可。第二确保Teemii的管理员密钥足够复杂。这个密钥和登录密码是两回事它控制着媒体库的增删、源管理等高权限操作泄露后果比登录密码更严重。我在部署时用的密钥是32位随机字符串用openssl rand -hex 16生成记住备份到密码管理器里。第三可以考虑给Nginx加一层访问认证。如果以后想在cpolar和Teemii之间加一个Nginx反代在Nginx里配置Basic Auth相当于给公网访问再加一道锁。但这一节不多展开对单用户私人漫画库来说Teemii自带的登录加上强密钥已经能挡住绝大多数随手扫描。如果你是强迫症后续再慢慢加。5. 实际体验与常见问题排查5.1 出门刷漫画的真实体验整套服务搭好之后我在外面用手机实际刷了几天。访问流程是打开手机浏览器输入cpolar分配的公网地址登录Teemii书架加载出所有作品封面点开一本阅读器左右翻页进度自动记录。漫画文件都是以图片为主对带宽的消耗很直接。在4G/5G网络下一张常规漫画页大概200KB到500KB翻页时需要重新加载体感速度取决于本地网络和cpolar中转服务器的带宽。免费档的速度不算快但看漫画够用毕竟不是看视频逐页加载的压力小很多。如果是在地铁上信号不太好的场景阅读器加载会有一点延迟但不会像视频那样缓冲卡死。我实测下来一话二十多页一分钟左右能全部翻完基本能接受。有一个使用上的小技巧Teemii的阅读器支持预加载下一页在设置里打开这个开关翻页体验会顺畅不少。手机浏览器记得设成桌面请求不需要Teemii的阅读器对移动端适配做得不错直接访问即可。另外一个体会是外面刷漫画更多是“临时补几话”而不是“整套看完”。所以我出门前一般会在服务器上把要看的章节先下载好再在路上慢慢看。在线源有时不稳定临时拉取很可能失败提前本地化是最稳妥的。5.2 常见问题速查表我把这个搭建过程里最容易踩的坑整理成一个表方便你排查。现象可能原因解决方案CentOS 7执行yum报404官方源已迁往vault把/etc/yum.repos.d/下repo文件的baseurl换为vault.centos.org镜像Docker拉取镜像超时网络访问Docker Hub受限配置docker registry mirror镜像加速器docker compose命令不存在未安装compose插件dnf install docker-compose-plugin容器启动后浏览器无法访问防火墙未放行端口firewall-cmd --add-port3000/tcp --permanent firewall-cmd --reload扫描媒体库但新文件没出现文件放在宿主机路径但未映射进容器确认compose文件里volumes映射的宿主机目录和容器内目录路径正确漫画封面不显示文件名不规范元数据解析失败统一命名作品名/第xxx话/xxx.jpg重新扫描在线源搜索超时当前网络访问该源受限更换在线源或手动下载后本地上传cpolar start后隧道连不上未绑定账号authtoken执行cpolar authtoken 后重启服务免费域名第二天变了免费随机域名可能被重新分配访问cpolar dashboard查看最新地址或考虑固定域名方案重启服务器后cpolar未自动连接systemd服务未启用systemctl enable cpolar在VirtualBox等虚拟机里访问不到服务网络模式问题把虚拟机网络设为桥接模式或配置端口转发这里面有两条值得单独说说。第一条是防火墙CentOS默认防火墙是firewalld哪怕Docker映射了端口如果防火墙规则不放行外部照样访问不了。我在一台机器上排查了半小时最后发现是firewall-cmd没放行端口。如果你用的是云服务器还要记得在安全组规则里放行对应端口。第二条是VirtualBox虚拟机场景。如果你是在本地虚拟机里跑CentOS宿主机的浏览器访问虚拟机IP时经常不通多半是网络模式选错了。虚拟机网络模式选“桥接”可以让虚拟机直接获得局域网IP如果只能用NAT模式就必须在VirtualBox的端口转发里把宿主机的3000端口映射到虚拟机的3000端口。这个坑在文章开头提到的热词里也反复出现可见中招的人不少。5.3 备份与长期运维建议Teemii的全部数据都落在挂载目录里备份非常直观。只要打包/data/teemii整个目录就相当于备份了整个漫画库包括数据库、封面缓存和漫画文件。我写了一个简单的定时备份脚本放到cron里每周执行一次#!/bin/bash tar -czf /backup/teemii_$(date %Y%m%d).tar.gz -C /data teemii find /backup -name teemii_* -mtime 14 -delete第一行打压缩包第二行删除14天前的旧备份避免磁盘被备份文件撑爆。如果你有另一个磁盘或者挂载了对象存储把备份文件同步过去就更稳妥了。容器升级也要注意。Teemii更新时最安全的步骤是docker compose pull docker compose up -d镜像更新后容器会用新镜像重建但数据卷不受影响。我升级过好几次没有遇到数据丢失。唯一要注意的是升级前看一眼GitHub Release说明如果提示数据库结构变化最好先手动备份一次再动。我个人在实际使用中还有一个习惯在线源拉取下来的漫画我会定期导出一份到本地的移动硬盘。原因很简单在线源本身也有生命周期今天能拉的源明天可能就挂了。真正属于自己的收藏还是得有一份脱离服务器的物理备份。这套方案我用了大半年最满意的其实就是这种“随便折腾”的从容——服务器挂了备份还在域名变了重新查一下就好漫画源失效了本地文件不会少。自建服务的好处不在于一步到位而在于所有环节都在自己手里随时可以修修补补。如果你也囤了一堆漫画不妨试试这套组合。
返回列表