# PyGoEdge 控制面板

基于 Python + Django + Bootstrap + MySQL 的按域名计费 CDN 加速控制面板，集成 GoEdge 管理员 API 作为底层 CDN 引擎。支持域名 CNAME 接入、配额与套餐管理、流量统计与账单、可运营的自定义管理面板。

## 主要特性

- 用户与认证：邮箱/用户名登录，用户中心与登录历史
- 域名接入：多子域名 CNAME 接入，源站配置向导，DNS 生效检测
- 套餐与功能：每域名包含流量、超量单价、功能开关（WAF、访问日志、HTTP/3、WebSocket、缓存/路径规则）
- 流量统计：日/小时流量与请求统计、带宽峰值、状态码聚合
- 计费与账单：按周期汇总套餐费与超量费用，生成账单与明细
- 运营管理：自定义运营面板（/admin-panel/），系统级默认配置、策略资源引用、异常流量检测
- GoEdge 集成：管理员 AccessKey → AccessToken 自动获取与缓存；网站创建与功能变更；日志检索
- 界面：Django 模板 + Bootstrap，Cloudflare 风格导航与模块布局

## 目录结构概览

```
pygoedge/
├─ manage.py
├─ requirements.txt
├─ .env.example / .env
├─ pygoedge_panel/
│  ├─ settings.py
│  ├─ settings/
│  │  ├─ base.py
│  │  ├─ dev.py
│  │  └─ prod.py
│  ├─ urls.py
│  ├─ wsgi.py / asgi.py
├─ core/
│  ├─ models.py (SystemSettings, OperationLog)
│  └─ goedge_client.py (GoEdge API 封装)
├─ accounts/ domains/ plans/ billing/ admin_panel/
│  └─ urls.py + views.py + models.py + templates
├─ templates/ static/
└─ ...
```

## 环境要求

- Python 3.10+（推荐 3.11）
- Django 5.2.x
- 数据库：默认 SQLite；生产推荐 MySQL 8.x
- 依赖：详见 `requirements.txt`
  - `python-dotenv`（加载 `.env`）
  - `requests`（GoEdge API）
  - `dnspython`（DNS 检测）
  - `PyMySQL`（Windows 下连接 MySQL）
  - `mysqlclient`（非 Windows 平台可选，性能更优）

## 安装与启动

### 1. 克隆与依赖安装

```
python -m venv .venv
.\.venv\Scripts\activate           # Windows
# 或 source .venv/bin/activate      # Linux/macOS
pip install -r requirements.txt
```

### 2. 配置环境变量

复制示例：

```
cp .env.example .env   # Windows 可手动复制
```

关键项：

- `DJANGO_ENV`：`dev` / `prod`
- `DJANGO_SECRET_KEY`：随机安全字符串
- `DJANGO_ALLOWED_HOSTS`：逗号分隔主机名，生产必填
- `DJANGO_CSRF_TRUSTED_ORIGINS`：例如 `https://panel.example.com`
- 数据库（默认 SQLite）：如用 MySQL，设置 `DB_ENGINE=mysql` 与连接参数
- GoEdge 管理员 API：
  - `GOEDGE_ADMIN_API_BASE_URL=https://your-goedge-host:port`
  - `GOEDGE_ACCESS_KEY_ID` / `GOEDGE_ACCESS_KEY`（用于换取 AccessToken）
  - `GOEDGE_ACCESS_TOKEN`（可选，若直接提供现成令牌）
  - `GOEDGE_DEFAULT_NODE_CLUSTER_ID`（创建站点所需集群 ID）
- 运营默认：
  - `DEFAULT_FREE_TRAFFIC_GB_PER_DOMAIN`（每域名默认免费流量，默认 15）
  - `CNAME_TEMPLATE`（CNAME 目标模板，如 `{sub}.cdn.example.com`）

`.env.example` 内容参考：

```
DJANGO_ENV=dev
DJANGO_SECRET_KEY=change-me
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1
DJANGO_DEBUG=True
DJANGO_CSRF_TRUSTED_ORIGINS=
# DB_ENGINE=mysql
# DB_NAME=pygoedge
# DB_USER=root
# DB_PASSWORD=your-password
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_CONN_MAX_AGE=60
GOEDGE_ADMIN_API_BASE_URL=https://your-goedge-host:port
GOEDGE_ACCESS_KEY_ID=your-access-key-id
GOEDGE_ACCESS_KEY=your-access-key
GOEDGE_ACCESS_TOKEN=
GOEDGE_DEFAULT_NODE_CLUSTER_ID=1
```

### 3. 初始化数据库

```
python manage.py migrate
python manage.py createsuperuser
```

如使用 MySQL：

- Windows 推荐 `PyMySQL`（已在 `requirements.txt`），无需额外编译；
- Linux/macOS 可使用 `mysqlclient` 以获得更好性能（确保 MySQL 开发库已安装）。

