Initial commit

This commit is contained in:
liumangmang
2026-05-12 17:51:53 +08:00
commit b564ca4797
55 changed files with 6407 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
# SmartUp — API 上游管理与 Webhook 通知系统
SmartUp 是一个独立的 Web 后台,用于管理多个 API 上游的分组倍率监听,并通过 Webhook(通用 JSON / 钉钉机器人)发送变更通知。
## 功能
- **上游管理**:支持 none / bearer / api_key / 邮箱密码 四种认证方式
- **定时检测**:每个上游独立配置检测间隔,APScheduler 后台运行
- **倍率快照**:检测变化后保存快照,diff 比对历史
- **Webhook 通知**:支持通用 JSON 和钉钉机器人(带签名)
- **通知日志**:记录每次发送结果,支持筛选查看
## 技术栈
- 后端:FastAPI + SQLite + APScheduler
- 前端:Vue 3 + Element Plus + Vite
- 部署:Docker Compose 单容器
## 快速部署
### 1. 准备配置文件
```bash
cp .env.example .env
# 编辑 .env,至少填写 ADMIN_PASSWORD 和 JWT_SECRET
```
### 2. 启动
```bash
docker compose up -d --build
```
首次启动时自动:
- 创建 SQLite 数据库(`./data/app.db`
- 初始化管理员账号
### 3. 访问
打开浏览器:http://localhost:8899
默认账号:`.env` 中配置的 `ADMIN_EMAIL` / `ADMIN_PASSWORD`
## 本地开发
### 后端
```bash
cd backend
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
# 创建 .env(可复制根目录的 .env.example
cat > .env << 'EOF'
ADMIN_EMAIL=admin@smartup.local
ADMIN_PASSWORD=dev123
JWT_SECRET=dev-secret
DATABASE_URL=sqlite:///./data/app.db
EOF
mkdir -p data
uvicorn app.main:app --reload --port 8000
```
### 前端
```bash
cd frontend
npm install
npm run dev # 代理到 localhost:8000
```
## 数据备份
SQLite 数据库位于 `./data/app.db`,直接复制即可备份:
```bash
cp ./data/app.db ./data/app.db.$(date +%Y%m%d)
```
## 环境变量
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `ADMIN_EMAIL` | 管理员邮箱 | `admin@smartup.local` |
| `ADMIN_PASSWORD` | 管理员密码(必填) | — |
| `JWT_SECRET` | JWT 签名密钥 | `change-me-in-production` |
| `SERVER_PORT` | 宿主机端口 | `8899` |
| `TZ` | 时区 | `Asia/Shanghai` |
| `UNHEALTHY_THRESHOLD` | 连续失败多少次标记为异常 | `3` |
## 目录结构
```
SmartUp/
├── backend/ # FastAPI 应用
│ └── app/
│ ├── models/ # SQLAlchemy ORM
│ ├── schemas/ # Pydantic schemas
│ ├── routers/ # API 路由
│ ├── services/ # 业务逻辑(client/scheduler/webhook
│ └── utils/ # JWT / 钉钉签名
├── frontend/ # Vue 3 前端
│ └── src/
│ ├── views/ # 页面组件
│ ├── api/ # Axios 封装
│ └── stores/ # Pinia 状态
├── data/ # SQLite 数据目录(Docker volume
├── Dockerfile # 多阶段构建
├── docker-compose.yml
└── .env.example
```