云计算百科
云计算领域专业知识百科平台

想把漫画集中到自己的服务器?Teemii 从 Docker 部署到远程阅读实战

文章目录

    • 每日一句正能量
    • 前言
    • 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 包装成“漫画神器”,重点是把漫画服务真正跑通,并把本地阅读和远程访问分成两个清楚的阶段。

image-20251016113025203

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

image-20251015161143921

这一步只是为了进入服务器,后面的 Teemii 部署都在这里完成。

2.2 创建 Teemii 目录

先创建安装目录并进入:

mkdir -p /docker/Teemii
cd /docker/Teemii

image-20251016142340397

这里使用的目录是:

/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

image-20251016142412035

部署完成以后,在浏览器访问:

http://IP:8034

05798b0af34498492740bab6bf6b6671

页面能正常打开,说明前端服务已经可以通过 8034 访问。

但对于这类应用,我更习惯把“页面打开”和“功能能用”分开判断。真正有价值的是后面的搜索、书架和阅读。

4. 第一次进入 Teemii,先把基本流程跑一遍

第一次使用时按照向导继续。

5040af5dc3ca6d74f69292df5caeff44

aeb09b91a023d0cab61efc2c16632952

020881040f81e05c25abcc9f1af848ea

进入以后,初始页面里还没有漫画内容。

这时候先搜索一本想看的漫画。

89dcda8eebfa95008671cb989e0b5bcb

354e21298088b350c4bb91c8f65d1753

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

03fd12b9e4643d601564b3f672cecf6c

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

bb96a87d31c603cf0c9270b46637e047

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

679777f3f8356b3259d4e779c4c585bc

到这里,本文真正验证的是:

Teemii 不只是 Docker 容器跑起来了,而是已经完成了搜索、书架、本地导入和在线阅读这条基本使用链。

这也是我更愿意把它称作“漫画管理入口”,而不是简单说“CentOS 变漫画服务器”的原因——服务是否有价值,最后还是要落到日常使用流程。

5. 本地阅读跑通以后,再解决远程访问

在局域网里通过 http://IP:8034 阅读已经没有问题。

但如果这个服务部署在家里或内网服务器上,一旦离开当前网络,8034 就不能直接访问。

这时候 cpolar 只负责一个角色:

把已经运行正常的 Teemii Web 页面映射到公网。

它不参与漫画搜索,不负责书架,也不改变 Teemii 前后端结构。先把应用本身跑通,再处理网络入口,后续出问题时也更容易分层排查。

6. 安装 cpolar

执行安装命令:

sudo curl https://get.cpolar.sh | sh

e464b045413a024674a93ea472511b0f

安装完成后检查服务状态:

sudo systemctl status cpolar

aa03713b56d9eef12a4da6b99d2e46ac

cpolar 服务启动以后,通过主机 IP + 9200 进入 Web 管理页面。

原记录中的显示文本是:

http://ip:9200

Markdown 链接目标则是:

http://localhost:9200/

这两个地址写法并不一致,因此新版继续保留,不擅自统一。

3af79ad708cc47c5bbea0b63c2c7230d

登录以后,开始为 Teemii 创建隧道。

7. 先用随机域名验证 8034

进入【隧道管理 → 创建隧道】,配置如下:

  • 隧道名称:tee
  • 协议:http
  • 本地地址:8034
  • 域名类型:随机域名
  • 地区:China Top

image-20251016155818808

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

image-20251016160113922

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

image-20251016160147711

页面能够正常打开。

这一层真正确认的是:

Teemii 的 8034 页面已经可以通过公网地址访问。

随机域名先跑通,说明应用和穿透链路都正常;固定域名放到下一步处理会更清楚。

8. 长期使用,再换成固定二级子域名

如果只是临时测试,随机域名已经够用。

但漫画书架这种长期使用的服务,地址如果经常变化,收藏和分享都会比较麻烦。

所以继续配置固定二级子域名。

进入 cpolar 预留功能。

image-20251016160220951

地区选择:

china Top

这次示例使用的二级子域名是:

tee

image-20251016160301070

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

image-20251016160328732

修改为:

  • 域名类型:二级子域名
  • Sub Domain:填写已经保留的二级子域名
  • 地区:China Top

点击更新。

image-20251016160350694

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

image-20251016160407614

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

image-20251016160529800

页面可以正常打开。

到这里,远程访问这一层才算完整:

本地 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 欢迎 👍点赞✍评论⭐收藏,欢迎指正

赞(0)
未经允许不得转载:网硕互联帮助中心 » 想把漫画集中到自己的服务器?Teemii 从 Docker 部署到远程阅读实战
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!