shixian64/jm-web · 上手攻略
- 仓库:shixian64/jm-web
- 链接:https://github.com/shixian64/jm-web
- 分类:工具 · 漫画阅读 · 自部署
- 作者:Jay
- 更新:2026-09-06
这是什么
JM Web 是一个自部署的网页版漫画阅读站,参照 jmcomic-next(安卓客户端)与 jm-mobile 的通信协议实现,兼容电脑与手机浏览器(响应式布局)。核心价值在于:你不需要依赖任何第三方服务器,自己搭一套就能在任意设备上用浏览器阅读漫画,支持离线下载、离线阅读、PWA 安装、中文翻译(繁体→简体)等完整功能。
⚠️ NSFW 警告:本项目内容可能包含成人向内容,仅限成年人在私人环境下使用;请自行遵守当地法律法规。
解决什么问题
- 数据主权:不依赖任何第三方服务,所有数据(账号、会话、下载)都在你自己的服务器上
- 完整阅读体验:连续滚动、单页、点击翻页四种模式;预解码加速;章节跳转;进度恢复
- 离线可用:IndexedDB 离线资料库,批量下载到本地,下载任务可暂停/续传/重试
- 图片还原:与安卓客户端相同的扰乱规则,在浏览器 Web Worker / OffscreenCanvas 中解码
- AI 辅助:可选接入 OpenAI-compatible API,对章节内容做 AI 分析(生成标题、剧情摘要)
- 中文翻译:可选部署翻译容器(繁体→简体),随主服务统一管理
- 隐私保护:支持 PIN、图案锁、WebAuthn 设备验证,失焦时自动伪装界面
快速安装
前置要求
- Node.js 20.0.0 或更高(零运行时依赖,无需
npm install) - 生产环境建议使用 LTS 版本;Docker 构建基线固定为
node:22.23.2-alpine3.24 - 推荐系统:Linux / macOS / Windows(PowerShell)
方式一:直接运行(最简)
git clone https://github.com/shixian64/jm-web.git
cd jm-web
node server.js # 默认监听 127.0.0.1:3210
带口令启动(生产环境必设):
# Linux / macOS
ACCESS_PASSWORD='你的长随机口令' node server.js
# Windows PowerShell
$env:ACCESS_PASSWORD = '你的长随机口令'; node server.js
用 pm2 守护(生产推荐):
npm install -g pm2
pm2 start server.js --name jm-web
pm2 save
pm2 startup
方式二:Docker Compose(推荐生产部署)
cd jm-web
cp .env.example .env # 复制环境变量模板
# 编辑 .env,设置高强度 ACCESS_PASSWORD
mkdir -p data
sudo chown -R 1000:1000 data # Linux 上需要授权
chmod 700 data
docker compose --env-file .env config --quiet # 校验配置
docker compose up -d
访问 http://localhost:3210,首次打开会引导你设置访问口令。
翻译服务(可选)
翻译容器随主服务统一管理,一行命令启动:
# 在 .env 中设置 ACCESS_PASSWORD 和 TRANSLATION_SERVICE_TOKEN
docker compose up -d --build
翻译服务覆盖繁体→简体中文,容器内部网络通信,不对外暴露端口。翻译结果保存在 Docker 命名卷 translation-cache。
使用预构建镜像(无需在本地构建)
仓库的 GitHub Actions 在测试通过后会自动构建 linux/amd64 和 linux/arm64 镜像并发布到 GHCR:
# 推送 v1.2.3 标签时自动生成 latest、1.2.3、1.2、1 标签
# main 分支生成 latest 和 edge 标签
docker pull ghcr.io/shixian64/jm-web:latest
核心用法
基础操作
| 操作 | 说明 |
|---|---|
| 访问地址 | http://服务器IP:3210(直连)或通过 Nginx/Caddy 反向代理 |
| 登录账号 | 在 Web 界面输入上游 JM 账号密码,支持自动登录 |
| 搜索 | 关键词/作者/标签/JM 编号;支持 -标签 排除语法 |
| 阅读器模式 | 连续滚动 / 正序单页 / RTL 单页 / 点击翻页,四种热切换 |
| 下载 | 漫画详情页 → 下载按钮,任务进入离线队列 |
环境变量配置
| 变量 | 默认值 | 说明 |
|---|---|---|
ACCESS_PASSWORD |
(无) | 访问口令,生产环境必须设置 |
HOST |
127.0.0.1 |
监听地址;公网访问设为 0.0.0.0 需配合 HTTPS |
PORT |
3210 |
监听端口 |
AI_API_KEY |
(无) | 启用 AI 分析功能(OpenAI-compatible) |
AI_MODEL |
grok-4.6 |
AI 模型,可更换为其他 OpenAI-compatible 模型 |
JMW_PUBLISH_HOST |
127.0.0.1 |
Docker 模式对外发布地址 |
JMW_PUBLISH_PORT |
同 PORT |
宿主机端口 |
AI 章节分析
配置 AI_API_KEY 后,系统按热门/访问记录自动排队分析章节:
AI_API_KEY=sk-xxx AI_MODEL=gpt-4o node server.js
- 分析结果保存在服务端,可通过
GET /api/chapter-ai?aid=<漫画ID>&photoId=<章节ID>查询 - 详细剧情和简洁总结暂不直接显示,仅标题显示在章节列表
图片线路与缓存
- 封面/缩略图会进入有界 LRU 缓存(默认 64 MiB,单张 2 MiB,24 小时)
- 章节正文流式转发,不在服务端缓存完整图片
- 上游超时或 5xx 时,前端以退避方式有限重试
典型适用场景
- 隐私阅读:不想用第三方阅读站,数据留存在自己的服务器上
- 内网/离线环境:在内网部署,团队成员共享离线漫画库
- 多设备同步:登录账号后,阅读历史、收藏跨设备一致
- 自建翻译流程:用翻译容器将繁体内容自动翻译为简体
- PWA 安装:在手机/桌面安装为本地 App,离线阅读
坑与注意
- 必须设
ACCESS_PASSWORD:直接运行默认不设口令,只有直连 TCP 回环请求才免口令。公网暴露0.0.0.0+ 无口令 = 任何人可访问运维功能。 - 不要迁移
data/目录:包含服务器密钥、登录会话和设置,迁移时需要单独处理。 - Docker 模式数据目录必须预先创建:
JMW_HOST_DATA_DIR目录必须存在且可由 uid1000:1000写入,否则 Docker 会用 root 身份静默创建。 - 翻译服务是独立 Python 容器:OCR 依赖首次构建耗时长,需要预留时间。
- 图片解扰在浏览器端进行:依赖 OffscreenCanvas,不支持的旧 Safari/WebView 会回退主线程 Canvas,可能更卡。
- 单实例资源上限:默认 1.0 CPU / 512 MB 内存 / 256 进程,多人共用时注意
.env调高限制。 - 不要让代理删除来源标识:无口令运维模式校验来源 IP,代理删除 X-Forwarded-For 等头后会把远端伪装成本机。
- ⚠️ Docker 镜像摘要核验:生产发布前应
docker buildx imagetools inspect核验节点镜像摘要,防止供应链攻击。
与同类对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| JM Web(自部署) | 完全自控、离线可用、AI 分析、PWA、多语言翻译 | 需要自己有服务器、NSFW 内容限制 |
| 官方网页版 | 即开即用 | 依赖第三方、有广告、数据不在自己手上 |
| jmcomic-next(安卓) | 成熟、功能全 | 需要安卓设备,无法浏览器访问 |
| 自建漫画站(如 Komga) | 通用漫画管理、支持多种漫画源 | 需要自己找漫画资源、不是 JM 专用客户端 |
JM Web 的核心差异是零依赖直连上游协议、无需抓取/导入,登录即用,与官方安卓客户端体验一致。
一句话推荐结论
如果你有 Node.js 或 Docker 运行环境、想完全掌控自己的阅读数据、同时需要离线可用和 PWA 体验,JM Web 是目前最完整的自部署方案。