Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
effb950
refactor: 将项目从ProxyPool重命名为NetHub并新增服务实例源管理功能
siruoren Jul 18, 2026
d95971e
feat(web): 添加服务实例源的Tab展示和可用统计
siruoren Jul 18, 2026
961021b
refactor(database&scheduler): 重构代理清理逻辑与实例源处理流程
siruoren Jul 18, 2026
52b5ed3
refactor: 优化代理检测逻辑与订阅输出规则
siruoren Jul 18, 2026
936c80f
refactor: 项目重命名为NetHub并重构节点检测逻辑
siruoren Jul 19, 2026
f2e2b8b
feat(scheduler): add auto add subscription from service instance
siruoren Jul 19, 2026
5950a62
fix: 调整订阅输出逻辑,仅保留订阅源节点并新增实例源去重逻辑
siruoren Jul 19, 2026
2c31f24
feat: 添加实例源订阅手工导入功能并过滤内部nethub订阅源
siruoren Jul 19, 2026
59b46bb
feat: 新增内核转发检测能力,重构连通性检测逻辑
siruoren Jul 19, 2026
5a4dcd5
build(docker): 移除Xray相关的下载安装步骤
siruoren Jul 19, 2026
decdce1
build(docker): 优化Docker镜像构建流程
siruoren Jul 19, 2026
005686c
build(docker): 调整Python依赖安装顺序到镜像构建早期
siruoren Jul 19, 2026
b429950
build(docker): 更新镜像源和核心组件版本
siruoren Jul 19, 2026
1e78c8d
build: 更新geosite和geoip数据文件版本
siruoren Jul 19, 2026
c7eb9bc
build(docker): 移除Dockerfile中的GH_MIRROR镜像变量
siruoren Jul 19, 2026
71fd314
build(Dockerfile): 替换官方下载源为国内代理地址
siruoren Jul 19, 2026
1aef577
build(Dockerfile): 简化下载数据文件的镜像构建步骤
siruoren Jul 19, 2026
7ca3287
feat: add plain text subscription endpoint and include instance proxi…
siruoren Jul 20, 2026
0b27d68
fix(scheduler): 调整订阅源清理的无节点天数阈值
siruoren Jul 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 19 additions & 19 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,30 @@ All notable changes to this project will be documented in this file.

- **订阅源管理** - 数据库驱动的订阅源增删改查,支持独立配置 Crontab、延迟阈值、重试次数和最大并发数
- **Crontab 定时拉取** - 每个订阅源支持独立的 Crontab 表达式,通过 APScheduler CronTrigger 实现精准调度
- **HTTP 延迟检测** - 通过代理发起 HTTP 请求到多个目标 URL 检测延迟,取多目标最大延迟值作为结果
- **HTTP 延迟检测** - 通过节点发起 HTTP 请求到多个目标 URL 检测延迟,取多目标最大延迟值作为结果
- **检测目标动态配置** - 检测目标 URL 存入数据库,页面可增删,修改后即时生效
- **多协议解析** - 支持 vmess / vless / trojan / ss / hysteria2 五种协议的订阅解析和 Clash 配置生成
- **对外订阅输出** - 提供 V2Ray(base64)和 Clash(YAML)格式订阅,仅包含当前可用代理
- **对外订阅输出** - 提供核心(base64)和 Clash(YAML)格式订阅,仅包含当前可用节点
- **自动添加订阅 API** - `POST /api/subscriptions/auto` 接口支持仅传 URL 自动创建订阅并触发拉取验证

### 代理管理
### 节点管理

