clash-linux commited on
Commit
aa5326c
·
verified ·
1 Parent(s): f1aca37

Upload 17 files

Browse files
Files changed (4) hide show
  1. Dockerfile +1 -0
  2. app/sub_manager.py +42 -5
  3. entrypoint.sh +67 -68
  4. requirements.txt +3 -2
Dockerfile CHANGED
@@ -84,6 +84,7 @@ RUN pip install --upgrade pip
84
  # 安装剩余的Python依赖 (PyYAML 已通过 apk 安装)
85
  RUN echo "Installing Python dependencies..." && \
86
  pip install --no-cache-dir -r requirements.txt
 
87
 
88
  # 可选:删除构建依赖以减小镜像体积
89
  # RUN apk del python3-dev musl-dev libffi-dev yaml-dev
 
84
  # 安装剩余的Python依赖 (PyYAML 已通过 apk 安装)
85
  RUN echo "Installing Python dependencies..." && \
86
  pip install --no-cache-dir -r requirements.txt
87
+ RUN pip install --no-cache-dir pyyaml
88
 
89
  # 可选:删除构建依赖以减小镜像体积
90
  # RUN apk del python3-dev musl-dev libffi-dev yaml-dev
app/sub_manager.py CHANGED
@@ -304,8 +304,10 @@ secret: ""
304
  has_patch = True
305
 
306
  # 尝试解析YAML并修复代理组引用问题
 
307
  try:
308
  import yaml
 
309
 
310
  # 解析配置
311
  config_yaml = yaml.safe_load(config_content)
@@ -394,19 +396,54 @@ secret: ""
394
 
395
  # 更新配置内容
396
  config_content = yaml.dump(config_yaml, sort_keys=False, allow_unicode=True)
 
 
397
  except Exception as yaml_err:
398
  logger.error(f"解析YAML时出错: {str(yaml_err)}")
399
- # 无法解析YAML,添加基本的GLOBAL策略组
400
- if "GLOBAL" not in config_content:
401
- config_content += """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
402
  proxy-groups:
403
  - name: GLOBAL
404
  type: select
405
  proxies:
406
  - DIRECT
407
  """
408
- has_patch = True
409
- logger.info("添加了基本的GLOBAL策略组")
 
410
 
411
  # 如果我们修改了配置,保存回文件
412
  if has_patch:
 
304
  has_patch = True
305
 
306
  # 尝试解析YAML并修复代理组引用问题
307
+ yaml_available = False
308
  try:
309
  import yaml
310
+ yaml_available = True
311
 
312
  # 解析配置
313
  config_yaml = yaml.safe_load(config_content)
 
396
 
397
  # 更新配置内容
398
  config_content = yaml.dump(config_yaml, sort_keys=False, allow_unicode=True)
399
+ except ImportError as yaml_err:
400
+ logger.error(f"解析YAML时出错: {str(yaml_err)}")
401
  except Exception as yaml_err:
402
  logger.error(f"解析YAML时出错: {str(yaml_err)}")
403
+
404
+ # 如果yaml模块不可用,使用简单的文本处理方式
405
+ if not yaml_available:
406
+ # 检查配置中是否已经有GLOBAL组
407
+ global_exists = "name: GLOBAL" in config_content or "GLOBAL" in config_content
408
+ proxy_groups_exists = "proxy-groups:" in config_content
409
+
410
+ # 只有在没有GLOBAL组且需要添加时才添加
411
+ if not global_exists:
412
+ if proxy_groups_exists:
413
+ # 如果已经有proxy-groups部分,不要重复添加proxy-groups键
414
+ # 尝试在proxy-groups部分添加GLOBAL组
415
+ try:
416
+ # 寻找proxy-groups部分
417
+ groups_index = config_content.find("proxy-groups:")
418
+ if groups_index != -1:
419
+ # 找到插入点 - 在proxy-groups行之后
420
+ lines = config_content.split("\n")
421
+ for i, line in enumerate(lines):
422
+ if line.strip().startswith("proxy-groups:"):
423
+ # 在proxy-groups后面直接添加GLOBAL组
424
+ global_group = """ - name: GLOBAL
425
+ type: select
426
+ proxies:
427
+ - DIRECT"""
428
+ lines.insert(i + 1, global_group)
429
+ config_content = "\n".join(lines)
430
+ has_patch = True
431
+ logger.info("在现有proxy-groups中添加了GLOBAL策略组")
432
+ break
433
+ except Exception as e:
434
+ logger.error(f"尝试添加GLOBAL组时出错: {str(e)}")
435
+ else:
436
+ # 如果没有proxy-groups部分,添加完整的部分
437
+ global_section = """
438
  proxy-groups:
439
  - name: GLOBAL
440
  type: select
441
  proxies:
442
  - DIRECT
443
  """
444
+ config_content += global_section
445
+ has_patch = True
446
+ logger.info("添加了基本的GLOBAL策略组")
447
 
448
  # 如果我们修改了配置,保存回文件
449
  if has_patch:
