文章目录
-
- 每日一句正能量
- 前言
- 1. Teemii 在这套方案里负责什么?
- 2. 先在 CentOS 7 上准备 Teemii
-
- 2.1 SSH 登录服务器
- 2.2 创建 Teemii 目录
- 3. 用 Docker Compose 启动 Teemii
- 4. 第一次进入 Teemii,先把基本流程跑一遍
- 5. 本地阅读跑通以后,再解决远程访问
- 6. 安装 cpolar
- 7. 先用随机域名验证 `8034`
- 8. 长期使用,再换成固定二级子域名
- 总结

每日一句正能量
把注意力从改变他人收回,专注经营自己,你会发现,当你变了,周围的世界也跟着变了。 试图改变他人往往徒劳且痛苦;而专注自我成长却是唯一可控且有效的路径。自身的能量场、认知层次和行为模式一旦提升,与他人的互动方式、看待问题的角度、乃至能吸引和创造的环境都会随之改变。
前言
漫画真正多起来以后,麻烦通常不是“没有内容”,而是资料越来越散:有的在本地文件夹里,有的靠搜索临时找,有的看完一半以后下次又要重新定位。如果本来就有一台常开的 CentOS 服务器,与其继续把漫画分散在不同设备上,不如给它加一个专门的 Web 入口,把搜索、书架、本地导入和在线阅读放到一起。Teemii 在这篇里的作用就是这一层:通过 Docker Compose 把前端和后端跑起来,再用 8034 打开管理与阅读页面;确认搜索、加入书架、本地文件导入和阅读都能使用以后,再用 cpolar 把这个页面从局域网延伸到公网,最后配置固定二级子域名。整套流程不追求把 CentOS 包装成“漫画神器”,重点是把漫画服务真正跑通,并把本地阅读和远程访问分成两个清楚的阶段。

1. Teemii 在这套方案里负责什么?
这篇采用 权威综述型 的组织方式,但不会把内容写成产品说明书。
更适合它的人物性格是:
有点收藏癖,也有点技术洁癖。漫画可以多,但入口最好别乱;每一层到底负责什么,也希望说清楚。
Teemii 在本文中实际展示出来的能力主要有:
- Web 页面初始化;
- 搜索漫画;
- 加入书架;
- 从文件导入本地漫画;
- 在线阅读。
原文还用了“自动下载、智能分类、多端阅读”等更大的描述,但后面的截图与步骤真正明确演示的是上面这几项,因此新版会按实际操作范围来写,不把没有单独验证的能力继续放大。
整篇的技术结构也很简单:
CentOS 7 → Docker Compose → Teemii 前端 / 后端 → 8034 → 漫画搜索 / 书架 / 导入 / 阅读 → cpolar → 随机公网地址 → tee 固定二级子域名。
下面用一张流程图把整条链路串起来,方便对照后面的步骤理解每一层的作用:
#mermaid-svg-GwBaCqONdVll1c5K{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GwBaCqONdVll1c5K .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GwBaCqONdVll1c5K .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GwBaCqONdVll1c5K .error-icon{fill:#552222;}#mermaid-svg-GwBaCqONdVll1c5K .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GwBaCqONdVll1c5K .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GwBaCqONdVll1c5K .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GwBaCqONdVll1c5K .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GwBaCqONdVll1c5K .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GwBaCqONdVll1c5K .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GwBaCqONdVll1c5K .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GwBaCqONdVll1c5K .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GwBaCqONdVll1c5K .marker.cross{stroke:#333333;}#mermaid-svg-GwBaCqONdVll1c5K svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GwBaCqONdVll1c5K p{margin:0;}#mermaid-svg-GwBaCqONdVll1c5K .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-GwBaCqONdVll1c5K .cluster-label text{fill:#333;}#mermaid-svg-GwBaCqONdVll1c5K .cluster-label span{color:#333;}#mermaid-svg-GwBaCqONdVll1c5K .cluster-label span p{background-color:transparent;}#mermaid-svg-GwBaCqONdVll1c5K .label text,#mermaid-svg-GwBaCqONdVll1c5K span{fill:#333;color:#333;}#mermaid-svg-GwBaCqONdVll1c5K .node rect,#mermaid-svg-GwBaCqONdVll1c5K .node circle,#mermaid-svg-GwBaCqONdVll1c5K .node ellipse,#mermaid-svg-GwBaCqONdVll1c5K .node polygon,#mermaid-svg-GwBaCqONdVll1c5K .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GwBaCqONdVll1c5K .rough-node .label text,#mermaid-svg-GwBaCqONdVll1c5K .node .label text,#mermaid-svg-GwBaCqONdVll1c5K .image-shape .label,#mermaid-svg-GwBaCqONdVll1c5K .icon-shape .label{text-anchor:middle;}#mermaid-svg-GwBaCqONdVll1c5K .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GwBaCqONdVll1c5K .rough-node .label,#mermaid-svg-GwBaCqONdVll1c5K .node .label,#mermaid-svg-GwBaCqONdVll1c5K .image-shape .label,#mermaid-svg-GwBaCqONdVll1c5K .icon-shape .label{text-align:center;}#mermaid-svg-GwBaCqONdVll1c5K .node.clickable{cursor:pointer;}#mermaid-svg-GwBaCqONdVll1c5K .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GwBaCqONdVll1c5K .arrowheadPath{fill:#333333;}#mermaid-svg-GwBaCqONdVll1c5K .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GwBaCqONdVll1c5K .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GwBaCqONdVll1c5K .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GwBaCqONdVll1c5K .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GwBaCqONdVll1c5K .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GwBaCqONdVll1c5K .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GwBaCqONdVll1c5K .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GwBaCqONdVll1c5K .cluster text{fill:#333;}#mermaid-svg-GwBaCqONdVll1c5K .cluster span{color:#333;}#mermaid-svg-GwBaCqONdVll1c5K div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GwBaCqONdVll1c5K .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GwBaCqONdVll1c5K rect.text{fill:none;stroke-width:0;}#mermaid-svg-GwBaCqONdVll1c5K .icon-shape,#mermaid-svg-GwBaCqONdVll1c5K .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GwBaCqONdVll1c5K .icon-shape p,#mermaid-svg-GwBaCqONdVll1c5K .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GwBaCqONdVll1c5K .icon-shape .label rect,#mermaid-svg-GwBaCqONdVll1c5K .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GwBaCqONdVll1c5K .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GwBaCqONdVll1c5K .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GwBaCqONdVll1c5K :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
CentOS 7 服务器
Docker Compose
Teemii 前端teemii-web
Teemii 后端teemii-server
8034 端口http://IP:8034
漫画搜索 / 书架 / 导入 / 阅读
cpolar 隧道
随机公网地址
tee 固定二级子域名
公网访问
从这张图可以看到,数据流是单向递进的:CentOS 7 上的 Docker Compose 同时拉起 Teemii 前端和后端两个容器,前端通过 8034 端口对外提供 Web 页面;页面里的搜索、书架、导入和阅读功能由后端支撑;本地跑通以后,再由 cpolar 把 8034 映射到公网,先验证随机域名,最后换成 tee 固定二级子域名供长期使用。 每一层只负责自己的事,出问题时也更容易定位。
2. 先在 CentOS 7 上准备 Teemii
2.1 SSH 登录服务器
这次使用的是 CentOS 7。
先确保 SSH 服务可用,然后从 Windows PowerShell 或 Mac Terminal 登录:
ssh root@IP