- **独立延迟检测** - 每个代理独立测试延迟,报错自动跳过
- **延迟阈值过滤** - 延迟低于阈值自动入库,超标代理累加失败计数
- **连续失败清理** - 连续 3 次验证失败的代理自动移除
- **空订阅清理** - 连续 30 天代理数为 0 的订阅源自动删除
- **按订阅源分组** - 可用代理按订阅源分组,Tab 切换查看
- **延迟与入库时间排序** - 每个订阅源的代理列表支持延迟和入库时间升降序排序
- **独立延迟检测** - 每个节点独立测试延迟,报错自动跳过
- **延迟阈值过滤** - 延迟低于阈值自动入库,超标节点累加失败计数
- **连续失败清理** - 连续 3 次验证失败的节点自动移除
- **空订阅清理** - 连续 30 天节点数为 0 的订阅源自动删除
- **按订阅源分组** - 可用节点按订阅源分组,Tab 切换查看
- **延迟与入库时间排序** - 每个订阅源的节点列表支持延迟和入库时间升降序排序

### Web 界面

- **单页面管理** - 订阅源管理和可用代理列表合并为一个页面,无跳转
- **协议分布饼状图** - Chart.js 环形图动态展示各协议代理数量和百分比
- **单页面管理** - 订阅源管理和可用节点列表合并为一个页面,无跳转
- **协议分布饼状图** - Chart.js 环形图动态展示各协议节点数量和百分比
- **订阅源状态** - 实时显示每个订阅源的拉取状态(更新中/成功/失败/待更新)
- **启用/禁用切换** - 状态列点击切换启用与禁用,启用后自动拉取并验证
- **编辑弹窗** - 操作列仅保留编辑按钮,删除功能移至编辑弹窗内
- **订阅地址提示** - 鼠标悬停订阅 ID 行或 Tab 标签时通过 Tooltip 显示订阅地址
- **可用代理 Tab 过滤** - 仅显示有可用代理的订阅源标签页
- **可用节点 Tab 过滤** - 仅显示有可用节点的订阅源标签页

### 运维特性

