#!/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