这一步只是为了进入服务器,后面的 Teemii 部署都在这里完成。
2.2 创建 Teemii 目录
先创建安装目录并进入:
mkdir -p /docker/Teemii
cd /docker/Teemii

这里使用的目录是:
/docker/Teemii
后面的 docker-compose.yml 也放在这个目录下。
3. 用 Docker Compose 启动 Teemii
这次不是单容器,而是前端和后端两个服务一起跑。
Compose 配置如下:
version: "3.8"
services:
teemii-frontend:
image: dokkaner/teemii-frontend:latest
container_name: teemii-web
restart: unless-stopped
ports:
– "8034:80"
environment:
– VITE_APP_TITLE=Teemii
– VITE_APP_PORT=80
teemii-backend:
image: dokkaner/teemii-backend:latest
container_name: teemii-server
restart: unless-stopped
volumes:
– ./data:/data
environment:
– EXPRESS_PORT=3000
– SOCKET_IO_PORT=1555
这份配置里,前端部分是:
- 镜像:dokkaner/teemii-frontend:latest
- 容器名:teemii-web
- 重启策略:unless-stopped
- 端口:8034:80
- VITE_APP_TITLE=Teemii
- VITE_APP_PORT=80
后端部分是:
- 镜像:dokkaner/teemii-backend:latest
- 容器名:teemii-server
- 重启策略:unless-stopped
- 数据目录:./data:/data
- EXPRESS_PORT=3000
- SOCKET_IO_PORT=1555
这里不额外改动端口和容器关系,完全按现有配置保留。
启动命令:
docker-compose up -d

部署完成以后,在浏览器访问:
http://IP:8034

页面能正常打开,说明前端服务已经可以通过 8034 访问。
但对于这类应用,我更习惯把“页面打开”和“功能能用”分开判断。真正有价值的是后面的搜索、书架和阅读。
4. 第一次进入 Teemii,先把基本流程跑一遍
第一次使用时按照向导继续。



进入以后,初始页面里还没有漫画内容。
这时候先搜索一本想看的漫画。


搜索到结果后,可以加入书架。

如果已经有自己的本地漫画,也可以通过文件导入。