Expand All @@ -44,15 +44,15 @@ All notable changes to this project will be documented in this file.

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/proxies` | 可用代理列表 |
| GET | `/api/proxies/all` | 所有代理 |
| DELETE | `/api/proxies/{id}` | 删除代理 |
| GET | `/api/subscription/v2ray` | V2Ray 订阅 |
| GET | `/api/proxies` | 可用节点列表 |
| GET | `/api/proxies/all` | 所有节点 |
| DELETE | `/api/proxies/{id}` | 删除节点 |
| GET | `/api/subscription/v2ray` | 核心订阅 |
| GET | `/api/subscription/clash` | Clash 订阅 |
| POST | `/api/fetch` | 拉取所有订阅 |
| POST | `/api/fetch/{sub_id}` | 拉取指定订阅 |
| POST | `/api/verify` | 验证所有代理 |
| POST | `/api/verify/{sub_id}` | 验证指定订阅代理 |
| POST | `/api/verify` | 验证所有节点 |
| POST | `/api/verify/{sub_id}` | 验证指定订阅节点 |
| GET | `/api/stats` | 统计信息 |
| GET | `/api/health` | 健康检查 |
| GET | `/api/subscriptions` | 订阅源列表 |
Expand All @@ -63,4 +63,4 @@ All notable changes to this project will be documented in this file.
| GET | `/api/check-urls` | 检测目标 URL 列表 |
| POST | `/api/check-urls` | 添加检测目标 URL |
| DELETE | `/api/check-urls/{url_id}` | 删除检测目标 URL |
| GET | `/api/proxies/grouped` | 按订阅来源分组的可用代理 |
| GET | `/api/proxies/grouped` | 按订阅来源分组的可用节点 |
29 changes: 29 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,16 +1,45 @@
FROM python:3.11-slim

# GitHub 下载镜像前缀(国内构建可设为 https://ghgo.xyz/ 等)
ARG GH_MIRROR="https://github.geekery.cn/"

WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
curl \
unzip \
&& rm -rf /var/lib/apt/lists/*


# 安装 Python 依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt


# 下载核心(固定版本 + 超时重试)
# v2ray-core v5.23.0
RUN curl -fsSL --connect-timeout 30 --max-time 180 --retry 3 --retry-delay 5 \
"${GH_MIRROR}https://github.com/v2fly/v2ray-core/releases/download/v5.51.2/v2ray-linux-64.zip" \
-o /tmp/core.zip \
&& unzip -o /tmp/core.zip -d /usr/local/bin/ v2ray \
&& chmod +x /usr/local/bin/v2ray \
&& rm -f /tmp/core.zip

# Xray-core v25.7.16
RUN curl -fsSL --connect-timeout 30 --max-time 180 --retry 3 --retry-delay 5 \
"${GH_MIRROR}https://github.com/XTLS/Xray-core/releases/download/v26.7.11/Xray-macos-64.zip" \
-o /tmp/xray.zip \
&& unzip -o /tmp/xray.zip -d /usr/local/bin/ xray \
&& chmod +x /usr/local/bin/xray \
&& rm -f /tmp/xray.zip

# 下载 geosite.dat / geoip.dat 数据文件
RUN curl -fsSL --connect-timeout 30 "https://ghp.keleyaa.com/https://github.com/v2fly/domain-list-community/releases/download/20260717032527/dlc.dat" -o /usr/local/bin/geosite.dat
RUN curl -fsSL --connect-timeout 30 "https://gitproxy.mrhjx.cn/https://github.com/v2fly/geoip/releases/download/202607171233/geoip.dat" -o /usr/local/bin/geoip.dat


# 复制代码
COPY . .

Expand Down
46 changes: 23 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
# ProxyPool v1.0.0
# NetHub v1.0.0

自动获取、检测、维护代理节点池,提供 Web 管理界面和订阅链接输出。
自动获取、检测、维护节点池,提供 Web 管理界面和订阅链接输出。

## 功能特性

- **订阅源管理** - 数据库驱动的增删改查,每个订阅源独立配置 Crontab、延迟阈值、重试次数、并发数
- **Crontab 定时拉取** - 每个订阅源支持 5 位 Crontab 表达式精准调度
- **HTTP 延迟检测** - 模拟通过代理访问目标网站,测量完整请求延迟(DNS + TCP + TLS + HTTP),多目标取最大值
- **HTTP 延迟检测** - 模拟通过节点访问目标网站,测量完整请求延迟(DNS + TCP + TLS + HTTP),多目标取最大值
- **检测目标动态配置** - 检测目标 URL 存入数据库,页面可增删,修改即时生效,无需外部文件
- **多协议支持** - vmess / vless / trojan / ss / hysteria2 解析与 Clash 配置生成
- **自动清理** - 连续 3 次验证失败的代理自动移除;连续 30 天无代理的订阅源自动删除
- **单页面管理** - 订阅源管理 + 可用代理列表在同一页面,按订阅源 Tab 切换
- **协议分布图** - 饼状图动态展示各协议代理数量和百分比
- **订阅输出** - 仅输出当前可用代理,支持 V2Ray(base64)和 Clash(YAML)格式
- **自动清理** - 连续 3 次验证失败的节点自动移除;连续 30 天无节点的订阅源自动删除
- **单页面管理** - 订阅源管理 + 可用节点列表在同一页面,按订阅源 Tab 切换
- **协议分布图** - 饼状图动态展示各协议节点数量和百分比
- **订阅输出** - 仅输出当前可用节点,支持核心格式(base64)和 Clash(YAML)格式
- **日志归档** - 按天自动归档,自动清理 7 天前的日志
- **Docker 部署** - Docker Compose 一键启动

Expand Down Expand Up @@ -63,7 +63,7 @@ check:

scheduler:
fetch_interval: 3600 # 拉取订阅间隔(秒)
verify_interval: 1800 # 验证代理间隔(秒)
verify_interval: 1800 # 验证节点间隔(秒)
cleanup_interval: 7200 # 清理间隔(秒)
max_fail_count: 3 # 最大连续失败次数
```
Expand All @@ -79,20 +79,20 @@ scheduler:

## API 接口

