Spaces:
Paused
Paused
Upload 13 files
Browse files- Dockerfile +4 -2
- app.py +31 -15
- entrypoint.sh +16 -12
Dockerfile
CHANGED
|
@@ -22,9 +22,11 @@ RUN apk add --no-cache \
|
|
| 22 |
# 设置时区为亚洲/上海
|
| 23 |
ENV TZ=Asia/Shanghai
|
| 24 |
|
| 25 |
-
# 创建必要的目录并设置权限
|
| 26 |
RUN mkdir -p ./clash_core ./subconverter ./data && \
|
| 27 |
-
chmod -R 777 ./data
|
|
|
|
|
|
|
| 28 |
|
| 29 |
# 下载并安装Clash Meta,保留原始文件名
|
| 30 |
RUN echo "Downloading Clash Meta..." && \
|
|
|
|
| 22 |
# 设置时区为亚洲/上海
|
| 23 |
ENV TZ=Asia/Shanghai
|
| 24 |
|
| 25 |
+
# 创建必要的目录并设置权限(构建阶段就设置好权限)
|
| 26 |
RUN mkdir -p ./clash_core ./subconverter ./data && \
|
| 27 |
+
chmod -R 777 ./data && \
|
| 28 |
+
chmod -R 777 ./clash_core && \
|
| 29 |
+
chmod -R 777 ./subconverter
|
| 30 |
|
| 31 |
# 下载并安装Clash Meta,保留原始文件名
|
| 32 |
RUN echo "Downloading Clash Meta..." && \
|
app.py
CHANGED
|
@@ -12,30 +12,46 @@ import atexit
|
|
| 12 |
def setup_environment():
|
| 13 |
"""设置必要的环境变量和目录"""
|
| 14 |
# 确保数据目录存在
|
| 15 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
-
#
|
| 18 |
-
|
| 19 |
-
os.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
-
|
| 22 |
-
os.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
# 设置环境变量
|
| 25 |
os.environ["FLASK_PORT"] = "7860" # HF Spaces 要求的端口
|
| 26 |
|
| 27 |
# 如果没有设置 SUB_URL 环境变量,尝试从 .env 加载
|
| 28 |
if not os.environ.get("SUB_URL") and os.path.exists(".env"):
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
line
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
|
| 36 |
def start_app():
|
| 37 |
"""启动应用程序"""
|
| 38 |
-
print("正在启动 Simple Clash Relay...")
|
| 39 |
|
| 40 |
# 使用 gunicorn 启动 Flask 应用
|
| 41 |
app_process = subprocess.Popen(
|
|
@@ -47,7 +63,7 @@ def start_app():
|
|
| 47 |
|
| 48 |
# 注册应用程序退出时的清理函数
|
| 49 |
def cleanup():
|
| 50 |
-
print("正在停止应用...")
|
| 51 |
app_process.terminate()
|
| 52 |
try:
|
| 53 |
app_process.wait(timeout=5)
|
|
@@ -58,7 +74,7 @@ def start_app():
|
|
| 58 |
|
| 59 |
# 信号处理
|
| 60 |
def signal_handler(sig, frame):
|
| 61 |
-
print(f"接收到信号 {sig},正在退出...")
|
| 62 |
cleanup()
|
| 63 |
sys.exit(0)
|
| 64 |
|
|
|
|
| 12 |
def setup_environment():
|
| 13 |
"""设置必要的环境变量和目录"""
|
| 14 |
# 确保数据目录存在
|
| 15 |
+
try:
|
| 16 |
+
os.makedirs("data", exist_ok=True)
|
| 17 |
+
print("✅ 数据目录已创建")
|
| 18 |
+
except Exception as e:
|
| 19 |
+
print(f"⚠️ 创建数据目录失败: {str(e)}")
|
| 20 |
|
| 21 |
+
# 尝试设置执行权限,但允许失败
|
| 22 |
+
try:
|
| 23 |
+
if os.path.exists("subconverter/subconverter"):
|
| 24 |
+
os.chmod("subconverter/subconverter", 0o755)
|
| 25 |
+
print("✅ subconverter权限已设置")
|
| 26 |
+
except Exception as e:
|
| 27 |
+
print(f"⚠️ 设置subconverter权限失败: {str(e)}")
|
| 28 |
|
| 29 |
+
try:
|
| 30 |
+
if os.path.exists("clash_core/clash.meta-linux-amd64"):
|
| 31 |
+
os.chmod("clash_core/clash.meta-linux-amd64", 0o755)
|
| 32 |
+
print("✅ Clash Core权限已设置")
|
| 33 |
+
except Exception as e:
|
| 34 |
+
print(f"⚠️ 设置Clash Core权限失败: {str(e)}")
|
| 35 |
|
| 36 |
# 设置环境变量
|
| 37 |
os.environ["FLASK_PORT"] = "7860" # HF Spaces 要求的端口
|
| 38 |
|
| 39 |
# 如果没有设置 SUB_URL 环境变量,尝试从 .env 加载
|
| 40 |
if not os.environ.get("SUB_URL") and os.path.exists(".env"):
|
| 41 |
+
try:
|
| 42 |
+
with open(".env", "r") as f:
|
| 43 |
+
for line in f:
|
| 44 |
+
line = line.strip()
|
| 45 |
+
if line and not line.startswith("#"):
|
| 46 |
+
key, value = line.split("=", 1)
|
| 47 |
+
os.environ[key] = value
|
| 48 |
+
print("✅ 从.env加载了环境变量")
|
| 49 |
+
except Exception as e:
|
| 50 |
+
print(f"⚠️ 加载.env失败: {str(e)}")
|
| 51 |
|
| 52 |
def start_app():
|
| 53 |
"""启动应用程序"""
|
| 54 |
+
print("🚀 正在启动 Simple Clash Relay...")
|
| 55 |
|
| 56 |
# 使用 gunicorn 启动 Flask 应用
|
| 57 |
app_process = subprocess.Popen(
|
|
|
|
| 63 |
|
| 64 |
# 注册应用程序退出时的清理函数
|
| 65 |
def cleanup():
|
| 66 |
+
print("🛑 正在停止应用...")
|
| 67 |
app_process.terminate()
|
| 68 |
try:
|
| 69 |
app_process.wait(timeout=5)
|
|
|
|
| 74 |
|
| 75 |
# 信号处理
|
| 76 |
def signal_handler(sig, frame):
|
| 77 |
+
print(f"📢 接收到信号 {sig},正在退出...")
|
| 78 |
cleanup()
|
| 79 |
sys.exit(0)
|
| 80 |
|
entrypoint.sh
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
#!/bin/sh
|
| 2 |
-
#
|
| 3 |
-
set -e
|
| 4 |
|
| 5 |
# 设置颜色输出
|
| 6 |
RED='\033[0;31m'
|
|
@@ -10,17 +10,21 @@ NC='\033[0m' # No Color
|
|
| 10 |
|
| 11 |
echo "${GREEN}Starting Simple Clash Relay...${NC}"
|
| 12 |
|
| 13 |
-
#
|
| 14 |
-
mkdir -p /app/data
|
| 15 |
-
chmod -R 777 /app/data
|
| 16 |
|
| 17 |
-
#
|
| 18 |
-
chmod
|
| 19 |
|
| 20 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
if [ -f "/app/clash_core/clash.meta-linux-amd64" ]; then
|
| 22 |
-
chmod +x /app/clash_core/clash.meta-linux-amd64
|
| 23 |
-
echo "${GREEN}
|
| 24 |
else
|
| 25 |
echo "${RED}Error: Clash Core executable not found!${NC}"
|
| 26 |
exit 1
|
|
@@ -50,7 +54,7 @@ echo "Starting services..."
|
|
| 50 |
|
| 51 |
# 打印环境变量(隐藏敏感信息)
|
| 52 |
echo "Environment:"
|
| 53 |
-
echo "FLASK_PORT: ${FLASK_PORT:-
|
| 54 |
echo "CLASH_PROXY_PORT: ${CLASH_PROXY_PORT:-7890}"
|
| 55 |
echo "CLASH_API_PORT: ${CLASH_API_PORT:-9090}"
|
| 56 |
echo "SUB_URL: [hidden]"
|
|
@@ -73,7 +77,7 @@ echo "Using $WORKER_COUNT workers"
|
|
| 73 |
# 确保所有参数在一行或使用清晰的续行符
|
| 74 |
exec gunicorn \
|
| 75 |
--workers $WORKER_COUNT \
|
| 76 |
-
--bind 0.0.0.0:${FLASK_PORT:-
|
| 77 |
--log-level info \
|
| 78 |
--access-logfile - \
|
| 79 |
--error-logfile - \
|
|
|
|
| 1 |
#!/bin/sh
|
| 2 |
+
# 不再使用set -e,避免因chmod失败而中止脚本
|
| 3 |
+
# set -e
|
| 4 |
|
| 5 |
# 设置颜色输出
|
| 6 |
RED='\033[0;31m'
|
|
|
|
| 10 |
|
| 11 |
echo "${GREEN}Starting Simple Clash Relay...${NC}"
|
| 12 |
|
| 13 |
+
# 确保数据目录存在
|
| 14 |
+
mkdir -p /app/data || echo "${YELLOW}Warning: Failed to create /app/data directory${NC}"
|
|
|
|
| 15 |
|
| 16 |
+
# 尝试设置权限,但允许失败
|
| 17 |
+
chmod -R 777 /app/data 2>/dev/null || echo "${YELLOW}Warning: Failed to set permissions for /app/data, continuing anyway${NC}"
|
| 18 |
|
| 19 |
+
# 尝试设置subconverter执行权限,但允许失败
|
| 20 |
+
if [ -f "/app/subconverter/subconverter" ]; then
|
| 21 |
+
chmod +x /app/subconverter/subconverter 2>/dev/null || echo "${YELLOW}Warning: Failed to set executable permission for subconverter${NC}"
|
| 22 |
+
fi
|
| 23 |
+
|
| 24 |
+
# 尝试设置Clash Core执行权限,但允许失败
|
| 25 |
if [ -f "/app/clash_core/clash.meta-linux-amd64" ]; then
|
| 26 |
+
chmod +x /app/clash_core/clash.meta-linux-amd64 2>/dev/null || echo "${YELLOW}Warning: Failed to set executable permission for Clash Meta${NC}"
|
| 27 |
+
echo "${GREEN}Clash Meta found${NC}"
|
| 28 |
else
|
| 29 |
echo "${RED}Error: Clash Core executable not found!${NC}"
|
| 30 |
exit 1
|
|
|
|
| 54 |
|
| 55 |
# 打印环境变量(隐藏敏感信息)
|
| 56 |
echo "Environment:"
|
| 57 |
+
echo "FLASK_PORT: ${FLASK_PORT:-7860}"
|
| 58 |
echo "CLASH_PROXY_PORT: ${CLASH_PROXY_PORT:-7890}"
|
| 59 |
echo "CLASH_API_PORT: ${CLASH_API_PORT:-9090}"
|
| 60 |
echo "SUB_URL: [hidden]"
|
|
|
|
| 77 |
# 确保所有参数在一行或使用清晰的续行符
|
| 78 |
exec gunicorn \
|
| 79 |
--workers $WORKER_COUNT \
|
| 80 |
+
--bind 0.0.0.0:${FLASK_PORT:-7860} \
|
| 81 |
--log-level info \
|
| 82 |
--access-logfile - \
|
| 83 |
--error-logfile - \
|