# 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`,直接复制即可备份: > **WAL 模式说明**:启用 WAL 后,备份前请先执行 checkpoint 将 WAL 合并入主库: > ```bash > sqlite3 ./data/app.db "PRAGMA wal_checkpoint(TRUNCATE);" > ``` ```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 ```