导入或加入书架以后,就可以进入阅读页面。

到这里,本文真正验证的是:
Teemii 不只是 Docker 容器跑起来了,而是已经完成了搜索、书架、本地导入和在线阅读这条基本使用链。
这也是我更愿意把它称作“漫画管理入口”,而不是简单说“CentOS 变漫画服务器”的原因——服务是否有价值,最后还是要落到日常使用流程。
5. 本地阅读跑通以后,再解决远程访问
在局域网里通过 http://IP:8034 阅读已经没有问题。
但如果这个服务部署在家里或内网服务器上,一旦离开当前网络,8034 就不能直接访问。
这时候 cpolar 只负责一个角色:
把已经运行正常的 Teemii Web 页面映射到公网。
它不参与漫画搜索,不负责书架,也不改变 Teemii 前后端结构。先把应用本身跑通,再处理网络入口,后续出问题时也更容易分层排查。
6. 安装 cpolar
执行安装命令:
sudo curl https://get.cpolar.sh | sh

安装完成后检查服务状态:
sudo systemctl status cpolar

cpolar 服务启动以后,通过主机 IP + 9200 进入 Web 管理页面。
原记录中的显示文本是:
http://ip:9200
Markdown 链接目标则是:
http://localhost:9200/
这两个地址写法并不一致,因此新版继续保留,不擅自统一。

登录以后,开始为 Teemii 创建隧道。
7. 先用随机域名验证 8034
进入【隧道管理 → 创建隧道】,配置如下:
- 隧道名称:tee
- 协议:http
- 本地地址:8034
- 域名类型:随机域名
- 地区:China Top

创建以后,在在线隧道列表中可以看到生成的公网地址。

换到其他电脑或移动设备访问。

页面能够正常打开。
这一层真正确认的是:
Teemii 的 8034 页面已经可以通过公网地址访问。
随机域名先跑通,说明应用和穿透链路都正常;固定域名放到下一步处理会更清楚。
8. 长期使用,再换成固定二级子域名
如果只是临时测试,随机域名已经够用。
但漫画书架这种长期使用的服务,地址如果经常变化,收藏和分享都会比较麻烦。
所以继续配置固定二级子域名。
进入 cpolar 预留功能。

地区选择:
china Top
这次示例使用的二级子域名是:
tee

然后回到 cpolar Web UI,在【隧道管理 → 隧道列表】里找到对应隧道并编辑。

修改为:
- 域名类型:二级子域名
- Sub Domain:填写已经保留的二级子域名
- 地区:China Top
点击更新。

更新以后,在线隧道列表中的随机地址会切换成固定二级子域名。

最后再用固定公网地址访问 Teemii。

页面可以正常打开。
到这里,远程访问这一层才算完整:
本地 8034 → 随机公网地址 → tee 固定二级子域名。
总结
这套方案真正完成的,不是把 CentOS “魔改成漫画天堂”,而是给一台原本只跑服务的服务器增加了一套比较完整的漫画 Web 使用链。
Teemii 负责的是漫画内容这一层:搜索、书架、本地导入和阅读;Docker Compose 负责把前端、后端和数据目录组织起来;cpolar 则只处理最后的公网访问入口。
整条实际跑通的链路是:
CentOS 7 → /docker/Teemii → Docker Compose → dokkaner/teemii-frontend:latest + dokkaner/teemii-backend:latest → 8034 → 搜索 → 书架 → 本地导入 → 在线阅读 → cpolar → tee 随机公网访问 → 固定二级子域名。
这次能够明确确认的内容包括:
- ssh root@IP
- /docker/Teemii
- dokkaner/teemii-frontend:latest
- dokkaner/teemii-backend:latest
- teemii-web
- teemii-server
- 8034:80
- ./data:/data
- EXPRESS_PORT=3000
- SOCKET_IO_PORT=1555
- docker-compose up -d
- http://IP:8034
- 搜索漫画
- 加入书架
- 本地文件导入
- 在线阅读
- cpolar 安装与状态检查
- 9200 管理入口
- 隧道名 tee
- 本地地址 8034
- China Top
- china Top
- Sub Domain
- 固定二级子域名 tee
这篇的人物感不靠硬编某个“我收藏了几百本漫画”的故事,而是放在使用判断里:
漫画可以越攒越多,但服务结构最好别越搭越乱。页面能开只是第一步,真正好用要把内容管理、阅读和远程入口都分别验证。
至于原文里的“自动下载、智能分类、完全私有、永不关停、7×24 小时稳定”等更大的结论,这次没有在具体步骤里逐项验证,所以新版没有继续把它们写成已经确定的实测结果。
转载自:https://blog.csdn.net/u014727709/article/details/165340645 欢迎 👍点赞✍评论⭐收藏,欢迎指正
网硕互联帮助中心





评论前必须登录!
注册