Files
GoProxy/README.md
2026-03-26 21:14:16 +08:00

250 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ProxyGo
一个基于 Go 的轻量代理池服务。程序会从公开代理源抓取 HTTP/SOCKS5 代理,验证可用性后写入 SQLite并对外暴露一个统一的本地 HTTP 代理入口,同时提供带登录的 Web 管理后台。
## 功能概览
- 启动时自动抓取并验证代理
- 后台定时抓取新代理
- 后台定时健康检查,自动清理不可用代理
- 聚合 HTTP 和 SOCKS5 上游代理,对外统一提供 HTTP 代理端口
- 支持普通 HTTP 请求和 HTTPS `CONNECT` 隧道转发
- 内置 WebUI支持查看统计、筛选代理、删除代理、手动触发抓取、查看日志、修改部分运行参数
- 使用 SQLite 持久化代理池数据
## 项目结构
```text
.
├── main.go # 程序入口
├── config/ # 默认配置、配置加载与保存
├── fetcher/ # 代理源抓取
├── validator/ # 代理可用性验证
├── checker/ # 周期健康检查
├── storage/ # SQLite 存储
├── proxy/ # 对外 HTTP 代理服务
├── webui/ # 登录页、仪表盘、API
├── logger/ # 内存日志 + stdout 输出
├── Dockerfile
└── docker-compose.yml
```
## 运行要求
- Go `1.25`
- 需要可用的 CGO 编译环境
- 项目依赖 `github.com/mattn/go-sqlite3`
- 本地构建通常需要 `gcc` / Xcode Command Line Tools
## 快速开始
### 本地运行
```bash
go run .
```
或先编译再启动:
```bash
go build -o proxy-pool .
./proxy-pool
```
程序启动后会:
1. 加载默认配置或读取 `config.json`
2. 初始化 SQLite 数据库
3. 启动 WebUI
4. 立即抓取一次代理并开始验证
5. 启动定时抓取和健康检查
6.`:7777` 启动统一代理服务
### 默认端口
- 代理服务:`127.0.0.1:7777``:7777`
- WebUI`http://127.0.0.1:7778`
### 使用聚合代理
例如:
```bash
curl -x http://127.0.0.1:7777 https://httpbin.org/ip
```
也可以给命令行程序设置环境变量:
```bash
export http_proxy=http://127.0.0.1:7777
export https_proxy=http://127.0.0.1:7777
```
## Docker
### 使用 Dockerfile
```bash
docker build -t proxygo .
docker run -d \
--name proxygo \
-p 127.0.0.1:7777:7777 \
-p 7778:7778 \
-e TZ=Asia/Shanghai \
-e DATA_DIR=/app/data \
-v "$(pwd)/data:/app/data" \
proxygo
```
### 使用 docker-compose.yml
```bash
docker compose up -d --build
```
当前仓库中的 `docker-compose.yml` 有两个前提:
- 它会将 `./data` 挂载到容器内 `/app/data`
- 它依赖一个已存在的外部网络 `cursor2api_default`
如果宿主机没有这个网络,需要先创建,或者直接修改 `docker-compose.yml` 中的网络配置。
## 数据目录
程序支持通过 `DATA_DIR` 指定数据目录。
- 未设置 `DATA_DIR` 时:
- 数据库默认写到项目根目录 `proxy.db`
- 配置文件默认读取/写入项目根目录 `config.json`
- 设置 `DATA_DIR=/app/data` 时:
- 数据库路径变为 `/app/data/proxy.db`
- 配置文件路径变为 `/app/data/config.json`
## 配置说明
### 可持久化配置
当前版本只会从 `config.json` 读取并保存以下 4 个字段:
```json
{
"fetch_interval": 30,
"check_interval": 10,
"validate_concurrency": 300,
"validate_timeout": 3
}
```
字段含义:
- `fetch_interval`:定时抓取间隔,单位分钟
- `check_interval`:健康检查间隔,单位分钟
- `validate_concurrency`:并发验证数量
- `validate_timeout`:单个代理验证超时,单位秒
这些参数既可以通过编辑 `config.json` 修改,也可以在 WebUI 的“系统设置”中在线保存。
### 当前代码中的默认值
除上面 4 项外,其余配置目前来自代码默认值:
| 配置项 | 默认值 | 说明 |
| --- | --- | --- |
| `WebUIPort` | `:7778` | Web 管理后台端口 |
| `ProxyPort` | `:7777` | 对外统一代理端口 |
| `DBPath` | `proxy.db``${DATA_DIR}/proxy.db` | SQLite 数据库路径 |
| `ValidateURL` | `https://cursor.com/api/auth/me` | 验证目标地址 |
| `MaxResponseMs` | `2500` | 最大可接受延迟,毫秒 |
| `MaxFailCount` | `3` | 失败阈值字段已定义,但当前运行逻辑未完整使用 |
| `MaxRetry` | `3` | 请求失败后的重试次数 |
## WebUI
访问地址:
- `http://127.0.0.1:7778`
提供的功能:
- 登录鉴权
- 展示代理总数、HTTP 数量、SOCKS5 数量
- 按协议筛选代理
- 删除单个代理
- 手动触发抓取
- 查看最近日志
- 在线修改抓取/校验参数
### 登录密码说明
当前版本在代码里只保存了 WebUI 密码的 SHA256 哈希值,默认明文密码没有在仓库中说明,也不能通过 `config.json` 或 WebUI 修改。
如果你要自定义密码,当前可行方式是:
1. 生成密码的 SHA256
2. 修改 `config/config.go` 中的 `WebUIPasswordHash`
3. 重新构建并启动程序
例如生成 SHA256
```bash
printf 'your-password' | shasum -a 256
```
## API 概览
`/login``/logout` 外,其余管理 API 都要求已登录会话。
| 方法 | 路径 | 说明 |
| --- | --- | --- |
| `GET` | `/` | 仪表盘页面 |
| `GET/POST` | `/login` | 登录页面 / 提交登录 |
| `GET` | `/logout` | 退出登录 |
| `GET` | `/api/stats` | 代理统计信息 |
| `GET` | `/api/proxies?protocol=http` | 查询代理列表,可按协议筛选 |
| `POST` | `/api/proxy/delete` | 删除指定代理 |
| `POST` | `/api/fetch` | 手动触发一次抓取 |
| `GET` | `/api/logs` | 获取最近 200 条日志 |
| `GET/POST` | `/api/config` | 读取/保存运行参数 |
## 代理抓取与校验逻辑
当前实现会并发抓取内置代理源,然后做去重与验证:
- HTTP 源:`https://cdn.jsdelivr.net/gh/databay-labs/free-proxy-list/http.txt`
- SOCKS5 源:`https://cdn.jsdelivr.net/gh/databay-labs/free-proxy-list/socks5.txt`
- 混合源:`https://cdn.jsdelivr.net/gh/proxifly/free-proxy-list@main/proxies/all/data.txt`
验证规则:
- 仅接受 HTTP `200``204`
- 响应超时或延迟超过 `MaxResponseMs` 的代理会被丢弃
- 默认验证目标为 `https://cursor.com/api/auth/me`
## 日志
- 日志会输出到进程标准输出
- 同时会保留最近 500 条在内存中供 WebUI 展示
- `/api/logs` 当前返回最近 200 条日志
## 当前实现限制
- `config.Config` 中虽然定义了 `HTTPSourceURL``SOCKS5SourceURL`,但抓取器当前实际使用的是 `fetcher/defaultSources` 内置来源
- `config.json` 目前只持久化 4 个字段,不包含端口、密码哈希、验证 URL 等配置
- WebUI 登录密码不能在线修改
- 代理请求失败时,运行逻辑倾向于直接删除上游代理,`MaxFailCount` 目前没有完整参与主流程
- 日志没有单独写文件,管理端看到的是内存中的最近日志窗口
## 适用场景
- 在本机快速聚合一批公开代理,提供给命令行或程序统一使用
- 临时验证免费 HTTP / SOCKS5 代理的可用性
- 通过简单 Web 面板查看当前代理池状态
如果后续要继续完善,优先建议补这几项:
- 支持通过配置文件完整覆盖所有默认参数
- 支持自定义代理源并真正接入抓取器
- 支持 WebUI 密码初始化和修改
- 为失败计数、重试和删除策略补齐一致的状态流转
- 增加自动化测试