### 代理
### 节点

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/proxies` | 可用代理列表 |
| GET | `/api/proxies/all` | 所有代理 |
| GET | `/api/proxies/grouped` | 按订阅来源分组的可用代理 |
| DELETE | `/api/proxies/{id}` | 删除代理 |
| GET | `/api/proxies` | 可用节点列表 |
| GET | `/api/proxies/all` | 所有节点 |
| GET | `/api/proxies/grouped` | 按订阅来源分组的可用节点 |
| DELETE | `/api/proxies/{id}` | 删除节点 |

### 订阅输出

| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/subscription/v2ray` | V2Ray 格式订阅(base64) |
| GET | `/api/subscription/v2ray` | 核心格式订阅(base64) |
| GET | `/api/subscription/clash` | Clash 格式订阅(YAML) |

### 订阅源管理
Expand All @@ -111,8 +111,8 @@ scheduler:
|------|------|------|
| POST | `/api/fetch` | 拉取所有订阅 |
| POST | `/api/fetch/{sub_id}` | 拉取指定订阅 |
| POST | `/api/verify` | 验证所有代理 |
| POST | `/api/verify/{sub_id}` | 验证指定订阅代理 |
| POST | `/api/verify` | 验证所有节点 |
| POST | `/api/verify/{sub_id}` | 验证指定订阅节点 |

### 检测目标

Expand All @@ -131,12 +131,12 @@ scheduler:

## 订阅链接使用

在代理客户端中添加以下订阅链接
在节点客户端中添加以下订阅链接

- **V2Ray**: `http://your-server:8080/api/subscription/v2ray`
- **核心**: `http://your-server:8080/api/subscription/v2ray`
- **Clash**: `http://your-server:8080/api/subscription/clash`

> 订阅内容仅包含延迟低于阈值的可用代理,随代理池自动更新
> 订阅内容仅包含延迟低于阈值的可用节点,随节点池自动更新

## 支持协议

Expand All @@ -150,10 +150,10 @@ scheduler:

## 延迟检测原理

延迟检测模拟真实上网场景:通过代理服务器访问目标检测 URL,测量完整请求延迟。
延迟检测模拟真实上网场景:通过转发服务访问目标检测 URL,测量完整请求延迟。

```
客户端 → 代理服务器 → 目标网站
客户端 → 转发服务 → 目标网站
├── DNS 解析
├── TCP 连接建立
├── TLS 握手(HTTPS 目标)
Expand All @@ -176,14 +176,14 @@ proxy_pool/
│ ├── models.py # 数据模型(ProxyInfo / ProxyDBRecord / SubscriptionRecord)
│ ├── parser.py # 订阅拉取 & 解析(5 协议)
│ ├── checker.py # HTTP 延迟检测(多目标取最大值)
│ ├── generator.py # V2Ray / Clash 订阅生成
│ ├── generator.py # 核心 / Clash 订阅生成
│ ├── scheduler.py # APScheduler 定时任务调度
│ ├── routers/
│ │ ├── api.py # REST API 路由
│ │ └── web.py # Web 页面路由
│ └── templates/
│ ├── base.html # 基础模板
│ ├── index.html # 主页面(管理 + 代理列表
│ ├── index.html # 主页面(管理 + 节点列表
│ └── subscription.html # 订阅链接页
├── logs/ # 日志目录(自动归档)
├── config.yaml # 配置文件
Expand Down
8 changes: 6 additions & 2 deletions app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,9 @@ def create_app(config_path: str = "config.yaml") -> FastAPI:

# 创建 FastAPI 实例
app = FastAPI(
title="ProxyPool",
title="NetHub",
version="1.0.0",
description="代理池管理系统",
description="节点池管理系统",
)

# 注册生命周期事件
Expand All @@ -116,6 +116,10 @@ async def startup():
check_urls=check_urls,
timeout=_config.check.timeout,
max_concurrent=_config.check.max_concurrent,
socks_port=_config.check.socks_port,
http_port=_config.check.http_port,
check_mode=_config.check.check_mode,
kernel_path=_config.check.kernel_path,
)

# 初始化调度器
Expand Down
Loading
Loading