126 lines
3.8 KiB
Markdown
126 lines
3.8 KiB
Markdown
# 🐱 SenSu
|
||
|
||
万能 Python TUI 项目管理器 — 插件化架构,任何项目都能挂载运行。
|
||
|
||
[](LICENSE)
|
||
[]()
|
||
|
||
---
|
||
|
||
## ✨ 特性
|
||
|
||
- 🎨 **Textual TUI** — 三栏界面 + 系统监控面板 + CLI 回退
|
||
- 🔌 **插件系统** — 热加载、权限隔离、依赖解析、进程隔离
|
||
- 🗄️ **项目注册表** — 插件声明 `project.yaml` 申请端口和资源
|
||
- 📊 **SQLite 持久化** — 插件状态、权限、审计日志统一存储
|
||
- 🌐 **Web 管理面板** — aiohttp + WebSocket,:4200 实时仪表盘
|
||
- 🔐 **安全认证** — PBKDF2-SHA256、环境变量密码、Token 管理
|
||
- 🐳 **Docker 部署** — Alpine 镜像 <100MB,systemd 服务文件
|
||
- 🧪 **23 个回归测试** — pytest,零失败
|
||
|
||
## 🚀 快速开始
|
||
|
||
```bash
|
||
# 安装依赖
|
||
pip install -r requirements.txt
|
||
|
||
# 启动 (TUI 模式)
|
||
python main.py
|
||
|
||
# 启动 (headless,适合 SSH/systemd/Docker)
|
||
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 级权限)
|
||
```
|
||
|
||
## 📁 目录结构
|
||
|
||
```
|
||
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/ # 开发文档
|
||
```
|
||
|
||
## 🔌 插件开发
|
||
|
||
```python
|
||
# plugins/my_plugin/__init__.py
|
||
from sdk.plugin_command_decorator import plugin_command
|
||
|
||
class Plugin:
|
||
def __init__(self, plugin_name=None, config=None, bridge=None):
|
||
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"])
|
||
|
||
@plugin_command(name="hello", description="打招呼")
|
||
async def cmd_hello(self, *args):
|
||
return f"Hello from {self.plugin_name}!"
|
||
|
||
async def shutdown(self):
|
||
pass
|
||
```
|
||
|
||
详细文档见 `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` | 面板密码 |
|
||
|
||
## 📄 许可证
|
||
|
||
Apache License 2.0 · Copyright 2026 AskaEth
|