Files
NebulaShell/start.bat
2026-04-17 23:15:15 +08:00

217 lines
8.4 KiB
Batchfile
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@echo off
chcp 65001 >nul 2>&1
setlocal enabledelayedexpansion
:: ═══════════════════════════════════════════════════════════
:: FutureOSS 智能启动脚本 - Windows
:: 自动检测环境 / 安装依赖 / 进度显示 / 守护重启
:: ═══════════════════════════════════════════════════════════
cd /d "%~dp0"
:: ── 颜色代码 ──
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
:: ── 工具函数 ──
call :colorEcho 0B "[信息] 环境检测中..."
call :colorEcho 0A "[成功] 检测完成"
call :colorEcho 0E "[警告] 某些组件缺失"
call :colorEcho 0C "[错误] 检测失败"
:: ── Logo ──
echo.
call :colorEcho 0B " ███████╗ ██████╗ ██████╗ ██████╗ ██████╗ ██████╗ "
call :colorEcho 0B " ██╔════╝ ██╔══██╗ ██╔══██╗ ██╔══██╗ ██╔══██╗██╔════╝ "
call :colorEcho 0B " █████╗ ██████╔╝ ██████╔╝ ██████╔╝ ██║ ██║██║ ███╗"
call :colorEcho 0B " ██╔══╝ ██╔══██╗ ██╔══██╗ ██╔══██╗ ██║ ██║██║ ██║"
call :colorEcho 0B " ██║ ██║ ██║ ██║ ██║ ██║ ██║ ██████╔╝╚██████╔╝"
call :colorEcho 0B " ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ "
echo.
call :colorEcho 0F " 开发者通用工具套组 · 一切皆为插件"
call :colorEcho 07 " https://gitee.com/starlight-apk/feature-oss"
echo.
:: ═══════════════════════════════════════════════════════════
:: 1. 检测 Python
:: ═══════════════════════════════════════════════════════════
call :colorEcho 0B "[信息] 检测 Python..."
set "PYTHON_CMD="
for %%p in (python python3 py py3) do (
where %%p >nul 2>&1
if !errorlevel! equ 0 (
set "PYTHON_CMD=%%p"
goto :found_python
)
)
:found_python
if "%PYTHON_CMD%"=="" (
call :colorEcho 0C "[错误] 未找到 Python请先安装 Python 3.10+"
call :colorEcho 0E "[提示] 下载地址: https://www.python.org/downloads/"
pause
exit /b 1
)
for /f "tokens=*" %%i in ('%PYTHON_CMD% --version 2^>^&1') do set "PY_VER=%%i"
call :colorEcho 0A "[成功] %PY_VER%"
:: ═══════════════════════════════════════════════════════════
:: 2. 虚拟环境
:: ═══════════════════════════════════════════════════════════
echo.
call :colorEcho 0B "[信息] 配置 Python 环境..."
if not exist ".venv" (
call :colorEcho 0E "[信息] 创建虚拟环境..."
%PYTHON_CMD% -m venv .venv >nul 2>&1
if errorlevel 1 (
call :colorEcho 0C "[错误] 无法创建虚拟环境"
pause
exit /b 1
)
call :colorEcho 0A "[成功] 虚拟环境已创建"
) else (
call :colorEcho 0A "[成功] 虚拟环境已存在"
)
call .venv\Scripts\activate.bat >nul 2>&1
:: ═══════════════════════════════════════════════════════════
:: 3. 安装依赖
:: ═══════════════════════════════════════════════════════════
echo.
call :colorEcho 0B "[信息] 安装 Python 依赖..."
set "DEPS=click pyyaml websockets psutil cryptography"
set "TOTAL=5"
set "CURRENT=0"
for %%d in (%DEPS%) do (
set /a CURRENT+=1
call :printProgress !CURRENT! !TOTAL! "安装 %%d"
%PYTHON_CMD% -c "import %%d" 2>nul
if errorlevel 1 (
pip install %%d -q 2>nul
)
)
echo.
echo.
call :colorEcho 0A "[成功] Python 依赖安装完成"
:: 安装项目依赖
if exist "pyproject.toml" (
call :colorEcho 0E "[信息] 安装项目配置依赖..."
pip install -e . -q 2>nul
)
if exist "requirements.txt" (
call :colorEcho 0E "[信息] 安装 requirements.txt..."
pip install -r requirements.txt -q 2>nul
)
:: ═══════════════════════════════════════════════════════════
:: 4. 检查 PHP
:: ═══════════════════════════════════════════════════════════
echo.
call :colorEcho 0B "[信息] 检查 PHP..."
where php >nul 2>&1
if errorlevel 1 (
call :colorEcho 0E "[警告] PHP 未安装WebUI 可能无法正常工作"
call :colorEcho 07 "[提示] 安装: choco install php 或从 https://windows.php.net/download/ 下载"
) else (
for /f "tokens=*" %%i in ('php --version 2^>^&1 ^| findstr /r "PHP"') do set "PHP_VER=%%i"
call :colorEcho 0A "[成功] !PHP_VER!"
)
:: ═══════════════════════════════════════════════════════════
:: 5. 创建数据目录
:: ═══════════════════════════════════════════════════════════
echo.
call :colorEcho 0B "[信息] 初始化数据目录..."
set "DIRS=data data\html-render data\web-toolkit data\plugin-storage data\DCIM data\pkg data\signature-verifier\keys\private data\signature-verifier\keys\public logs"
for %%d in (%DIRS%) do (
if not exist "%%d" mkdir "%%d"
)
call :colorEcho 0A "[成功] 数据目录已就绪"
:: ═══════════════════════════════════════════════════════════
:: 6. 启动服务
:: ═══════════════════════════════════════════════════════════
echo.
call :colorEcho 0B "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
call :colorEcho 0B " 启动 FutureOSS"
call :colorEcho 0B "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo.
if "%1"=="--daemon" goto :daemon_mode
if "%1"=="-d" goto :daemon_mode
:: 前台模式
call :colorEcho 0F "运行中... 按 Ctrl+C 停止"
echo.
set "RESTART_DELAY=3"
set "RESTART_COUNT=0"
:loop
%PYTHON_CMD% -m oss.cli serve
set "EXIT_CODE=%errorlevel%"
if %EXIT_CODE% equ 0 (
call :colorEcho 0A "[成功] 服务正常退出"
goto :end
)
set /a RESTART_COUNT+=1
call :colorEcho 0E "[警告] 服务异常退出 (code: %EXIT_CODE%)!RESTART_DELAY!s 后重启... (第 !RESTART_COUNT! 次)"
timeout /t !RESTART_DELAY! /nobreak >nul
:: 指数退避
if !RESTART_DELAY! lss 30 (
set /a RESTART_DELAY=!RESTART_DELAY! * 2
)
goto :loop
:daemon_mode
call :colorEcho 0E "[警告] Windows 守护模式需要额外配置"
call :colorEcho 07 "[提示] 建议使用任务计划程序或 nssm 工具实现"
echo.
%PYTHON_CMD% -m oss.cli serve
goto :end
:end
call .venv\Scripts\deactivate.bat >nul 2>&1
pause
exit /b 0
:: ── 进度条函数 ──
:printProgress
set /a "pct=%1 * 100 / %2"
set /a "filled=pct / 2"
set /a "empty=50-filled"
set "bar="
for /l %%i in (1,1,%filled%) do set "bar=!bar!█"
for /l %%i in (1,1,%empty%) do set "bar=!bar!░"
echo [!bar!] !pct!%% - %3
exit /b 0
:: ── 颜色输出函数 ──
:colorEcho
set "params=%1"
set "msg=%~2"
call :colorText %params% "%msg%"
exit /b 0
:colorText
echo %~2
exit /b 0