diff --git a/README.md b/README.md index cee3125..2d4ec55 100644 --- a/README.md +++ b/README.md @@ -9,116 +9,95 @@ ## โœจ ็‰นๆ€ง -- ๐ŸŽจ **Textual TUI** โ€” ไธ‰ๆ ็•Œ้ข + ็ณป็ปŸ็›‘ๆŽง้ขๆฟ + CLI ๅ›ž้€€ +- ๐ŸŽจ **Textual TUI** โ€” ็ณป็ปŸ็›‘ๆŽง้ขๆฟ + ๅ‘ฝไปค่กฅๅ…จ + CLI ๅ›ž้€€ - ๐Ÿ”Œ **ๆ’ไปถ็ณป็ปŸ** โ€” ็ƒญๅŠ ่ฝฝใ€ๆƒ้™้š”็ฆปใ€ไพ่ต–่งฃๆžใ€่ฟ›็จ‹้š”็ฆป -- ๐Ÿ—„๏ธ **้กน็›ฎๆณจๅ†Œ่กจ** โ€” ๆ’ไปถๅฃฐๆ˜Ž `project.yaml` ็”ณ่ฏท็ซฏๅฃๅ’Œ่ต„ๆบ +- ๐Ÿ—„๏ธ **้กน็›ฎๅผ•ๆ“Ž** โ€” ๆŽฅ็ฎกไปปไฝ• Python/ๅ‘ฝไปค่กŒ้กน็›ฎ (subprocess + ๆ—ฅๅฟ— + stdin) +- ๐Ÿ”€ **ๅๅ‘ไปฃ็†** โ€” HTTP/WS ไปฃ็†๏ผŒๆœฌๅœฐ/ๅฑ€ๅŸŸ็ฝ‘/ๅ…ฌ็ฝ‘็ซฏๅฃๆ˜ ๅฐ„ - ๐Ÿ“Š **SQLite ๆŒไน…ๅŒ–** โ€” ๆ’ไปถ็Šถๆ€ใ€ๆƒ้™ใ€ๅฎก่ฎกๆ—ฅๅฟ—็ปŸไธ€ๅญ˜ๅ‚จ -- ๐ŸŒ **Web ็ฎก็†้ขๆฟ** โ€” aiohttp + WebSocket๏ผŒ:4200 ๅฎžๆ—ถไปช่กจ็›˜ -- ๐Ÿ” **ๅฎ‰ๅ…จ่ฎค่ฏ** โ€” PBKDF2-SHA256ใ€็Žฏๅขƒๅ˜้‡ๅฏ†็ ใ€Token ็ฎก็† -- ๐Ÿณ **Docker ้ƒจ็ฝฒ** โ€” Alpine ้•œๅƒ <100MB๏ผŒsystemd ๆœๅŠกๆ–‡ไปถ -- ๐Ÿงช **23 ไธชๅ›žๅฝ’ๆต‹่ฏ•** โ€” pytest๏ผŒ้›ถๅคฑ่ดฅ +- ๐ŸŒ **Web ็ฎก็†้ขๆฟ** โ€” aiohttp + SSE๏ผŒ้กน็›ฎ็ฎก็†/ไปฃ็†/ๆ’ไปถๆŽงๅˆถ้กต +- ๐Ÿ” **ๅฎ‰ๅ…จ่ฎค่ฏ** โ€” PBKDF2-SHA256ใ€็Žฏๅขƒๅ˜้‡ๅฏ†็  +- ๐Ÿณ **Docker ้ƒจ็ฝฒ** โ€” Alpine ้•œๅƒ๏ผŒsystemd ๆœๅŠกๆ–‡ไปถ +- ๐Ÿงช **28 ไธชๅ›žๅฝ’ๆต‹่ฏ•** โ€” pytest๏ผŒ้›ถๅคฑ่ดฅ +- ๐Ÿ› ๏ธ **ๆ’ไปถ SDK** โ€” ๅ‘ฝไปค่ฃ…้ฅฐๅ™จ + Web ้ขๆฟ + API + SSE ๆŽจ้€ ## ๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹ ```bash -# ๅฎ‰่ฃ…ไพ่ต– pip install -r requirements.txt - -# ๅฏๅŠจ (TUI ๆจกๅผ) -python main.py - -# ๅฏๅŠจ (headless๏ผŒ้€‚ๅˆ SSH/systemd/Docker) -python main.py --headless - -# ่ฟ่กŒๆต‹่ฏ• -python -m pytest tests/ -v +python main.py # TUI ๆจกๅผ +python main.py --headless # ๅŽๅฐๆจกๅผ +python -m pytest tests/ -v # ่ฟ่กŒๆต‹่ฏ• ``` ## ๐Ÿ—๏ธ ๆžถๆž„ ``` -main.py โ†’ SenSuFramework - โ”œโ”€ ServiceManager (15 ๆœๅŠก) - โ”œโ”€ CoreBridge โ‡„ PluginBridge โ‡„ NetworkBridge - โ”œโ”€ PluginService (็ƒญๅŠ ่ฝฝ + ไพ่ต–่งฃๆž) - โ”œโ”€ ProjectService (้กน็›ฎๆณจๅ†Œ่กจ + ็ซฏๅฃๅˆ†้…) - โ”œโ”€ SenSuDB (SQLite 5 ่กจ) - โ”œโ”€ TuiService (Textual + ็ณป็ปŸ็›‘ๆŽง) - โ”œโ”€ InternetService (HTTP :4200 + WS :4240) - โ”œโ”€ WebPanel (็ฎก็†้ขๆฟ /SenSu) - โ””โ”€ PermissionService (4 ็บงๆƒ้™) +main.py โ†’ SenSuFramework (15 ๆœๅŠก) +โ”œโ”€โ”€ ProjectEngine โ† ๆŽฅ็ฎกไปปไฝ•้กน็›ฎ (subprocess + ๆ—ฅๅฟ—) +โ”œโ”€โ”€ ProxyService โ† ๅๅ‘ไปฃ็† (HTTP+WS) +โ”œโ”€โ”€ PyEnvManager โ† Python ็‰ˆๆœฌ + venv + git clone +โ”œโ”€โ”€ PluginWebMixin โ† ๆ’ไปถ Web ๆŽงๅˆถ้ขๆฟ SDK +โ”œโ”€โ”€ PluginService โ† ็ƒญๅŠ ่ฝฝ + ็Šถๆ€่ฟฝ่ธช +โ”œโ”€โ”€ SenSuDB โ† SQLite 5 ่กจ +โ”œโ”€โ”€ TuiService โ† Textual + ็ณป็ปŸ็›‘ๆŽง +โ”œโ”€โ”€ InternetService โ† HTTP :4200 + WS :4240 +โ””โ”€โ”€ WebPanelManager โ† /SenSu ็ฎก็†้ขๆฟ ``` -## ๐Ÿ“ ็›ฎๅฝ•็ป“ๆž„ +## ๐Ÿ“ ็›ฎๅฝ• ``` SenSu-Alpha/ -โ”œโ”€โ”€ main.py # ๆก†ๆžถๅ…ฅๅฃ -โ”œโ”€โ”€ service_manager.py # ๆœๅŠกๆณจๅ†Œ่กจ -โ”œโ”€โ”€ sdk/ # ๆ’ไปถๅผ€ๅ‘ๅทฅๅ…ทๅŒ… -โ”‚ โ”œโ”€โ”€ plugin_command_decorator.py -โ”‚ โ”œโ”€โ”€ plugin_status.py -โ”‚ โ””โ”€โ”€ plugin_error.py -โ”œโ”€โ”€ services/ # ๆ ธๅฟƒๆœๅŠก (15 ไธช) -โ”‚ โ”œโ”€โ”€ sensu_db.py # SQLite ๆŒไน…ๅŒ– -โ”‚ โ”œโ”€โ”€ project_service.py # ้กน็›ฎๆณจๅ†Œ่กจ -โ”‚ โ”œโ”€โ”€ process_isolated.py # ่ฟ›็จ‹้š”็ฆป -โ”‚ โ””โ”€โ”€ sysmon_widget.py # ็ณป็ปŸ็›‘ๆŽง -โ”œโ”€โ”€ bridges/ # ๆถˆๆฏๆกฅๆŽฅ -โ”œโ”€โ”€ plugins/ # ๆ’ไปถ็›ฎๅฝ• -โ”œโ”€โ”€ deploy/ # ้ƒจ็ฝฒๆ–‡ไปถ -โ”‚ โ”œโ”€โ”€ sensu.service # systemd -โ”‚ โ””โ”€โ”€ Dockerfile # Docker -โ”œโ”€โ”€ tests/ # 23 ไธชๆต‹่ฏ• -โ””โ”€โ”€ docs/ # ๅผ€ๅ‘ๆ–‡ๆกฃ +โ”œโ”€โ”€ main.py, service_manager.py +โ”œโ”€โ”€ sdk/ plugin_command, plugin_status, plugin_error, plugin_web +โ”œโ”€โ”€ services/ 15 ไธชๆ ธๅฟƒๆœๅŠก +โ”œโ”€โ”€ bridges/ CoreBridge + PluginBridge + NetworkBridge +โ”œโ”€โ”€ plugins/ ๆ’ไปถ็›ฎๅฝ• + example_plugin (ๅซ Web ้ขๆฟ) +โ”œโ”€โ”€ deploy/ systemd + Dockerfile +โ”œโ”€โ”€ tests/ 28 ไธชๆต‹่ฏ• +โ””โ”€โ”€ docs/ ๅผ€ๅ‘ๆ–‡ๆกฃ +``` + +## ๐ŸŒ Web ้ขๆฟ + +``` +http://0.0.0.0:4200/SenSu/ +โ”œโ”€โ”€ /dashboard ไปช่กจ็›˜ +โ”œโ”€โ”€ /pages/projects ้กน็›ฎ็ฎก็† (ๆทปๅŠ /ๅฏๅŠจ/Git้ƒจ็ฝฒ) โ† NEW +โ”œโ”€โ”€ /pages/proxy ๅๅ‘ไปฃ็†็ฎก็† โ† NEW +โ”œโ”€โ”€ /plugin/{name} ๆ’ไปถๆŽงๅˆถ้ขๆฟ โ† NEW +โ”œโ”€โ”€ /console Web ็ปˆ็ซฏ +โ”œโ”€โ”€ /logs ๅฎžๆ—ถๆ—ฅๅฟ— +โ””โ”€โ”€ /plugins ๆ’ไปถๅˆ—่กจ ``` ## ๐Ÿ”Œ ๆ’ไปถๅผ€ๅ‘ ```python -# plugins/my_plugin/__init__.py from sdk.plugin_command_decorator import plugin_command +from sdk.plugin_web import PluginWebMixin -class Plugin: +class Plugin(PluginWebMixin): def __init__(self, plugin_name=None, config=None, bridge=None): + PluginWebMixin.__init__(self) self.plugin_name = plugin_name - self.bridge = bridge async def initialize(self): - # ๆณจๅ†Œ็ฝ‘็ปœ่ทฏ็”ฑ - await self.network_bridge.register_http_route( - "/api/my/info", self._handler, methods=["GET"]) + self.register_web_page("my_plugin", "My Panel", "