### 4. 启动开发服务

```
python manage.py runserver 0.0.0.0:8000
```

生产环境请结合反向代理（如 NGINX）与 WSGI/ASGI 服务部署，并在 `DJANGO_ENV=prod` 下启用安全项与静态资源收集：

```
python manage.py collectstatic
```

## 运营配置

### 管理入口

- Django 管理后台：`/admin/`
- 自定义运营面板：`/admin-panel/`

### SystemSettings（系统设置）

通过 Django Admin → SystemSettings 配置下列项：

- `goedge_base_url`：GoEdge 管理员 API 基础地址（与 `.env` 中 `GOEDGE_ADMIN_API_BASE_URL` 一致）
- `admin_access_key_id` / `admin_access_key`：管理员 AccessKey，用于自动获取 AccessToken
- `edge_access_token` / `edge_token_expires_at`：AccessToken 缓存与过期时间（自动维护）
- `default_node_cluster_id`：创建站点使用的节点集群 ID（可被 `.env` 覆盖）
- `default_free_traffic_gb_per_domain`：每域名默认免费流量（默认 15GB）
- `default_overage_policy`：超量策略（允许访问/限速/停服等 JSON 配置）
- `cname_template`：CNAME 目标模板（如 `{sub}.cdn.example.com`）
- 默认策略引用：`default_http_access_log_policy_id` / `default_http_firewall_policy_id`
- 异常流量检测：开关、阈值倍数、窗口天数、最小触发 GB
- 易支付预留：`epay_api_base_url`、`epay_pid`、`epay_key`

### GoEdge 集成说明

- 令牌策略：优先使用有效 `edge_access_token`；过期或缺失时用 AccessKey 获取并缓存
- 站点创建：`ServerService/createBasicHTTPServer` 或 `ServerService/createServer`（httpProxy）
- 功能同步：访问日志 / WebSocket / WAF / HTTP/3 / 缓存 / 路径规则 / 重写 / HTTPS 跳转 / 防盗链 / 客户端 IP / 停服 / 请求限速
- 统计读取：日/小时请求数、带宽峰值；访问日志分页检索与状态码聚合

## 业务功能与页面

- `/accounts/`：账号注册 / 登录 / 资料 / 登录历史
- `/domains/`：域名列表与接入向导（子域名、源站、套餐、生成 CNAME、DNS 检测）
- `/domains/<id>/`：域名详情（概览、统计、接入信息、功能设置）
- `/plans/`：套餐列表与升级（公开套餐对比）
- `/billing/`：账单列表与详情（套餐费、超量费用、调整）
- `/admin-panel/`：运营后台（系统设置、套餐管理、用户与域名管理、配额调整、计费与风控）

## 任务与定时（建议）

通过系统任务计划（Linux `cron` / Windows 任务计划）周期运行：

- 拉取每日统计：
  - `python manage.py pull_daily_stats`
- 拉取流量数据：
  - `python manage.py pull_traffic`
- 账单生成（周期结束时触发）：
  - `python manage.py generate_invoices`
- 演示数据初始化（可选）：
  - `python manage.py seed_demo_data`

建议频率：

- 每日统计：每小时或每日
- 流量拉取：每日 1 次（或按需更频繁）
- 账单生成：每月周期结束时运行

## 开发与部署建议

- 开发环境：`DJANGO_ENV=dev`、`DEBUG=True`，`ALLOWED_HOSTS=*`
- 生产环境：`DJANGO_ENV=prod`、`DEBUG=False`，明确 `DJANGO_ALLOWED_HOSTS` 与 `CSRF_TRUSTED_ORIGINS`
- 静态文件：生产执行 `collectstatic`，由前置代理服务静态目录 `STATIC_ROOT`
- 数据库连接复用：设置 `DB_CONN_MAX_AGE=60`（或更高）提高性能
- 安全：不在前端暴露任何 GoEdge AccessToken；所有变更走后端 API；关键操作写入 OperationLog

## 常见问题

- Windows 下 MySQL 连接：默认使用 `PyMySQL`，无需编译；如需 `mysqlclient`，请确保编译环境与 MySQL 开发库完整
- AccessToken 获取失败：检查 `GOEDGE_ADMIN_API_BASE_URL`、`GOEDGE_ACCESS_KEY_ID`、`GOEDGE_ACCESS_KEY` 是否正确，网络与证书是否可达
- 节点集群 ID 未配置：在 SystemSettings 或 `.env` 中填写 `GOEDGE_DEFAULT_NODE_CLUSTER_ID`
- CSRF 相关错误：生产环境设置 `DJANGO_CSRF_TRUSTED_ORIGINS` 与正确的 `ALLOWED_HOSTS`

## 许可证

暂未指定，按企业内部或项目需要补充。