entrypoint.sh CHANGED
@@ -1,101 +1,100 @@
1
- #!/bin/sh
2
- # 不再使用set -e,避免因chmod失败而中止脚本
3
- # set -e
4
 
5
- # 设置颜色输出
6
- RED='\033[0;31m'
7
- GREEN='\033[0;32m'
8
- YELLOW='\033[1;33m'
9
- NC='\033[0m' # No Color
10
 
11
- echo "${GREEN}Starting Simple Clash Relay...${NC}"
 
 
12
 
13
- # 添加诊断信息
14
- echo "${YELLOW}System information:${NC}"
 
 
 
 
 
 
 
 
 
 
15
  uname -a
16
- echo "${YELLOW}Running as user:${NC}"
17
  id
18
 
19
- echo "${YELLOW}Checking executables:${NC}"
 
20
  file /app/clash_core/clash.meta-linux-amd64
21
  ls -la /app/clash_core/clash.meta-linux-amd64
22
 
23
- # 可选清理旧配置(如果指定CLEAN_CONFIG=true)
24
- if [ "${CLEAN_CONFIG}" = "true" ]; then
25
- echo "${YELLOW}Cleaning old config files...${NC}"
26
- rm -f /app/data/config.yaml /app/data/config.yaml.raw
27
- echo "${GREEN}Old config files cleaned${NC}"
28
- fi
29
-
30
  # 确保数据目录存在
31
- mkdir -p /app/data || echo "${YELLOW}Warning: Failed to create /app/data directory${NC}"
32
-
33
- # 尝试设置权限,但允许失败
34
- chmod -R 777 /app/data 2>/dev/null || echo "${YELLOW}Warning: Failed to set permissions for /app/data, continuing anyway${NC}"
 
 
 
35
 
36
- # 尝试设置subconverter执行权限,但允许失败
37
- if [ -f "/app/subconverter/subconverter" ]; then
38
- chmod +x /app/subconverter/subconverter 2>/dev/null || echo "${YELLOW}Warning: Failed to set executable permission for subconverter${NC}"
 
 
 
 
 
 
39
  fi
40
 
41
- # 尝试设置Clash Core执行权限,但允许失败
42
- if [ -f "/app/clash_core/clash.meta-linux-amd64" ]; then
43
- chmod +x /app/clash_core/clash.meta-linux-amd64 2>/dev/null || echo "${YELLOW}Warning: Failed to set executable permission for Clash Meta${NC}"
44
- echo "${GREEN}Clash Meta found${NC}"
 
 
 
45
  else
46
- echo "${RED}Error: Clash Core executable not found!${NC}"
47
  exit 1
48
  fi
49
 
50
  # 加载环境变量
51
- if [ -f ".env" ]; then
52
- echo "${GREEN}Loading environment variables from .env file...${NC}"
53
- export $(grep -v '^#' .env | xargs -d '\n')
54
  fi
55
 
56
  # 检查必要的环境变量
57
- if [ -z "$SUB_URL" ]; then
58
- echo "${RED}Error: SUB_URL environment variable is not set!${NC}"
59
- exit 1
60
- fi
61
-
62
- # 设置默认端口
63
- export FLASK_PORT=${FLASK_PORT:-7860}
64
- echo "${GREEN}Flask will listen on port ${FLASK_PORT}${NC}"
65
-
66
- # 输出基本信息
67
  echo "=========================="
68
  echo " Simple Clash Relay"
69
  echo "=========================="
70
  echo "Starting services..."
71
-
72
- # 打印环境变量(隐藏敏感信息)
73
  echo "Environment:"
74
- echo "FLASK_PORT: ${FLASK_PORT:-7860}"
75
- echo "CLASH_PROXY_PORT: ${CLASH_PROXY_PORT:-7890}"
76
- echo "CLASH_API_PORT: ${CLASH_API_PORT:-9090}"
77
  echo "SUB_URL: [hidden]"
78
  echo "API_KEY: [hidden]"
79
 
80
- # 检查必要的环境变量
81
- if [ -z "$API_KEY" ]; then
82
  echo "WARNING: API_KEY is not set. Using default value (insecure)!"
83
- export API_KEY="changeme"
84
  fi
85
 
86
- # 启动Flask应用
87
- echo "${GREEN}Starting Flask application...${NC}"
88
-
89
- # 使用gunicorn启动Flask应用(生产环境推荐)
90
- # 如果WORKER_COUNT未设置,使用CPU核心数+1的worker数量
91
- WORKER_COUNT=${WORKER_COUNT:-$(( $(nproc) + 1 ))}
92
- echo "Using $WORKER_COUNT workers"
93
 
94
- # 确保所有参数在一行或使用清晰的续行符
95
- exec gunicorn \
96
- --workers $WORKER_COUNT \
97
- --bind 0.0.0.0:${FLASK_PORT:-7860} \
98
- --log-level info \
99
- --access-logfile - \
100
- --error-logfile - \
101
- app.main:app
 
1
+ #!/bin/bash
 
 
2
 
