一个基于 Go 的轻量代理池服务。程序会从公开代理源抓取 HTTP/SOCKS5 代理,验证可用性后写入 SQLite,并对外暴露一个统一的本地 HTTP 代理入口,同时提供带登录的 Web 管理后台。
- 启动时自动抓取并验证代理
- 后台定时抓取新代理
- 后台定时健康检查,自动清理不可用代理
- 聚合 HTTP 和 SOCKS5 上游代理,对外统一提供 HTTP 代理端口
- 支持普通 HTTP 请求和 HTTPS
CONNECT隧道转发 - 内置 WebUI,支持查看统计、筛选代理、删除代理、手动触发抓取、查看日志、修改部分运行参数
- 使用 SQLite 持久化代理池数据
.
├── 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
- 项目依赖
go run .或先编译再启动:
go build -o proxy-pool .
./proxy-pool程序启动后会:
- 加载默认配置或读取
config.json - 初始化 SQLite 数据库
- 启动 WebUI
- 立即抓取一次代理并开始验证
- 启动定时抓取和健康检查
- 在
:7777启动统一代理服务
- 代理服务:
127.0.0.1:7777或:7777 - WebUI:
http://127.0.0.1:7778
例如:
curl -x http://127.0.0.1:7777 https://httpbin.org/ip也可以给命令行程序设置环境变量:
export http_proxy=http://127.0.0.1:7777
export https_proxy=http://127.0.0.1:7777docker 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" \
proxygodocker 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 个字段:
{
"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 |
请求失败后的重试次数 |
访问地址:
http://127.0.0.1:7778
提供的功能:
- 登录鉴权
- 展示代理总数、HTTP 数量、SOCKS5 数量
- 按协议筛选代理
- 删除单个代理
- 手动触发抓取
- 查看最近日志
- 在线修改抓取/校验参数
默认密码为 proxygo,程序启动时会在日志中提示。
可通过环境变量 WEBUI_PASSWORD 自定义密码:
# 本地运行
WEBUI_PASSWORD=your-password go run .
# Docker
docker run -e WEBUI_PASSWORD=your-password ...也可以在 docker-compose.yml 的 environment 中添加:
- WEBUI_PASSWORD=your-password除 /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 密码初始化和修改
- 为失败计数、重试和删除策略补齐一致的状态流转
- 增加自动化测试
认可 LINUX DO