安全修复: - WebSocket 端点添加认证(cookie/token),防止未授权窃听日志 - SPA serve_spa 添加路径遍历防护(resolve + relative_to 检查) - Token 改用 httpOnly Cookie 存储,移除前端 localStorage token(防 XSS 窃取) - 添加安全响应头中间件(X-Content-Type-Options/X-Frame-Options/Referrer-Policy) - HTTP 请求日志脱敏请求体中的 password/secret/token 等敏感字段 - 权限检查统一使用 user_has_permission(考虑自定义权限,修复 has_permission 忽略 custom_permissions 的缺陷) 性能与稳定性: - cookies.py 列表接口修复 N+1 查询(改为批量查询 Account) - login_service.py run() 结束时关闭 DB Session(防止连接泄漏) - _active_batches/_active_tests 全局字典添加 threading.Lock(防止并发竞态) 配置优化: - CORS 源支持环境变量 CORS_ORIGINS 配置 - Uvicorn reload 支持环境变量 UVICORN_RELOAD 控制(生产环境默认关闭) - Cookie 安全标志支持环境变量 COOKIE_SECURE 配置(HTTPS 部署时启用) - logs.py 权限不足返回 HTTP 403(原来返回 200 + message)
67 lines
1.6 KiB
Bash
Executable File
67 lines
1.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
set -e
|
||
|
||
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
cd "$ROOT_DIR"
|
||
|
||
PYTHON="$ROOT_DIR/.venv/bin/python"
|
||
FRONTEND_DIR="$ROOT_DIR/web/frontend"
|
||
BACKEND_PORT=8000
|
||
FRONTEND_PORT=5173
|
||
|
||
# 检查 Python 虚拟环境
|
||
if [ ! -f "$PYTHON" ]; then
|
||
echo "❌ 未找到 .venv,正在创建..."
|
||
uv venv .venv
|
||
uv pip install -e .
|
||
fi
|
||
|
||
# 检查前端依赖
|
||
if [ ! -d "$FRONTEND_DIR/node_modules" ]; then
|
||
echo "❌ 前端依赖未安装,正在安装..."
|
||
cd "$FRONTEND_DIR" && npm install && cd "$ROOT_DIR"
|
||
fi
|
||
|
||
echo ""
|
||
echo "=============================="
|
||
echo " 斗鱼批量登录 - Web 后台"
|
||
echo "=============================="
|
||
echo " 后端: http://localhost:$BACKEND_PORT"
|
||
echo " 前端: http://localhost:$FRONTEND_PORT"
|
||
echo " 默认账号见环境变量 ADMIN_USERNAME/ADMIN_PASSWORD(未设置则为 admin/admin123)"
|
||
echo " 按 Ctrl+C 停止所有服务"
|
||
echo "=============================="
|
||
echo ""
|
||
|
||
# 清理子进程
|
||
cleanup() {
|
||
echo ""
|
||
echo "正在停止服务..."
|
||
kill $BACKEND_PID $FRONTEND_PID 2>/dev/null
|
||
wait $BACKEND_PID $FRONTEND_PID 2>/dev/null
|
||
echo "已停止"
|
||
}
|
||
trap cleanup EXIT INT TERM
|
||
|
||
# 启动后端
|
||
echo "启动后端 (FastAPI :$BACKEND_PORT)..."
|
||
RELOAD_FLAG=""
|
||
if [ "${UVICORN_RELOAD:-true}" = "true" ]; then
|
||
RELOAD_FLAG="--reload"
|
||
fi
|
||
"$PYTHON" -m uvicorn web.backend.main:app --host 0.0.0.0 --port $BACKEND_PORT $RELOAD_FLAG &
|
||
BACKEND_PID=$!
|
||
|
||
# 等后端就绪
|
||
sleep 2
|
||
|
||
# 启动前端
|
||
echo "启动前端 (Vite :$FRONTEND_PORT)..."
|
||
cd "$FRONTEND_DIR"
|
||
npm run dev -- --port $FRONTEND_PORT --host 0.0.0.0 &
|
||
FRONTEND_PID=$!
|
||
cd "$ROOT_DIR"
|
||
|
||
# 等待子进程
|
||
wait
|