File size: 3,624 Bytes
149033c
 
 
390dc9b
de637f1
 
 
 
 
99187f2
149033c
99187f2
149033c
 
03d4200
149033c
03d4200
 
149033c
 
 
395f8b0
149033c
de637f1
149033c
 
 
5b7de09
 
149033c
 
b09cd7a
149033c
 
aa5326c
149033c
 
 
99187f2
 
149033c
 
 
 
b09cd7a
149033c
 
99187f2
 
149033c
 
 
 
 
de637f1
ac8610d
 
 
 
149033c
390dc9b
149033c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ac8610d
149033c
 
 
 
 
 
 
de637f1
149033c
a1a1f4d
de637f1
cd9d8e5
a1a1f4d
cd9d8e5
 
 
 
 
 
a1a1f4d
cd9d8e5
b09cd7a
cd9d8e5
 
a1a1f4d
cd9d8e5
 
 
a1a1f4d
cd9d8e5
149033c
 
cd9d8e5
 
149033c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/bin/sh
# 不再使用set -e,避免因chmod失败而中止脚本
# set -e

# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo "${GREEN}Starting Simple Clash Relay...${NC}"

# 添加诊断信息
echo "${YELLOW}System information:${NC}"
uname -a
echo "${YELLOW}Running as user:${NC}"
id

echo "${YELLOW}Checking executables:${NC}"
file /app/clash_core/clash.meta-linux-amd64
ls -la /app/clash_core/clash.meta-linux-amd64

# 可选清理旧配置(如果指定CLEAN_CONFIG=true)
if [ "${CLEAN_CONFIG}" = "true" ]; then
    echo "${YELLOW}Cleaning old config files...${NC}"
    rm -f /app/data/config.yaml /app/data/config.yaml.raw
    echo "${GREEN}Old config files cleaned${NC}"
fi

# 确保数据目录存在
mkdir -p /app/data || echo "${YELLOW}Warning: Failed to create /app/data directory${NC}"

# 尝试设置权限,但允许失败
chmod -R 777 /app/data 2>/dev/null || echo "${YELLOW}Warning: Failed to set permissions for /app/data, continuing anyway${NC}"

# 尝试设置subconverter执行权限,但允许失败
if [ -f "/app/subconverter/subconverter" ]; then
    chmod +x /app/subconverter/subconverter 2>/dev/null || echo "${YELLOW}Warning: Failed to set executable permission for subconverter${NC}"
fi

# 尝试设置Clash Core执行权限,但允许失败
if [ -f "/app/clash_core/clash.meta-linux-amd64" ]; then
    chmod +x /app/clash_core/clash.meta-linux-amd64 2>/dev/null || echo "${YELLOW}Warning: Failed to set executable permission for Clash Meta${NC}"
    echo "${GREEN}Clash Meta found${NC}"
else
    echo "${RED}Error: Clash Core executable not found!${NC}"
    exit 1
fi

# 加载环境变量
if [ -f ".env" ]; then
    echo "${GREEN}Loading environment variables from .env file...${NC}"
    export $(grep -v '^#' .env | xargs -d '\n')
fi

# 检查必要的环境变量
if [ -z "$SUB_URL" ]; then
    echo "${RED}Error: SUB_URL environment variable is not set!${NC}"
    exit 1
fi

# 设置默认端口
export FLASK_PORT=${FLASK_PORT:-7860}
echo "${GREEN}Flask will listen on port ${FLASK_PORT}${NC}"

# 输出基本信息
echo "=========================="
echo "  Simple Clash Relay"
echo "=========================="
echo "Starting services..."

# 打印环境变量(隐藏敏感信息)
echo "Environment:"
echo "FLASK_PORT:        ${FLASK_PORT:-7860}"
echo "CLASH_PROXY_PORT:  ${CLASH_PROXY_PORT:-7890}"
echo "CLASH_API_PORT:    ${CLASH_API_PORT:-9090}"
echo "SUB_URL:           [hidden]"
echo "API_KEY:           [hidden]"

# 检查必要的环境变量
if [ -z "$API_KEY" ]; then
    echo "WARNING: API_KEY is not set. Using default value (insecure)!"
    export API_KEY="changeme"
fi

# 启动Flask应用
echo -e "${GREEN}Starting Flask application with gevent worker for WebSocket support...${NC}"

if [ -n "$WORKERS" ]; then
    echo "Using $WORKERS workers (user defined)"
    DEFAULT_WORKERS="$WORKERS"
else
    # 计算合适的worker数量 (默认根据CPU数量,但最少2个,最多17个)
    DEFAULT_WORKERS=$(($(nproc) * 2 + 1))
    [ $DEFAULT_WORKERS -lt 2 ] && DEFAULT_WORKERS=2 
    [ $DEFAULT_WORKERS -gt 17 ] && DEFAULT_WORKERS=17
    echo "Using $DEFAULT_WORKERS workers (auto calculated)"
fi

# 增加超时时间,确保长连接能正常工作
# 增加记录器配置使错误更容易诊断
# 指定 -k gevent 来使用 gevent 工作进程,支持 WebSocket
cd /app && gunicorn \
    --bind 0.0.0.0:${FLASK_PORT} \
    --workers ${DEFAULT_WORKERS} \
    -k gevent \
    --timeout 300 \
    --access-logfile - \
    --error-logfile - \
    --capture-output \
    --log-level info \
    app.main:app