clash-linux commited on
Commit
fed9e59
·
verified ·
1 Parent(s): a13ede0

Upload 5 files

Browse files
Files changed (4) hide show
  1. Dockerfile +5 -3
  2. FAQ.md +67 -0
  3. README.md +41 -23
  4. start.sh +42 -15
Dockerfile CHANGED
@@ -2,9 +2,11 @@
2
  FROM alpine:latest
3
 
4
  # 设置环境变量,用于指定目标 WebSocket 代理 URL
5
- # 这将被 Hugging Face Secret 覆盖 (在构建时)
6
- ARG TARGET_WSPROXY_URL="wss://your-first-space.hf.space/wsproxy"
7
- ENV TARGET_WSPROXY_URL=${TARGET_WSPROXY_URL}
 
 
8
 
9
  # 工作目录
10
  WORKDIR /app
 
2
  FROM alpine:latest
3
 
4
  # 设置环境变量,用于指定目标 WebSocket 代理 URL
5
+ # 可以设置两种环境变量:
6
+ # - URL: 原始 Space URL,如 https://your-first-space.hf.space
7
+ # - TARGET_WSPROXY_URL: 完整的 WebSocket URL (可选的,优先级较低)
8
+ ARG URL=""
9
+ ENV URL=${URL}
10
 
11
  # 工作目录
12
  WORKDIR /app
FAQ.md ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 常见问题解答 (FAQ)
2
+
3
+ ## 基本问题
4
+
5
+ ### Q: 这个工具是做什么的?
6
+ A: 这个工具可以将 WebSocket 代理转换为标准的 **HTTP 代理**,让你能够在像 Hugging Face Spaces 这样的云平台上使用代理服务。
7
+
8
+ ### Q: 为什么需要这个工具?
9
+ A: 许多云平台(如 Hugging Face Spaces)不允许直接暴露普通代理端口,但允许 WebSocket 连接。这个工具通过 WebSocket 连接到第一个代理 Space,然后提供标准的 HTTP 代理服务,利用了平台的 HTTPS 处理能力。
10
+
11
+ ### Q: 这个工具支持哪些代理协议?
12
+ A: 默认提供 **HTTP 代理** 服务。你可以修改 `start.sh` 文件中的配置来切换到 SOCKS5 代理,但 SOCKS5 在 Hugging Face 环境下直接使用可能比较困难。
13
+
14
+ ## 部署问题
15
+
16
+ ### Q: 如何在 Hugging Face Space 上部署这个工具?
17
+ A: 请参照 README.md 中的部署指南。简单来说,你需要:
18
+ 1. 创建一个新的 Space(选择 Docker 运行时)
19
+ 2. 上传所有文件
20
+ 3. 在 Space 设置中添加一个名为 `URL` 的 Secret,值为你的第一个 Space 的 URL
21
+
22
+ ### Q: 为什么我的部署失败了?
23
+ A: 常见原因包括:
24
+ - 没有在 Space 设置中添加正确的 `URL` Secret
25
+ - Secret 的值格式错误(应该是完整的 URL,如 `https://your-first-space.hf.space`)
26
+ - 第一个 Space 未正确配置或运行 WebSocket 端点 (`/wsproxy`)
27
+
28
+ ### Q: 我能在本地部署吗?
29
+ A: 可以,请参照 README.md 中的本地部署说明,使用 Docker 构建和运行容器。本地测试时,HTTP 代理地址通常是 `http://localhost:8080` (根据 docker run 命令中的端口映射)。
30
+
31
+ ## 使用问题
32
+
33
+ ### Q: 如何在客户端使用这个代理?
34
+ A: 配置你的应用程序使用以下 **HTTP 代理** 设置:
35
+ - **推荐 (HTTPS)**:
36
+ - 主机/服务器:你的第二个 Space 的地址(如 `your-converter-space.hf.space`)
37
+ - 端口:443
38
+ - 类型:HTTP / HTTPS
39
+ - (如果需要填写完整的 URL): `https://your-converter-space.hf.space`
40
+ - **备选 (HTTP)**:
41
+ - 主机/服务器:你的第二个 Space 的地址(如 `your-converter-space.hf.space`)
42
+ - 端口:80
43
+ - 类型:HTTP
44
+ - (如果需要填写完整的 URL): `http://your-converter-space.hf.space`
45
+
46
+ ### Q: 我连接不上代理,该怎么办?
47
+ A: 尝试以下方法:
48
+ 1. 检查两个 Space 是否都正常运行(查看 Space 日志)
49
+ 2. 确认第一个 Space 的 WebSocket 端点 (`/wsproxy`) 是否可访问(可以尝试用在线 WebSocket 测试工具连接)
50
+ 3. 检查你的客户端是否正确配置了 HTTP 代理设置(主机、端口、类型)
51
+
52
+ ### Q: 代理速度很慢,如何改善?
53
+ A: 性能受多个因素影响:
54
+ - Hugging Face Spaces 免费版有带宽和计算限制
55
+ - 两个 Space 之间的通信会增加延迟
56
+ - 考虑升级到付费版 Space 或使用其他平台
57
+
58
+ ## 技术问题
59
+
60
+ ### Q: 这个工具如何工作的?
61
+ A: 它使用 `gost` 工具在容器内部的 7860 端口监听 **HTTP 代理** 连接。当收到来自 Hugging Face (经过 HTTPS 解密后,或直接通过 HTTP) 的 HTTP 代理请求时,`gost` 将通过 WebSocket (`wss://.../wsproxy`) 连接到第一个 Space,并将流量转发。
62
+
63
+ ### Q: 我可以添加认证功能吗?
64
+ A: 可以,修改 `start.sh` 中的 `gost` 命令为 `gost -L "http://username:password@:7860" -F "$TARGET_WSPROXY_URL"`。
65
+
66
+ ### Q: 我可以切换回 SOCKS5 代理吗?
67
+ A: 可以,修改 `start.sh`,注释掉 HTTP 代理的启动命令,取消 SOCKS5 代理命令的注释。但请注意,在 Hugging Face 上直接使用 SOCKS5 可能需要客户端支持特殊的隧道方式。
README.md CHANGED
@@ -1,17 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
  # WebSocket 代理转换器
