SmartUp Developer ad16618406 fix: address multiple code audit findings
- CORS: replace wildcard with explicit origin list from CORS_ORIGINS env
- Auth: enforce strong defaults, JWT blacklist (RevokedToken model), login rate limiting
- Auth: validate password length before bcrypt (72-byte limit)
- Scheduler: single-threaded worker to mitigate SQLite write contention
- Scheduler: graceful shutdown (wait=True)
- Snapshots: add prune_snapshots() with configurable retention count
- Storage: isolate localStorage keys via VITE_APP_KEY prefix
- Config: add cors_origins, login_rate_limit, snapshot_retention_count settings
2026-05-17 10:52:18 +08:00
2026-05-15 16:18:01 +08:00
2026-05-12 17:58:24 +08:00

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. 准备配置文件

cp .env.example .env
# 编辑 .env,至少填写 ADMIN_PASSWORD 和 JWT_SECRET

2. 启动

docker compose up -d --build

首次启动时自动:

  • 创建 SQLite 数据库(./data/app.db
  • 初始化管理员账号

3. 访问

打开浏览器:http://localhost:8899

默认账号:.env 中配置的 ADMIN_EMAIL / ADMIN_PASSWORD

本地开发

后端

cd backend
python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
playwright install chromium

# 创建 .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

前端

cd frontend
npm install
npm run dev   # 代理到 localhost:8000

数据备份

SQLite 数据库位于 ./data/app.db,直接复制即可备份:

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
BROWSER_PROFILES_DIR 远程浏览器登录态/profile 存储目录 /app/data/browser-profiles
BROWSER_HEADLESS 远程浏览器是否无头运行 true

目录结构

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
S
Description
No description provided
Readme 14 MiB
Languages
Python 64.3%
Vue 28.2%
TypeScript 3.3%
CSS 2.1%
JavaScript 1.1%
Other 1%