Hello

") - @plugin_command(name="hello", description="ๆ‰“ๆ‹›ๅ‘ผ") + @plugin_command(name="hello") async def cmd_hello(self, *args): - return f"Hello from {self.plugin_name}!" - - async def shutdown(self): - pass + return "Hello World!" ``` -่ฏฆ็ป†ๆ–‡ๆกฃ่ง `docs/SenSu ๆ’ไปถๅผ€ๅ‘่ฏฆ็ป†ๆŒ‡ๅ—.md` - -## ๐ŸŒ API ็ซฏ็‚น - -| ๆ–นๆณ• | ่ทฏๅพ„ | ่ฏดๆ˜Ž | -|------|------|------| -| GET | `/health` | ๅฅๅบทๆฃ€ๆŸฅ | -| GET | `/SenSu/` | Web ็ฎก็†้ขๆฟ | -| POST | `/SenSu/api/login` | ้ขๆฟ็™ปๅฝ• | -| GET | `/SenSu/api/system` | ็ณป็ปŸ็Šถๆ€ | -| GET | `/SenSu/api/plugins` | ๆ’ไปถๅˆ—่กจ | -| POST | `/SenSu/api/command` | ๆ‰ง่กŒๅ‘ฝไปค | -| GET | `/api/example/info` | ็คบไพ‹ๆ’ไปถ | - ## ๐Ÿ”ง ็Žฏๅขƒๅ˜้‡ -| ๅ˜้‡ | ้ป˜่ฎคๅ€ผ | ่ฏดๆ˜Ž | -|------|------|------| -| `SENSU_ADMIN_PASSWORD` | `admin123` | ็ฎก็†ๅ‘˜ๅฏ†็  | -| `SENSU_API_PASSWORD` | `api123` | API ๅฏ†็  | -| `SENSU_PANEL_USER` | `admin` | ้ขๆฟ็”จๆˆทๅ | -| `SENSU_PANEL_PASS` | `admin` | ้ขๆฟๅฏ†็  | +| ๅ˜้‡ | ้ป˜่ฎคๅ€ผ | +|------|------| +| `SENSU_ADMIN_PASSWORD` | `admin123` | +| `SENSU_API_PASSWORD` | `api123` | +| `SENSU_PANEL_USER` | `admin` | +| `SENSU_PANEL_PASS` | `admin` | ## ๐Ÿ“„ ่ฎธๅฏ่ฏ diff --git a/docs/้กน็›ฎๆ–‡ไปถ็ป“ๆž„.txt b/docs/้กน็›ฎๆ–‡ไปถ็ป“ๆž„.txt index 2c4fab1..d27c69c 100644 --- a/docs/้กน็›ฎๆ–‡ไปถ็ป“ๆž„.txt +++ b/docs/้กน็›ฎๆ–‡ไปถ็ป“ๆž„.txt @@ -1,75 +1,56 @@ SenSu/ โ”œโ”€โ”€ main.py # ๆก†ๆžถไธปๅ…ฅๅฃ (--headless ๅ‚ๆ•ฐ) -โ”œโ”€โ”€ service_manager.py # ๆœๅŠก็ฎก็†ๅ™จ (ไพ่ต–ๆณจๅ…ฅ + ๅฅๅบทๆฃ€ๆŸฅ) -โ”œโ”€โ”€ requirements.txt # Python ไพ่ต– (็‰ˆๆœฌ้”ๅฎš) +โ”œโ”€โ”€ service_manager.py # ๆœๅŠก็ฎก็†ๅ™จ (ๅฅๅบทๆฃ€ๆŸฅ + ๅฏๅŠจ้กบๅบ) +โ”œโ”€โ”€ requirements.txt # Python ไพ่ต– โ”œโ”€โ”€ README.md # ้กน็›ฎ่ฏดๆ˜Ž โ”œโ”€โ”€ ROADMAP.md # ๅผ€ๅ‘่ทฏ็บฟๅ›พ (ๆœฌๅœฐ) โ”œโ”€โ”€ LICENSE # Apache 2.0 -โ”œโ”€โ”€ Dockerfile # Docker ้•œๅƒ โ”‚ โ”œโ”€โ”€ sdk/ # ๆ’ไปถๅผ€ๅ‘ๅทฅๅ…ทๅŒ… -โ”‚ โ”œโ”€โ”€ plugin_command_decorator.py # @plugin_command ่ฃ…้ฅฐๅ™จ -โ”‚ โ”œโ”€โ”€ plugin_status.py # PluginStatus ๆžšไธพ (9 ็Šถๆ€) -โ”‚ โ””โ”€โ”€ plugin_error.py # PluginError ๅผ‚ๅธธๅฑ‚็บง (6 ็ฑป) +โ”‚ โ”œโ”€โ”€ plugin_command_decorator.py +โ”‚ โ”œโ”€โ”€ plugin_status.py # 9 ็Šถๆ€ๆžšไธพ +โ”‚ โ”œโ”€โ”€ plugin_error.py # 6 ๅผ‚ๅธธๅฑ‚็บง +โ”‚ โ””โ”€โ”€ plugin_web.py # Web ๆŽงๅˆถ้ขๆฟ Mixin (NEW v0.6) โ”‚ -โ”œโ”€โ”€ services/ # ๆ ธๅฟƒๆœๅŠก (15 ไธช) -โ”‚ โ”œโ”€โ”€ init_service.py # ๅˆๅง‹ๅŒ– + ่ฐƒ่ฏ•ๆœๅŠกๅ™จ่‡ชๅฏ -โ”‚ โ”œโ”€โ”€ log_service.py # ๆ—ฅๅฟ— (ๅคš่พ“ๅ‡บ, ๅˆ‡ๅ‰ฒ, TUIๆ•่Žท) -โ”‚ โ”œโ”€โ”€ tui_service.py # Textual TUI (4ๆ  + ็ณป็ปŸ็›‘ๆŽง) -โ”‚ โ”œโ”€โ”€ command_service.py # ๅ‘ฝไปค็ณป็ปŸ (ๆณจๅ†Œ/ๅކๅฒ/่กฅๅ…จ) -โ”‚ โ”œโ”€โ”€ auth_service.py # ่ฎค่ฏ (PBKDF2, Token) -โ”‚ โ”œโ”€โ”€ internet_service.py # HTTP + WebSocket -โ”‚ โ”œโ”€โ”€ plugin_service.py # ๆ’ไปถ็ฎก็† (็ƒญๅŠ ่ฝฝ, ็Šถๆ€่ฟฝ่ธช) -โ”‚ โ”œโ”€โ”€ permission_service.py # ๆƒ้™้ชŒ่ฏ (4็บง, ้€š้…็ฌฆ) -โ”‚ โ”œโ”€โ”€ api_service.py # API ็ซฏ็‚น -โ”‚ โ”œโ”€โ”€ shutdown_service.py # ไผ˜้›…ๅ…ณ้—ญ -โ”‚ โ”œโ”€โ”€ sensu_db.py # SQLite ๆŒไน…ๅŒ– (5่กจ) -โ”‚ โ”œโ”€โ”€ project_service.py # ้กน็›ฎๆณจๅ†Œ่กจ + ไพ่ต–่งฃๆž -โ”‚ โ”œโ”€โ”€ process_isolated.py # ๆ’ไปถ่ฟ›็จ‹้š”็ฆป -โ”‚ โ”œโ”€โ”€ sysmon_widget.py # TUI ็ณป็ปŸ็›‘ๆŽง็ป„ไปถ -โ”‚ โ””โ”€โ”€ web_panel/ # Web ็ฎก็†้ขๆฟ -โ”‚ โ”œโ”€โ”€ manager.py # ่ทฏ็”ฑๆณจๅ†Œ -โ”‚ โ”œโ”€โ”€ auth.py # ้ขๆฟ่ฎค่ฏ -โ”‚ โ”œโ”€โ”€ routes/ # API ่ทฏ็”ฑ (auth/status/plugins/commands/logs) -โ”‚ โ””โ”€โ”€ utils/ # ๅทฅๅ…ท (auth/system_info/response) +โ”œโ”€โ”€ services/ # ๆ ธๅฟƒๆœๅŠก (17 ไธช) +โ”‚ โ”œโ”€โ”€ init_service.py +โ”‚ โ”œโ”€โ”€ log_service.py +โ”‚ โ”œโ”€โ”€ tui_service.py # TUI + ็ณป็ปŸ็›‘ๆŽง + Tab่กฅๅ…จ +โ”‚ โ”œโ”€โ”€ command_service.py +โ”‚ โ”œโ”€โ”€ auth_service.py # PBKDF2-SHA256 +โ”‚ โ”œโ”€โ”€ internet_service.py # HTTP :4200 + WS :4240 +โ”‚ โ”œโ”€โ”€ plugin_service.py # ็ƒญๅŠ ่ฝฝ + ็Šถๆ€่ฟฝ่ธช +โ”‚ โ”œโ”€โ”€ permission_service.py +โ”‚ โ”œโ”€โ”€ api_service.py +โ”‚ โ”œโ”€โ”€ shutdown_service.py +โ”‚ โ”œโ”€โ”€ sensu_db.py # SQLite 5 ่กจ (NEW v0.3) +โ”‚ โ”œโ”€โ”€ project_engine.py # ๅผ‚ๆญฅๅญ่ฟ›็จ‹็ฎก็† (NEW v0.6) +โ”‚ โ”œโ”€โ”€ project_service.py # ้กน็›ฎๆณจๅ†Œ่กจ + ไพ่ต–่งฃๆž (NEW v0.3) +โ”‚ โ”œโ”€โ”€ proxy_service.py # ๅๅ‘ไปฃ็† HTTP+WS (NEW v0.6) +โ”‚ โ”œโ”€โ”€ pyenv_manager.py # Python็‰ˆๆœฌ+venv+git (NEW v0.6) +โ”‚ โ”œโ”€โ”€ process_isolated.py # ๆ’ไปถ่ฟ›็จ‹้š”็ฆป (NEW v0.5) +โ”‚ โ”œโ”€โ”€ sysmon_widget.py # TUI ็ณป็ปŸ็›‘ๆŽง (NEW v0.4) +โ”‚ โ””โ”€โ”€ web_panel/ # Web ็ฎก็†้ขๆฟ +โ”‚ โ”œโ”€โ”€ manager.py +โ”‚ โ”œโ”€โ”€ auth.py +โ”‚ โ””โ”€โ”€ routes/ # API ่ทฏ็”ฑ (8 ไธชๆจกๅ—) +โ”‚ โ”œโ”€โ”€ auth.py, status.py, plugins.py, commands.py, logs.py +โ”‚ โ”œโ”€โ”€ projects.py # ้กน็›ฎ็ฎก็† (NEW v0.6) +โ”‚ โ”œโ”€โ”€ proxy.py # ๅๅ‘ไปฃ็† (NEW v0.6) +โ”‚ โ””โ”€โ”€ plugin_web.py # ๆ’ไปถ้ขๆฟ (NEW v0.6) โ”‚ โ”œโ”€โ”€ bridges/ # ๆถˆๆฏๆกฅๆŽฅ -โ”‚ โ”œโ”€โ”€ core_bridge.py # ๆ ธๅฟƒๆกฅ (ๅ‘ๅธƒ-่ฎข้˜…) -โ”‚ โ”œโ”€โ”€ plugin_bridge.py # ๆ’ไปถๆกฅ (subscribe_plugin) -โ”‚ โ””โ”€โ”€ plugin_network_bridge.py # ็ฝ‘็ปœๆกฅ (setup_data_transfer, send_data) +โ”‚ โ”œโ”€โ”€ core_bridge.py +โ”‚ โ”œโ”€โ”€ plugin_bridge.py # subscribe_plugin +โ”‚ โ””โ”€โ”€ plugin_network_bridge.py โ”‚ -โ”œโ”€โ”€ plugins/ # ๆ’ไปถ็›ฎๅฝ• -โ”‚ โ””โ”€โ”€ example_plugin/ # ็คบไพ‹ๆ’ไปถ (echo, plugin_status) +โ”œโ”€โ”€ plugins/ +โ”‚ โ””โ”€โ”€ example_plugin/ # ็คบไพ‹ๆ’ไปถ (ๅ‘ฝไปค+Web้ขๆฟ+SSE) โ”‚ -โ”œโ”€โ”€ tests/ # ๆต‹่ฏ• (23 ไธช, pytest) -โ”‚ โ”œโ”€โ”€ test_auth.py -โ”‚ โ”œโ”€โ”€ test_service_manager.py -โ”‚ โ”œโ”€โ”€ test_plugin_enhancements.py -โ”‚ โ””โ”€โ”€ test_v03.py -โ”‚ -โ”œโ”€โ”€ deploy/ # ้ƒจ็ฝฒๆ–‡ไปถ -โ”‚ โ”œโ”€โ”€ sensu.service # systemd unit -โ”‚ โ””โ”€โ”€ Dockerfile -โ”‚ -โ”œโ”€โ”€ docs/ # ๆ–‡ๆกฃ -โ”‚ โ”œโ”€โ”€ SenSu ๆก†ๆžถๅŸบๆœฌๆžถๆž„.md -โ”‚ โ”œโ”€โ”€ SenSu ๆ’ไปถๅผ€ๅ‘่ฏฆ็ป†ๆŒ‡ๅ—.md -โ”‚ โ””โ”€โ”€ ้กน็›ฎๆ–‡ไปถ็ป“ๆž„.txt -โ”‚ -โ”œโ”€โ”€ config/ # ่ฟ่กŒๆ—ถ้…็ฝฎ -โ”‚ โ”œโ”€โ”€ framework/ # ๆก†ๆžถ้…็ฝฎ -โ”‚ โ”œโ”€โ”€ permissions/ # ๆƒ้™ๆ•ฐๆฎ -โ”‚ โ”œโ”€โ”€ plugins/ # ๆ’ไปถ้…็ฝฎ -โ”‚ โ””โ”€โ”€ services/ # ๆœๅŠก้…็ฝฎ -โ”‚ -โ”œโ”€โ”€ static/ # ๅ‰็ซฏ้™ๆ€่ต„ๆบ -โ”‚ โ””โ”€โ”€ web_panel/ -โ”‚ -โ”œโ”€โ”€ utils/ # ้€š็”จๅทฅๅ…ท -โ”‚ โ””โ”€โ”€ async_file_utils.py # ๅผ‚ๆญฅๆ–‡ไปถIO -โ”‚ -โ”œโ”€โ”€ templates/ # ๆ’ไปถๆจกๆฟ -โ”‚ โ””โ”€โ”€ plugin/ -โ”‚ -โ””โ”€โ”€ gui/ # GUI ๆŽฅๅฃ (้ข„็•™) - โ””โ”€โ”€ api.py +โ”œโ”€โ”€ tests/ # 28 ไธชๆต‹่ฏ• +โ”œโ”€โ”€ deploy/ # systemd + Dockerfile +โ”œโ”€โ”€ docs/ # ๅผ€ๅ‘ๆ–‡ๆกฃ + Phase ๆŠฅๅ‘Š +โ”œโ”€โ”€ static/web_panel/ # ๅ‰็ซฏ (HTML/CSS/JS) +โ”‚ โ””โ”€โ”€ pages/ # 6 ไธช WebUI ้กต้ข +โ”œโ”€โ”€ utils/, templates/, gui/ +โ””โ”€โ”€ config/ # ่ฟ่กŒๆ—ถ้…็ฝฎ