clash-linux commited on
Commit
7ce90de
·
verified ·
1 Parent(s): 50a72a0

Upload 4 files

Browse files
Files changed (2) hide show
  1. Dockerfile +10 -2
  2. start.sh +86 -4
Dockerfile CHANGED
@@ -11,8 +11,16 @@ ENV URL=${URL}
11
  # 工作目录
12
  WORKDIR /app
13
 
14
- # 安装必要的软件
15
- RUN apk --no-cache add curl bash python3 netcat-openbsd
 
 
 
 
 
 
 
 
16
 
17
  # 下载并安装 gost
18
  ARG GOST_VERSION="2.11.5"
 
11
  # 工作目录
12
  WORKDIR /app
13
 
14
+ # 安装必要的软件,包括网络诊断工具
15
+ RUN apk --no-cache add \
16
+ curl \
17
+ bash \
18
+ python3 \
19
+ netcat-openbsd \
20
+ bind-tools \
21
+ iputils \
22
+ tcpdump \
23
+ busybox-extras
24
 
25
  # 下载并安装 gost
26
  ARG GOST_VERSION="2.11.5"
start.sh CHANGED
@@ -1,18 +1,76 @@
1
  #!/bin/bash
2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  # 显示欢迎信息
4
  echo "======================================"
5
  echo " WebSocket Proxy Converter (by gost)"
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"
@@ -23,21 +81,28 @@ fi
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
  # 创建状态页面目录 (使用 /tmp)
43
  HTML_DIR="/tmp/html"
@@ -132,10 +197,27 @@ fi
132
  # LOG_LEVEL="warn" # 注释掉,因为 gost v2.11.5 不支持 -loglevel
133
 
134
  # --- 启动主代理服务 ---
135
- # echo "Starting gost HTTP proxy (port 7860) with log level: $LOG_LEVEL..."
136
- # 移除 -loglevel 参数
137
  echo "Starting gost HTTP proxy (port 7860)..."
138
- gost -L "http://:7860" -F "$TARGET_WSPROXY_URL" &
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  GOST_PID=$!
140
  sleep 1
141
 
 
1
  #!/bin/bash
2
 
3
+ # 添加诊断函数
4
+ check_target_server() {
5
+ local url="$1"
6
+ local host="${url#*://}"
7
+ host="${host%%/*}"
8
+
9
+ echo "========== 网络诊断 =========="
10
+ echo "- 检查目标主机: $host"
11
+
12
+ # 尝试解析主机名
13
+ if host "$host" > /dev/null 2>&1; then
14
+ ip=$(host "$host" | grep "has address" | head -1 | awk '{print $4}')
15
+ echo "- 主机解析成功: $host -> $ip"
16
+ else
17
+ echo "- 警告: 无法解析主机名 $host"
18
+ fi
19
+
20
+ # 尝试 ping 目标主机
21
+ if ping -c 1 -W 2 "$host" > /dev/null 2>&1; then
22
+ echo "- Ping 测试成功"
23
+ else
24
+ echo "- 警告: Ping 测试失败 (可能被防火墙阻止)"
25
+ fi
26
+
27
+ # 尝试 TCP 连接到 443 端口
28
+ if nc -z -w2 "$host" 443 > /dev/null 2>&1; then
29
+ echo "- TCP 连接成功 (443端口)"
30
+ else
31
+ echo "- 警告: 无法连接到 $host:443"
32
+ fi
33
+
34
+ # 尝试 TCP 连接到 80 端口
35
+ if nc -z -w2 "$host" 80 > /dev/null 2>&1; then
36
+ echo "- TCP 连接成功 (80端口)"
37
+ else
38
+ echo "- 警告: 无法连接到 $host:80"
39
+ fi
40
+
41
+ # 检查是否与当前主机相同
42
+ current_host=$(hostname -f 2>/dev/null || hostname)
43
+ if [[ "$host" == *"$current_host"* || "$current_host" == *"$host"* ]]; then
44
+ echo "- 严重错误: 目标主机似乎是当前主机自身,这将导致循环代理!"
45
+ echo "- 当前主机: $current_host"
46
+ echo "- 目标主机: $host"
47
+ echo "- 请检查环境变量 URL 是否设置正确"
48
+ fi
49
+
50
+ echo "=============================="
51
+ }
52
+
53
  # 显示欢迎信息
54
  echo "======================================"