2
 
3
- 这个项目提供了一个简单的代理中转服务,将 WebSocket 代理转换为标准的 SOCKS5/HTTP 代理,使其更容易被普通应用程序使用。
4
 
5
  ## 背景
6
 
7
- 许多云平台(如 Hugging Face Spaces)不允许直接暴露代理端口,但允许通过 WebSocket 提供服务。这种情况下,直接使用标准的代理配置可能会遇到困难。这个项目解决了这个问题:
8
 
9
  1. **第一个 Space**(Clash WebSocket 代理): 通过 WebSocket 隧道(`/wsproxy`)提供代理服务
10
- 2. **这个 Space**(代理转换器): 将 WebSocket 代理转换为标准 SOCKS5 或 HTTP 代理
11
 
12
  ## 特点
13
 
14
- - 自动将 WebSocket 代理转换为标准 SOCKS5/HTTP 代理
15
  - 支持在 Hugging Face Spaces 等平台上部署
16
  - 轻量级、安全和高性能
17
  - 基于 [gost](https://github.com/ginuerzh/gost) 实现,成熟稳定
@@ -20,48 +32,54 @@
20
 
21
  ### 在 Hugging Face Space 上部署
22
 
23
- 1. 创建一个新的 Space(使用 Docker 运行时)
24
  2. 上传这个目录中的所有文件
25
  3. 在 Space 的设置中添加一个密钥(Secret):
26
- - 名称: `TARGET_WSPROXY_URL`
27
- - 值: 第一个 Space 的 WebSocket 代理地址,例如 `wss://your-first-space.hf.space/wsproxy`
28
  4. 部署并等待构建完成
29
 
30
  ### 本地部署(测试用途)
31
 
32
  ```bash
33
  # 设置目标 WebSocket 代理 URL
34
- export TARGET_WSPROXY_URL="wss://your-first-space.hf.space/wsproxy"
35
 
36
  # 运行 Docker 容器
37
  docker build -t proxy-converter .
38
- docker run -p 1080:7860 -e TARGET_WSPROXY_URL=$TARGET_WSPROXY_URL proxy-converter
 
39
  ```
40
 
41
  ## 使用方法
42
 
43
- 部署完成后,你可以使用以下代理设置:
 
 
 
 
 
 
44
 
45
- - **SOCKS5 代理**:
46
- - 主机: `your-space-name.hf.space`
47
- - 端口: 443(或 Hugging Face 分配的端口)
48
- - 类型: SOCKS5
49
- - (注:可能需要使用 HTTP CONNECT 隧道连接)
50
 
51
- - **HTTP 代理**(如果在 Dockerfile 中启用):
52
- - URL: `http://your-space-name.hf.space`
53
- - 端口: 443(或 Hugging Face 分配的端口)
54
 
55
  ## 故障排除
56
 
57
- - **无法连接**:确保 `TARGET_WSPROXY_URL` 指向正确的第一个 Space WebSocket 地址
58
- - **连接失败**:尝试在 Dockerfile 中切换协议类型(SOCKS5 / HTTP)
59
- - **性能问题**:Hugging Face 对免费 Spaces 有带宽和计算限制,请考虑升级或使用其他平台
60
 
61
  ## 自定义
62
 
63
- 修改 `Dockerfile` 中的配置可以自定义代理类型、添加认证等。详细请参考 [gost 文档](https://github.com/ginuerzh/gost/blob/master/README_en.md)。
64
 
65
  ## 安全注意事项
66
 
67
- 这种代理转换不提供加密,所以不要用于传输敏感数据,除非你信任 Hugging Face 的网络环境。如需加密传输,请考虑在此基础上���置 TLS
 
1
+ ---
2
+ title: WebSocket代理转换器
3
+ emoji: 🔄
4
+ colorFrom: blue
5
+ colorTo: indigo
6
+ sdk: docker
7
+ sdk_version: "latest"
8
+ app_file: app.py
9
+ app_port: 7860
10
+ pinned: false
11
+ ---
12
+
13
  # WebSocket 代理转换器
14
 
15
+ 这个项目提供了一个简单的代理中转服务,将 WebSocket 代理转换为标准的 **HTTP 代理**,使其更容易被普通应用程序使用。
16
 
17
  ## 背景
18
 
19
+ 许多云平台(如 Hugging Face Spaces)不允许直接暴露代理端口,但允许通过 WebSocket 提供服务。这个项目解决了这个问题:
20
 
21
  1. **第一个 Space**(Clash WebSocket 代理): 通过 WebSocket 隧道(`/wsproxy`)提供代理服务
22
+ 2. **这个 Space**(代理转换器): 将 WebSocket 代理转换为标准 HTTP 代理
23
 
24
  ## 特点
25
 
26
+ - 自动将 WebSocket 代理转换为标准 HTTP 代理
27
  - 支持在 Hugging Face Spaces 等平台上部署
28
  - 轻量级、安全和高性能
29
  - 基于 [gost](https://github.com/ginuerzh/gost) 实现,成熟稳定
 
32
 
33
  ### 在 Hugging Face Space 上部署
34
 
35
+ 1. 创建一个新的 Space(选择 Docker 运行时)
36
  2. 上传这个目录中的所有文件
37
  3. 在 Space 的设置中添加一个密钥(Secret):
38
+ - 名称: `URL`
39
+ - 值: 第一个 Space 的 URL,例如 `https://your-first-space.hf.space`(脚本会自动处理路径和协议转换)
40
  4. 部署并等待构建完成
41
 
42
  ### 本地部署(测试用途)
43
 
44
  ```bash
45
  # 设置目标 WebSocket 代理 URL
46
+ export URL="https://your-first-space.hf.space"
47
 
48
  # 运行 Docker 容器
49
  docker build -t proxy-converter .
50
+ docker run -p 8080:7860 -e URL=$URL proxy-converter
51
+ # 然后配置 HTTP 代理为 http://localhost:8080
52
  ```
53
 
54
  ## 使用方法
55
 
56
+ 部署完成后,你可以使用以下 **HTTP 代理** 设置:
57
+
58
+ - **推荐 (HTTPS)**:
59
+ - 主机/服务器: `your-converter-space.hf.space`
60
+ - 端口: `443`
61
+ - URL (如果需要): `https://your-converter-space.hf.space`
62
+ - 类型: HTTP / HTTPS (客户端到代理服务器的连接是加密的)
63
 
64
+ - **备选 (HTTP)**:
65
+ - 主机/服务器: `your-converter-space.hf.space`
66
+ - 端口: `80`
67
+ - URL (如果需要): `http://your-converter-space.hf.space`
68
+ - 类型: HTTP (客户端到代理服务器的连接是未加密的)
69
 
70
+ - **SOCKS5 代理**(如果修改了 `start.sh` 配置):
71
+ - 需要客户端支持通过 HTTP CONNECT 或其他隧道方式连接 SOCKS5。不推荐在 Hugging Face 上直接使用。
 
72
 
73
  ## 故障排除
74
 
75
+ - **无法连接**:确保 `URL` 密钥指向正确的第一个 Space 的地址,并且两个 Space 都在运行。
76
+ - **连接失败**:检查第一个 Space 的日志,确认 `/wsproxy` 是否正常工作。
77
+ - **性能问题**:Hugging Face 对免费 Spaces 有带宽和计算限制,请考虑升级或使用其他平台。
78
 
79
  ## 自定义
80
 
81
+ 修改 `start.sh` 中的配置可以自定义代理类型(改回 SOCKS5)、添加认证等。详细请参考 [gost 文档](https://github.com/ginuerzh/gost/blob/master/README_en.md)。
82
 
83
  ## 安全注意事项
84
 
85
+ 这种代理转换不提供端到端的加密(仅在客户端到转换器 Space 和转换器 Space 到原始 Space 的 WebSocket 连接上可能有 TLS 加密)。请勿通过此代理传输高度敏感数据,除非你信任相关网络环境。
start.sh CHANGED
@@ -6,13 +6,37 @@ echo " WebSocket Proxy Converter (by gost)"
6
  echo "======================================"
7
  echo "Starting service at port 7860..."
8
 
9
- # 检查目标 WebSocket 代理 URL 是否已设置
10
- if [ -z "$TARGET_WSPROXY_URL" ]; then
11
- echo "Error: TARGET_WSPROXY_URL environment variable is not set."
12
- echo "Please set it to your WebSocket proxy URL, like: wss://your-first-space.hf.space/wsproxy"
 
 
 
 
 
 
13
  exit 1
14
  fi
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  echo "Target WebSocket proxy: $TARGET_WSPROXY_URL"
17
 
18
  # 创建状态页面
@@ -69,6 +93,7 @@ cat > /app/html/index.html << EOF
69
  <ul>
70
  <li><strong>SOCKS5 代理地址:</strong> <code>$(hostname):7860</code></li>
71
  <li><strong>目标 WebSocket 代理:</strong> <code>${TARGET_WSPROXY_URL}</code></li>
 
72
  </ul>
73
  </div>
74
 
@@ -90,18 +115,19 @@ cat > /app/html/index.html << EOF
90
  </html>
91
  EOF
92
 
93
- # 同时启动 HTTP 服务和 gost
94
- # 在后台启动 gost SOCKS5 服务
95
- echo "Starting gost SOCKS5 proxy..."
96
- gost -L "socks5://:7860" -F "$TARGET_WSPROXY_URL" &
97
  GOST_PID=$!
98
 
99
- # 可选:启用 HTTP 代理转发
100
- # 如果要使用 HTTP 代理而不是 SOCKS5,取消下面两行的注释,并注释掉上面的 gost 命令
101
- # echo "Starting gost HTTP proxy..."
102
- # gost -L "http://:7860" -F "$TARGET_WSPROXY_URL" &
 
103
 
104
- # 启动一个简单的 HTTP 服务器提供状态页面,如果请求不是代理请求
105
  cd /app/html
106
  python3 -m http.server 7861 &
107
  HTTP_PID=$!
@@ -113,8 +139,9 @@ if ! ps -p $GOST_PID > /dev/null; then
113
  fi
114
 
115
  echo "Proxy converter is running..."
116
- echo "- SOCKS5 proxy at port 7860"
117
- echo "- Status page at port 7861"
 
118
 
119
  # 设置捕获信号
120
  trap "kill $GOST_PID $HTTP_PID; exit" SIGINT SIGTERM
 
6
  echo "======================================"
7
  echo "Starting service at port 7860..."
8
 
9
+ # 检查目标 URL 是否已设置(兼容两种环境变量名)
10
+ if [ -n "$URL" ]; then
11
+ # 用户设置了 URL 环境变量(Hugging Face Secret)
12
+ TARGET_BASE_URL="$URL"
13
+ elif [ -n "$TARGET_WSPROXY_URL" ]; then
14
+ # 用户直接设置了完整的 WebSocket URL
15
+ TARGET_BASE_URL="$TARGET_WSPROXY_URL"
16
+ else
17
+ echo "Error: Neither URL nor TARGET_WSPROXY_URL environment variable is set."
18
+ echo "Please set URL to your first Space URL, like: https://your-first-space.hf.space"
19
  exit 1
20
  fi
21
 
22
+ # 检查是否已经包含 /wsproxy 路径
23
+ if [[ "$TARGET_BASE_URL" != */wsproxy ]]; then
24
+ # 添加 /wsproxy 路径
25
+ TARGET_BASE_URL="${TARGET_BASE_URL}/wsproxy"
26
+ fi
27
+
28
+ # 检查是否需要转换 https:// 到 wss:// 或 http:// 到 ws://
29
+ if [[ "$TARGET_BASE_URL" == https://* ]]; then
30
+ # 替换 https:// 为 wss://
31
+ TARGET_WSPROXY_URL="${TARGET_BASE_URL/https:\/\//wss:\/\/}"
32
+ elif [[ "$TARGET_BASE_URL" == http://* ]]; then
33
+ # 替换 http:// 为 ws://
34
+ TARGET_WSPROXY_URL="${TARGET_BASE_URL/http:\/\//ws:\/\/}"
35
+ else
36
+ # 假设已经是正确的 WebSocket URL
37
+ TARGET_WSPROXY_URL="$TARGET_BASE_URL"
38
+ fi
39
+
40
  echo "Target WebSocket proxy: $TARGET_WSPROXY_URL"
41
 
42
  # 创建状态页面
 
93
  <ul>
94
  <li><strong>SOCKS5 代理地址:</strong> <code>$(hostname):7860</code></li>
95
  <li><strong>目标 WebSocket 代理:</strong> <code>${TARGET_WSPROXY_URL}</code></li>
96
+ <li><strong>源自URL:</strong> <code>${TARGET_BASE_URL}</code></li>
97
  </ul>
98
  </div>
99
 
 
115
  </html>
116
  EOF
117
 
118
+ # 启动 gost 服务
119
+ # 默认监听 HTTP 代理 (更兼容 Hugging Face)
120
+ echo "Starting gost HTTP proxy..."
121
+ gost -L "http://:7860" -F "$TARGET_WSPROXY_URL" &
122
  GOST_PID=$!
123
 
124
+ # 可选:启用 SOCKS5 代理转发 (需要客户端支持特定隧道)
125
+ # 如果要使用 SOCKS5 代理而不是 HTTP,取消下面两行的注释,并注释掉上面的 gost HTTP 命令
126
+ # echo "Starting gost SOCKS5 proxy..."
127
+ # gost -L "socks5://:7860" -F "$TARGET_WSPROXY_URL" &
128
+ # GOST_PID=$!
129
 
130
+ # 启动一个简单的 HTTP 服务器提供状态页面
131
  cd /app/html
132
  python3 -m http.server 7861 &
133
  HTTP_PID=$!
 
139
  fi
140
 
141
  echo "Proxy converter is running..."
142
+ echo "- HTTP proxy listening internally at port 7860"
143
+ echo "- Status page available at port 7861 (web UI)"
144
+ echo "- Connected to target WebSocket: $TARGET_WSPROXY_URL"
145
 
146
  # 设置捕获信号
147
  trap "kill $GOST_PID $HTTP_PID; exit" SIGINT SIGTERM