Spaces:
Paused
Paused
Upload 5 files
Browse files
Dockerfile
CHANGED
|
@@ -2,9 +2,11 @@
|
|
| 2 |
FROM alpine:latest
|
| 3 |
|
| 4 |
# 设置环境变量,用于指定目标 WebSocket 代理 URL
|
| 5 |
-
#
|
| 6 |
-
|
| 7 |
-
|
|
|
|
|
|
|
| 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 代理转换为标准的
|
| 4 |
|
| 5 |
## 背景
|
| 6 |
|
| 7 |
-
许多云平台(如 Hugging Face Spaces)不允许直接暴露代理端口,但允许通过 WebSocket
|
| 8 |
|
| 9 |
1. **第一个 Space**(Clash WebSocket 代理): 通过 WebSocket 隧道(`/wsproxy`)提供代理服务
|
| 10 |
-
2. **这个 Space**(代理转换器): 将 WebSocket 代理转换为标准
|
| 11 |
|
| 12 |
## 特点
|
| 13 |
|
| 14 |
-
- 自动将 WebSocket 代理转换为标准
|
| 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
|
| 24 |
2. 上传这个目录中的所有文件
|
| 25 |
3. 在 Space 的设置中添加一个密钥(Secret):
|
| 26 |
-
- 名称: `
|
| 27 |
-
- 值: 第一个 Space 的
|
| 28 |
4. 部署并等待构建完成
|
| 29 |
|
| 30 |
### 本地部署(测试用途)
|
| 31 |
|
| 32 |
```bash
|
| 33 |
# 设置目标 WebSocket 代理 URL
|
| 34 |
-
export
|
| 35 |
|
| 36 |
# 运行 Docker 容器
|
| 37 |
docker build -t proxy-converter .
|
| 38 |
-
docker run -p
|
|
|
|
| 39 |
```
|
| 40 |
|
| 41 |
## 使用方法
|
| 42 |
|
| 43 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
| 45 |
-
-
|
| 46 |
-
-
|
| 47 |
-
- 端口:
|
| 48 |
-
-
|
| 49 |
-
-
|
| 50 |
|
| 51 |
-
- **
|
| 52 |
-
-
|
| 53 |
-
- 端口: 443(或 Hugging Face 分配的端口)
|
| 54 |
|
| 55 |
## 故障排除
|
| 56 |
|
| 57 |
-
- **无法连接**:确保 `
|
| 58 |
-
-
|
| 59 |
-
- **性能问题**:Hugging Face 对免费 Spaces
|
| 60 |
|
| 61 |
## 自定义
|
| 62 |
|
| 63 |
-
修改 `
|
| 64 |
|
| 65 |
## 安全注意事项
|
| 66 |
|
| 67 |
-
|
|
|
|
| 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 |
-
# 检查目标
|
| 10 |
-
if [ -
|
| 11 |
-
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
#
|
| 94 |
-
#
|
| 95 |
-
echo "Starting gost
|
| 96 |
-
gost -L "
|
| 97 |
GOST_PID=$!
|
| 98 |
|
| 99 |
-
# 可选:启用
|
| 100 |
-
# 如果要使用
|
| 101 |
-
# echo "Starting gost
|
| 102 |
-
# gost -L "
|
|
|
|
| 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 "-
|
| 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
|