Skip to content
This repository was archived by the owner on Mar 14, 2025. It is now read-only.

Commit 0616a3f

Browse files
author
ZeroWolf233
committed
feat: 同步93的支持使用自定义证书
1 parent b527e6d commit 0616a3f

5 files changed

Lines changed: 229 additions & 200 deletions

File tree

README.md

Lines changed: 143 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,141 +1,143 @@
1-
# Node-OpenMCIM
2-
3-
这是对 [bangbang93](https://github.com/bangbang93)[OpenBMCLAPI](https://github.com/bangbang93/openbmclapi) 项目的修改版
4-
5-
为了方便上线 OpenMCIM 而修改了部分内容
6-
7-
# 关于OpenMCIM
8-
借鉴 OpenBMCLAPI 使用网盘缓存的先例,旨在为中国大陆用户提供稳定的 Mod 信息镜像服务并解决国内下载 Mod 速度缓慢的问题。
9-
10-
OpenMCIM是对外开放的,所有需要 Minecraft Mod 资源的启动器均可调用。
11-
12-
[OpenMCIM 文件分发相关](https://github.com/mcmod-info-mirror/mcim/issues/91)
13-
14-
## 变量
15-
16-
| 环境变量 |必填 | 默认值 | 说明 |
17-
|---------------------|-----|--------------|--------------------------------------------------------------------------------------------------------|
18-
| CLUSTER_ID || - | 节点 ID |
19-
| CLUSTER_SECRET || - | 节点密钥 |
20-
| CLUSTER_IP || 自动获取公网出口IP | 用户访问时使用的 IP 或域名 |
21-
| CLUSTER_PORT || 4000 | 监听端口(本地开放的端口) |
22-
| CLUSTER_PUBLIC_PORT || CLUSTER_PORT | 对外端口(用户请求时访问的端口) |
23-
| CLUSTER_BYOC || false | 是否使用自定义域名, (BYOC=Bring you own certificate),当使用国内服务器需要备案时, 需要启用这个参数来使用你自己的域名, 并且你需要自己提供ssl termination |
24-
| ENABLE_NGINX || false | 使用 nginx 提供文件服务 |
25-
| DISABLE_ACCESS_LOG || false | 禁用访问日志输出 |
26-
| ENABLE_UPNP || false | 启用 UPNP 端口映射 |
27-
| CLUSTER_BMCLAPI || https://files.mcimirror.top | 更改上线地址(测试变量) |
28-
| CLUSTER_STORAGE || files | 使用其他存储源的类型(默认为本地) |
29-
| CLUSTER_STORAGE_OPTIONS ||| 挂载其他存储源的配置项 |
30-
| SKIP_FILE_SHA_CHECK || false | 防止主控SHA爆炸,强制忽略SHA问题上线 |
31-
| SKIP_SYNC || false | 强制跳过所有同步(不推荐) |
32-
| SKIP_GC || false | 跳过GC垃圾自动回收(由 **千时雨** 提供) |
33-
| THREADS || 由主控分配 | 同步线程(改太高会被banban) |
34-
| UA || openmcim-cluster/${version} | 获取token和同步的UA |
35-
36-
### 如果你在源码中发现了其他环境变量, 那么它们是为了方便开发而存在的, 可能会随时修改, 不要在生产环境中使用!
37-
38-
## Alist使用方法
39-
在.env中加上
40-
```env
41-
CLUSTER_STORAGE=alist
42-
CLUSTER_STORAGE_OPTIONS={"url":"http://127.0.0.1:5244/dav","basePath":"mcim","username":"admin","password":"admin" }
43-
# ↑AList地址(别忘了加/dav) ↑文件路径 ↑账号(有webdav权限) ↑密码
44-
```
45-
按照需要修改
46-
47-
### 温馨提示
48-
49-
如从 Go 端迁移至 Node 端,你Alist里面的目录应该是这样的:
50-
51-
```file_tree
52-
mcim/
53-
├── download/
54-
│ ├── 00/
55-
│ ├── 01/
56-
| ├── 03/
57-
│ └── xx(下面一堆文件夹,不一一列举)/
58-
├── measure/
59-
│ ├── 1
60-
│ ├── 2
61-
│ └── 3
62-
```
63-
此时你basepath的地址就应该填写"mcim/download"
64-
65-
(即确保 Node-OpenMCIM 程序读取的根目录为有效文件所存储目录)
66-
67-
68-
### 安装包
69-
70-
[Github Release](https://github.com/ZeroWolf233/node-openmcim/releases) 中下载你系统对应的最新版本
71-
72-
解压,然后根据对应信息,参照上方表格填写.env文件
73-
74-
随后启动脚本,即可开始运行
75-
76-
### 使用Docker
77-
78-
```bash
79-
docker run -d \
80-
-e CLUSTER_ID=${CLUSTER_ID} \
81-
-e CLUSTER_SECRET=${CLUSTER_SECRET} \
82-
-e CLUSTER_PUBLIC_PORT=${CLUSTER_PORT} \
83-
-e TZ=Asia/Shanghai \
84-
-v /data/mcim:/opt/mcim \
85-
-p ${CLUSTER_PORT}:${CLUSTER_PORT} \
86-
--restart unless-stop \
87-
--name mcim \
88-
zerowolf233/mcim
89-
```
90-
91-
### 从源码安装
92-
93-
#### 环境
94-
95-
- Node.js 20 以上
96-
- Windows/MacOS/Linux
97-
- x86/arm 均可 (需支持Nodejs)
98-
99-
#### 设置环境
100-
101-
1.<https://nodejs.org/zh-cn/> 下载LTS版本的nodejs并安装
102-
2. Clone 并安装依赖
103-
104-
```bash
105-
git clone https://github.com/ZeroWolf233/node-openmcim
106-
cd node-openmcim
107-
## 安装依赖
108-
npm ci
109-
## 编译
110-
npm run build
111-
## 运行
112-
node dist/index.js
113-
```
114-
115-
3. 如果你看到了 `CLUSTER_ID is not set` 的报错, 说明一切正常, 该设置参数了
116-
117-
### 设置参数
118-
119-
在项目根目录创建一个文件, 名为 `.env`
120-
121-
写入如下内容
122-
123-
```env
124-
CLUSTER_ID=你的节点ID
125-
CLUSTER_SECRET=你的节点密钥
126-
CLUSTER_PORT=你的开放端口
127-
# 更多变量请看上方变量的详细解释
128-
```
129-
130-
如果配置无误的话, 运行程序, 就会开始拉取文件, 拉取完成后就会开始等待服务器分发请求了!
131-
132-
## 致谢
133-
134-
- [**bangbang93**](https://github.com/bangbang93) 基本全是照着bangbang93的源码改的,总之谢谢93!
135-
- [**OpenBMCLAPI**](https://github.com/bangbang93/openbmclapi) 项目原型
136-
- [**OpenMCIM**](https://github.com/mcmod-info-mirror/mcim) 大陆Curseforge&Modrinth镜像源
137-
- [**SaltWood**](https://github.com/SALTWOOD) OpenMCIM所用主控
138-
- [**Open93@Home-V3**](https://github.com/SaltWood-Studio/Open93AtHome-V3)
139-
- [**ZeroWolf233**](https://github.com/ZeroWolf233) 作者,但是fw一个
140-
- [**Zhang**](https://github.com/Zhang12334) 项目发起 & 程序改写
141-
- **千时雨** 提供很多对网盘优化的修改思路和代码
1+
# Node-OpenMCIM
2+
3+
这是对 [bangbang93](https://github.com/bangbang93)[OpenBMCLAPI](https://github.com/bangbang93/openbmclapi) 项目的修改版
4+
5+
为了方便上线 OpenMCIM 而修改了部分内容
6+
7+
# 关于OpenMCIM
8+
借鉴 OpenBMCLAPI 使用网盘缓存的先例,旨在为中国大陆用户提供稳定的 Mod 信息镜像服务并解决国内下载 Mod 速度缓慢的问题。
9+
10+
OpenMCIM是对外开放的,所有需要 Minecraft Mod 资源的启动器均可调用。
11+
12+
[OpenMCIM 文件分发相关](https://github.com/mcmod-info-mirror/mcim/issues/91)
13+
14+
## 变量
15+
16+
| 环境变量 |必填 | 默认值 | 说明 |
17+
|---------------------|-----|--------------|--------------------------------------------------------------------------------------------------------|
18+
| CLUSTER_ID || - | 节点 ID |
19+
| CLUSTER_SECRET || - | 节点密钥 |
20+
| CLUSTER_IP || 自动获取公网出口IP | 用户访问时使用的 IP 或域名 |
21+
| CLUSTER_PORT || 4000 | 监听端口(本地开放的端口) |
22+
| CLUSTER_PUBLIC_PORT || CLUSTER_PORT | 对外端口(用户请求时访问的端口) |
23+
| CLUSTER_BYOC || false | 是否使用自定义域名, (BYOC=Bring you own certificate),当使用国内服务器需要备案时, 需要启用这个参数来使用你自己的域名, 并且你需要自己提供ssl termination |
24+
| ENABLE_NGINX || false | 使用 nginx 提供文件服务 |
25+
| DISABLE_ACCESS_LOG || false | 禁用访问日志输出 |
26+
| ENABLE_UPNP || false | 启用 UPNP 端口映射 |
27+
| CLUSTER_BMCLAPI || https://files.mcimirror.top | 更改上线地址(测试变量) |
28+
| CLUSTER_STORAGE || files | 使用其他存储源的类型(默认为本地) |
29+
| CLUSTER_STORAGE_OPTIONS ||| 挂载其他存储源的配置项 |
30+
| SKIP_FILE_SHA_CHECK || false | 防止主控SHA爆炸,强制忽略SHA问题上线 |
31+
| SKIP_SYNC || false | 强制跳过所有同步(不推荐) |
32+
| SKIP_GC || false | 跳过GC垃圾自动回收(由 **千时雨** 提供) |
33+
| THREADS || 由主控分配 | 同步线程(改太高会被banban) |
34+
| UA || openmcim-cluster/${version} | 获取token和同步的UA |
35+
| SSL_KEY ||| (仅开启BYOC时) SSL 证书私钥。可以直接粘贴证书内容,也可以填写文件名 |
36+
| SSL_CERT ||| (仅开启BYOC时) SSL 证书公钥。可以直接粘贴证书内容,也可以填写文件名 |
37+
38+
### 如果你在源码中发现了其他环境变量, 那么它们是为了方便开发而存在的, 可能会随时修改, 不要在生产环境中使用!
39+
40+
## Alist使用方法
41+
在.env中加上
42+
```env
43+
CLUSTER_STORAGE=alist
44+
CLUSTER_STORAGE_OPTIONS={"url":"http://127.0.0.1:5244/dav","basePath":"mcim","username":"admin","password":"admin" }
45+
# ↑AList地址(别忘了加/dav) ↑文件路径 ↑账号(有webdav权限) ↑密码
46+
```
47+
按照需要修改
48+
49+
### 温馨提示
50+
51+
如从 Go 端迁移至 Node 端,你Alist里面的目录应该是这样的:
52+
53+
```file_tree
54+
mcim/
55+
├── download/
56+
│ ├── 00/
57+
│ ├── 01/
58+
| ├── 03/
59+
│ └── xx(下面一堆文件夹,不一一列举)/
60+
├── measure/
61+
│ ├── 1
62+
│ ├── 2
63+
│ └── 3
64+
```
65+
此时你basepath的地址就应该填写"mcim/download"
66+
67+
(即确保 Node-OpenMCIM 程序读取的根目录为有效文件所存储目录)
68+
69+
70+
### 安装包
71+
72+
[Github Release](https://github.com/ZeroWolf233/node-openmcim/releases) 中下载你系统对应的最新版本
73+
74+
解压,然后根据对应信息,参照上方表格填写.env文件
75+
76+
随后启动脚本,即可开始运行
77+
78+
### 使用Docker
79+
80+
```bash
81+
docker run -d \
82+
-e CLUSTER_ID=${CLUSTER_ID} \
83+
-e CLUSTER_SECRET=${CLUSTER_SECRET} \
84+
-e CLUSTER_PUBLIC_PORT=${CLUSTER_PORT} \
85+
-e TZ=Asia/Shanghai \
86+
-v /data/mcim:/opt/mcim \
87+
-p ${CLUSTER_PORT}:${CLUSTER_PORT} \
88+
--restart unless-stop \
89+
--name mcim \
90+
zerowolf233/mcim
91+
```
92+
93+
### 从源码安装
94+
95+
#### 环境
96+
97+
- Node.js 20 以上
98+
- Windows/MacOS/Linux
99+
- x86/arm 均可 (需支持Nodejs)
100+
101+
#### 设置环境
102+
103+
1.<https://nodejs.org/zh-cn/> 下载LTS版本的nodejs并安装
104+
2. Clone 并安装依赖
105+
106+
```bash
107+
git clone https://github.com/ZeroWolf233/node-openmcim
108+
cd node-openmcim
109+
## 安装依赖
110+
npm ci
111+
## 编译
112+
npm run build
113+
## 运行
114+
node dist/index.js
115+
```
116+
117+
3. 如果你看到了 `CLUSTER_ID is not set` 的报错, 说明一切正常, 该设置参数了
118+
119+
### 设置参数
120+
121+
在项目根目录创建一个文件, 名为 `.env`
122+
123+
写入如下内容
124+
125+
```env
126+
CLUSTER_ID=你的节点ID
127+
CLUSTER_SECRET=你的节点密钥
128+
CLUSTER_PORT=你的开放端口
129+
# 更多变量请看上方变量的详细解释
130+
```
131+
132+
如果配置无误的话, 运行程序, 就会开始拉取文件, 拉取完成后就会开始等待服务器分发请求了!
133+
134+
## 致谢
135+
136+
- [**bangbang93**](https://github.com/bangbang93) 基本全是照着bangbang93的源码改的,总之谢谢93!
137+
- [**OpenBMCLAPI**](https://github.com/bangbang93/openbmclapi) 项目原型
138+
- [**OpenMCIM**](https://github.com/mcmod-info-mirror/mcim) 大陆Curseforge&Modrinth镜像源
139+
- [**SaltWood**](https://github.com/SALTWOOD) OpenMCIM所用主控
140+
- [**Open93@Home-V3**](https://github.com/SaltWood-Studio/Open93AtHome-V3)
141+
- [**ZeroWolf233**](https://github.com/ZeroWolf233) 作者,但是fw一个
142+
- [**Zhang**](https://github.com/Zhang12334) 项目发起 & 程序改写
143+
- **千时雨** 提供很多对网盘优化的修改思路和代码

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "openmcim",
3-
"version": "1.1.8",
3+
"version": "1.2.0",
44
"description": "mcim@home",
55
"bin": "dist/openmcim.js",
66
"private": true,

src/bootstrap.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,13 @@ export async function bootstrap(version: string): Promise<void> {
4848
cluster.connect()
4949
const proto = config.byoc ? 'http' : 'https'
5050
if (proto === 'https') {
51-
logger.info('请求证书')
52-
await cluster.requestCert()
51+
if (config.sslCert && config.sslKey) {
52+
logger.debug('使用自定义证书')
53+
await cluster.useSelfCert()
54+
} else {
55+
logger.info('请求证书')
56+
await cluster.requestCert()
57+
}
5358
}
5459
if (config.enableNginx) {
5560
if (typeof cluster.port === 'number') {

src/cluster.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ import type {TokenManager} from './token.js'
3939
import type {IFileList} from './types.js'
4040
import {setupUpnp} from './upnp.js'
4141
import {checkSign, hashToFilename} from './util.js'
42-
import {isPrivate} from 'ip'
42+
import pkg from 'ip';
43+
const { isPrivate } = pkg;
4344

4445
interface ICounters {
4546
hits: number
@@ -532,6 +533,25 @@ export class Cluster {
532533
await fse.outputFile(join(this.tmpDir, 'key.pem'), cert.key)
533534
}
534535

536+
public async useSelfCert(): Promise<void> {
537+
if (!config.sslCert) {
538+
throw new Error('你的ssl证书呢?')
539+
}
540+
if (!config.sslKey) {
541+
throw new Error('你的ssl私钥呢?')
542+
}
543+
if (await fse.pathExists(config.sslCert)) {
544+
await fse.copyFile(config.sslCert, join(this.tmpDir, 'cert.pem'))
545+
} else {
546+
await fse.outputFile(join(this.tmpDir, 'cert.pem'), config.sslCert)
547+
}
548+
if (await fse.pathExists(config.sslKey)) {
549+
await fse.copyFile(config.sslKey, join(this.tmpDir, 'key.pem'))
550+
} else {
551+
await fse.outputFile(join(this.tmpDir, 'key.pem'), config.sslKey)
552+
}
553+
}
554+
535555
public exit(code: number = 0): void {
536556
if (this.nginxProcess) {
537557
this.nginxProcess.kill()

0 commit comments

Comments
 (0)