clash / entrypoint.sh
clash-linux's picture
Upload 38 files
a1a1f4d verified
#!/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