55
  echo " WebSocket Proxy Converter (by gost)"
56
  echo "======================================"
57
  echo "Starting service at port 7860..."
58
 
59
+ # 显示环境变量调试信息
60
+ echo "环境变量:"
61
+ echo "- URL = $URL"
62
+ echo "- TARGET_WSPROXY_URL = $TARGET_WSPROXY_URL"
63
+ echo "- HOSTNAME = $(hostname)"
64
+
65
  # 检查目标 URL 是否已设置(兼容两种环境变量名)
66
  if [ -n "$URL" ]; then
67
  # 用户设置了 URL 环境变量(Hugging Face Secret)
68
  TARGET_BASE_URL="$URL"
69
+ echo "使用 URL 环境变量: $TARGET_BASE_URL"
70
  elif [ -n "$TARGET_WSPROXY_URL" ]; then
71
  # 用户直接设置了完整的 WebSocket URL
72
  TARGET_BASE_URL="$TARGET_WSPROXY_URL"
73
+ echo "使用 TARGET_WSPROXY_URL 环境变量: $TARGET_BASE_URL"
74
  else
75
  echo "Error: Neither URL nor TARGET_WSPROXY_URL environment variable is set."
76
  echo "Please set URL to your first Space URL, like: https://your-first-space.hf.space"
 
81
  if [[ "$TARGET_BASE_URL" != */wsproxy ]]; then
82
  # 添加 /wsproxy 路径
83
  TARGET_BASE_URL="${TARGET_BASE_URL}/wsproxy"
84
+ echo "添加 /wsproxy 路径: $TARGET_BASE_URL"
85
  fi
86
 
87
  # 检查是否需要转换 https:// 到 wss:// 或 http:// 到 ws://
88
  if [[ "$TARGET_BASE_URL" == https://* ]]; then
89
  # 替换 https:// 为 wss://
90
  TARGET_WSPROXY_URL="${TARGET_BASE_URL/https:\/\//wss:\/\/}"
91
+ echo "转换 HTTPS 到 WSS: $TARGET_WSPROXY_URL"
92
  elif [[ "$TARGET_BASE_URL" == http://* ]]; then
93
  # 替换 http:// 为 ws://
94
  TARGET_WSPROXY_URL="${TARGET_BASE_URL/http:\/\//ws:\/\/}"
95
+ echo "转换 HTTP 到 WS: $TARGET_WSPROXY_URL"
96
  else
97
  # 假设已经是正确的 WebSocket URL
98
  TARGET_WSPROXY_URL="$TARGET_BASE_URL"
99
+ echo "使用原始 URL (未转换): $TARGET_WSPROXY_URL"
100
  fi
101
 
102
+ echo "最终目标 WebSocket 代理: $TARGET_WSPROXY_URL"
103
+
104
+ # 执行网络诊断
105
+ check_target_server "$TARGET_BASE_URL"
106
 
107
  # 创建状态页面目录 (使用 /tmp)
108
  HTML_DIR="/tmp/html"
 
197
  # LOG_LEVEL="warn" # 注释掉,因为 gost v2.11.5 不支持 -loglevel
198
 
199
  # --- 启动主代理服务 ---
 
 
200
  echo "Starting gost HTTP proxy (port 7860)..."
201
+ # 确保 -F 参数包含完整的转发规则,不只是 URL
202
+ # 例如:gost -L "http://:7860" -F="ws://server"
203
+ echo "Debug: Final target URL = $TARGET_WSPROXY_URL"
204
+
205
+ # 构建正确的转发字符串
206
+ if [[ "$TARGET_WSPROXY_URL" == wss://* ]]; then
207
+ # 已经有 wss:// 前缀
208
+ FORWARD_RULE="$TARGET_WSPROXY_URL"
209
+ elif [[ "$TARGET_WSPROXY_URL" == ws://* ]]; then
210
+ # 已经有 ws:// 前缀
211
+ FORWARD_RULE="$TARGET_WSPROXY_URL"
212
+ else
213
+ # 添加默认的 wss:// 前缀
214
+ FORWARD_RULE="wss://$TARGET_WSPROXY_URL"
215
+ fi
216
+
217
+ echo "Debug: Final forward rule = $FORWARD_RULE"
218
+
219
+ # 运行 gost 服务
220
+ gost -L "http://:7860" -F="$FORWARD_RULE" -D &
221
  GOST_PID=$!
222
  sleep 1
223