3
+ # 彩色输出函数
4
+ function log_info() {
5
+ echo -e "\033[0;32m$1\033[0m"
6
+ }
 
7
 
8
+ function log_warning() {
9
+ echo -e "\033[1;33m$1\033[0m"
10
+ }
11
 
12
+ function log_error() {
13
+ echo -e "\033[0;31m$1\033[0m"
14
+ }
15
+
16
+ # 打印启动标题
17
+ DATE=$(date "+%Y-%m-%d %H:%M:%S")
18
+ echo "===== Application Startup at $DATE ====="
19
+ echo ""
20
+ log_info "Starting Simple Clash Relay..."
21
+
22
+ # 打印系统信息
23
+ log_warning "System information:"
24
  uname -a
25
+ log_warning "Running as user:"
26
  id
27
 
28
+ # 检查可执行文件
29
+ log_warning "Checking executables:"
30
  file /app/clash_core/clash.meta-linux-amd64
31
  ls -la /app/clash_core/clash.meta-linux-amd64
32
 
 
 
 
 
 
 
 
33
  # 确保数据目录存在
34
+ mkdir -p /app/data
35
+ if [ $? -ne 0 ]; then
36
+ log_warning "Warning: Failed to create /app/data, continuing anyway"
37
+ else
38
+ # 尝试设置权限
39
+ chmod -R 777 /app/data 2>/dev/null || log_warning "Warning: Failed to set permissions for /app/data, continuing anyway"
40
+ fi
41
 
42
+ # 检查是否需要清理配置
43
+ if [ "$CLEAN_CONFIG" = "true" ]; then
44
+ log_info "Cleaning old configuration files..."
45
+ rm -f /app/data/config.yaml /app/data/config.yaml.raw
46
+ if [ $? -eq 0 ]; then
47
+ log_info "Old configuration files cleaned successfully"
48
+ else
49
+ log_warning "Failed to clean old configuration files"
50
+ fi
51
  fi
52
 
53
+ # 尝试给二进制文件设置可执行权限
54
+ chmod +x /app/subconverter/subconverter 2>/dev/null || log_warning "Warning: Failed to set executable permission for subconverter"
55
+ chmod +x /app/clash_core/clash.meta-linux-amd64 2>/dev/null || log_warning "Warning: Failed to set executable permission for Clash Meta"
56
+
57
+ # 检查Clash Core是否存在
58
+ if [ -f /app/clash_core/clash.meta-linux-amd64 ]; then
59
+ log_info "Clash Meta found"
60
  else
61
+ log_error "Clash Meta binary not found!"
62
  exit 1
63
  fi
64
 
65
  # 加载环境变量
66
+ if [ -f .env ]; then
67
+ source .env
 
68
  fi
69
 
70
  # 检查必要的环境变量
71
+ echo -e "\033[0;32mFlask will listen on port $FLASK_PORT\033[0m"
 
 
 
 
 
 
 
 
 
72
  echo "=========================="
73
  echo " Simple Clash Relay"
74
  echo "=========================="
75
  echo "Starting services..."
 
 
76
  echo "Environment:"
77
+ echo "FLASK_PORT: $FLASK_PORT"
78
+ echo "CLASH_PROXY_PORT: $CLASH_PROXY_PORT"
79
+ echo "CLASH_API_PORT: $CLASH_API_PORT"
80
  echo "SUB_URL: [hidden]"
81
  echo "API_KEY: [hidden]"
82
 
83
+ # 检查API密钥
84
+ if [ -z "$API_KEY" ] || [ "$API_KEY" = "changeme" ]; then
85
  echo "WARNING: API_KEY is not set. Using default value (insecure)!"
 
86
  fi
87
 
88
+ # 检查订阅链接
89
+ if [ -z "$SUB_URL" ]; then
90
+ echo "WARNING: SUB_URL is not set. Proxy functionality will not work properly."
91
+ fi
 
 
 
92
 
93
+ # 启动Flask应用
94
+ log_info "Starting Flask application..."
95
+ WORKERS=$(nproc)
96
+ if [ $WORKERS -gt 16 ]; then
97
+ WORKERS=16 # 限制最大工作进程数
98
+ fi
99
+ echo "Using $WORKERS workers"
100
+ exec gunicorn app.main:app -b 0.0.0.0:$FLASK_PORT -w $WORKERS
requirements.txt CHANGED
@@ -1,5 +1,6 @@
1
- flask==2.0.1
2
  gunicorn==20.1.0
3
- requests==2.26.0
 
4
  # pyyaml==6.0 # 已通过 apk 安装
5
  Werkzeug==2.0.3 # 添加与 Flask==2.0.1 兼容的版本
 
1
+ Flask==2.2.3
2
  gunicorn==20.1.0
3
+ requests==2.28.2
4
+ pyyaml==6.0
5
  # pyyaml==6.0 # 已通过 apk 安装
6
  Werkzeug==2.0.3 # 添加与 Flask==2.0.1 兼容的版本