mirror of
https://github.com/isboyjc/GoProxy.git
synced 2026-05-06 20:02:54 +08:00
287 lines
10 KiB
Markdown
287 lines
10 KiB
Markdown
# GoProxy
|
||
|
||
> **智能代理池系统** — 基于 Go 的轻量级、自适应代理池服务,支持免费代理自动抓取 + 付费订阅导入
|
||
|
||
[](https://hub.docker.com/r/isboyjc/goproxy)
|
||
[](https://github.com/isboyjc/GoProxy/pkgs/container/goproxy)
|
||
[](LICENSE)
|
||
[](https://go.dev/)
|
||
|
||
GoProxy 从公开代理源自动抓取 HTTP/SOCKS5 代理,同时支持导入 Clash/V2ray 付费订阅,通过出口 IP + 地理位置 + 延迟三重验证后统一入池,对外提供 HTTP 和 SOCKS5 双协议代理服务。
|
||
|
||
**GitHub**:[github.com/isboyjc/GoProxy](https://github.com/isboyjc/GoProxy)
|
||
|
||

|
||
|
||
## 核心特性
|
||
|
||
### 双池架构
|
||
|
||
- **免费代理池** — 自动从 20+ 公开源抓取,质量分级(S/A/B/C),智能补充与替换
|
||
- **订阅代理池** — 导入 Clash/V2ray 订阅,通过 sing-box 自动转换加密协议(vmess/vless/trojan/ss/hysteria2/anytls 等)为本地 SOCKS5 代理
|
||
- **5 种使用模式** — 混合·订阅优先 / 混合·免费优先 / 混合·平等 / 仅订阅 / 仅免费,WebUI 随时切换
|
||
|
||
### 智能池子管理
|
||
|
||
- **固定容量 + 动态状态** — Healthy → Warning → Critical → Emergency 四级自适应
|
||
- **严格准入** — 出口 IP + 地理位置 + 延迟验证,HTTP 代理额外验证 HTTPS CONNECT 隧道
|
||
- **自动优化** — 按需抓取(Emergency/Refill/Optimize 三模式),定时替换慢代理
|
||
- **故障自愈** — 请求失败自动切换代理重试(最多 3 次),用户无感知
|
||
|
||
### 订阅管理
|
||
|
||
- **格式自动识别** — Clash YAML / V2ray 链接 / Base64 / 纯文本,无需手动选格式
|
||
- **sing-box 内置** — Docker 镜像自带 sing-box,加密协议节点自动转为本地 SOCKS5
|
||
- **软删除机制** — 订阅代理失败不删除只禁用,定时探测唤醒恢复
|
||
- **访客贡献** — 未登录用户可贡献订阅 URL/文件,管理员统一管理
|
||
- **自动清理** — 连续 7 天无可用节点的订阅自动移除
|
||
|
||
### 多端口多协议
|
||
|
||
| 端口 | 协议 | 模式 | 适用场景 |
|
||
|------|------|------|---------|
|
||
| 7777 | HTTP | 随机轮换 | 爬虫、数据采集、IP 多样性 |
|
||
| 7776 | HTTP | 最低延迟 | 长连接、流媒体、稳定优先 |
|
||
| 7779 | SOCKS5 | 随机轮换 | 浏览器、SSH、游戏 |
|
||
| 7780 | SOCKS5 | 最低延迟 | 稳定应用、固定连接 |
|
||
| 7778 | HTTP | WebUI | 管理面板(双角色权限) |
|
||
|
||
### WebUI 仪表盘
|
||
|
||
- 免费池 / 订阅池分离展示,实时状态监控
|
||
- 订阅管理:添加 URL / 上传文件 / 刷新 / 暂停 / 删除
|
||
- 系统设置:5 种代理模式切换、池子参数、地理过滤
|
||
- 双角色权限:访客只读 + 管理员完全控制
|
||
- 中英文切换
|
||
|
||
## 快速开始
|
||
|
||
### Docker 部署(推荐)
|
||
|
||
```bash
|
||
# 一键启动(自动拉取最新镜像)
|
||
docker compose up -d
|
||
|
||
# 访问 WebUI
|
||
# http://localhost:7778(默认密码:goproxy)
|
||
```
|
||
|
||
自定义配置:
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
vim .env # 修改密码、认证、地理过滤等
|
||
docker compose up -d
|
||
```
|
||
|
||
### 本地运行
|
||
|
||
```bash
|
||
# 需要 Go 1.25 + CGO(依赖 go-sqlite3)
|
||
go run .
|
||
|
||
# 或编译后运行
|
||
go build -o proxygo . && ./proxygo
|
||
```
|
||
|
||
> 如需订阅导入功能,本地需安装 [sing-box](https://sing-box.sagernet.org/):`brew install sing-box`
|
||
|
||
## 使用代理
|
||
|
||
### HTTP 代理
|
||
|
||
```bash
|
||
# 随机轮换(IP 多样性)
|
||
curl -x http://localhost:7777 https://httpbin.org/ip
|
||
|
||
# 最低延迟(稳定优先)
|
||
curl -x http://localhost:7776 https://httpbin.org/ip
|
||
|
||
# 环境变量方式
|
||
export http_proxy=http://localhost:7777
|
||
export https_proxy=http://localhost:7777
|
||
```
|
||
|
||
### SOCKS5 代理
|
||
|
||
```bash
|
||
# 随机轮换
|
||
curl --socks5 localhost:7779 https://httpbin.org/ip
|
||
|
||
# 最低延迟
|
||
curl --socks5 localhost:7780 https://httpbin.org/ip
|
||
|
||
# 环境变量方式
|
||
export ALL_PROXY=socks5://localhost:7779
|
||
```
|
||
|
||
### 带认证使用
|
||
|
||
```bash
|
||
# HTTP
|
||
curl -x http://user:pass@your-server:7777 https://httpbin.org/ip
|
||
|
||
# SOCKS5
|
||
curl --socks5 user:pass@your-server:7779 https://httpbin.org/ip
|
||
|
||
# 环境变量
|
||
export http_proxy=http://user:pass@your-server:7777
|
||
export ALL_PROXY=socks5://user:pass@your-server:7779
|
||
```
|
||
|
||
### 编程语言示例
|
||
|
||
**Python**:
|
||
```python
|
||
import requests
|
||
|
||
# HTTP 代理
|
||
proxies = {'http': 'http://localhost:7777', 'https': 'http://localhost:7777'}
|
||
requests.get('https://httpbin.org/ip', proxies=proxies)
|
||
|
||
# SOCKS5 代理(需 pip install requests[socks])
|
||
proxies = {'http': 'socks5://localhost:7779', 'https': 'socks5://localhost:7779'}
|
||
requests.get('https://httpbin.org/ip', proxies=proxies)
|
||
```
|
||
|
||
**Node.js**:
|
||
```javascript
|
||
// SOCKS5(需 npm install socks-proxy-agent node-fetch)
|
||
const { SocksProxyAgent } = require('socks-proxy-agent');
|
||
const fetch = require('node-fetch');
|
||
const agent = new SocksProxyAgent('socks5://localhost:7779');
|
||
fetch('https://httpbin.org/ip', { agent }).then(r => r.json()).then(console.log);
|
||
```
|
||
|
||
**浏览器 / SSH**:
|
||
```bash
|
||
# 浏览器:设置 → 代理 → SOCKS5 → localhost:7779
|
||
# SSH 隧道:
|
||
ssh -o ProxyCommand='nc -X 5 -x localhost:7779 %h %p' user@remote-server
|
||
```
|
||
|
||
## 订阅导入
|
||
|
||
通过 WebUI 管理订阅(管理员登录后):
|
||
|
||
1. **订阅 URL** — 填入 Clash/V2ray 订阅地址,自动识别格式并解析
|
||
2. **上传文件** — 拖拽或选择 Clash YAML / V2ray 配置文件
|
||
|
||
支持的节点协议:vmess、vless、trojan、shadowsocks、hysteria2、anytls、http、socks5
|
||
|
||
订阅代理与免费代理的区别:
|
||
- 健康检查失败 → 禁用(不删除),定时探测唤醒
|
||
- 不受免费池 slot 容量限制
|
||
- 地理过滤 → 禁用(不删除)
|
||
- 连续 7 天无可用节点 → 自动移除订阅
|
||
|
||
访客可通过顶部「贡献订阅」按钮分享自己的订阅 URL 或配置文件。
|
||
|
||
## Docker 部署详解
|
||
|
||
### docker run 方式
|
||
|
||
```bash
|
||
docker run -d --name proxygo \
|
||
-p 7776:7776 -p 7777:7777 -p 7778:7778 -p 7779:7779 -p 7780:7780 \
|
||
-e WEBUI_PASSWORD=your_password \
|
||
-e PROXY_AUTH_ENABLED=true \
|
||
-e PROXY_AUTH_USERNAME=myuser \
|
||
-e PROXY_AUTH_PASSWORD=mypass \
|
||
-v goproxy-data:/app/data \
|
||
ghcr.io/isboyjc/goproxy:latest
|
||
```
|
||
|
||
### 数据持久化
|
||
|
||
- docker-compose 使用 Named Volume `goproxy-data`,容器重启/更新不丢数据
|
||
- 数据包含:SQLite 数据库(代理池)、config.json(配置)、sing-box 配置
|
||
|
||
**备份**:
|
||
```bash
|
||
docker run --rm -v goproxy-data:/data -v $(pwd):/backup \
|
||
alpine tar czf /backup/goproxy-backup-$(date +%Y%m%d).tar.gz -C /data .
|
||
```
|
||
|
||
**恢复**:
|
||
```bash
|
||
docker compose down
|
||
docker run --rm -v goproxy-data:/data -v $(pwd):/backup \
|
||
alpine sh -c "cd /data && tar xzf /backup/goproxy-backup-*.tar.gz"
|
||
docker compose up -d
|
||
```
|
||
|
||
### 安全建议
|
||
|
||
| 场景 | 建议 |
|
||
|------|------|
|
||
| 公网部署 | 启用代理认证 + 修改 WebUI 密码 |
|
||
| 内网部署 | 启用代理认证 或 防火墙白名单 |
|
||
| 本地测试 | 默认配置即可 |
|
||
|
||
## 环境变量
|
||
|
||
| 变量 | 默认值 | 必须 | 说明 |
|
||
|------|--------|------|------|
|
||
| `WEBUI_PASSWORD` | `goproxy` | 是 | WebUI 登录密码,生产环境务必修改 |
|
||
| `PROXY_AUTH_ENABLED` | `false` | 否 | 代理认证开关,公网部署建议启用 |
|
||
| `PROXY_AUTH_USERNAME` | `proxy` | 否 | 代理认证用户名 |
|
||
| `PROXY_AUTH_PASSWORD` | 空 | 否 | 代理认证密码,启用认证时必填 |
|
||
| `BLOCKED_COUNTRIES` | `CN` | 否 | 屏蔽国家代码(逗号分隔,留空不屏蔽) |
|
||
| `ALLOWED_COUNTRIES` | 空 | 否 | 允许国家白名单(非空时优先于黑名单) |
|
||
| `CUSTOM_PROXY_MODE` | `mixed` | 否 | 代理模式:mixed / custom_only / free_only |
|
||
| `SINGBOX_PATH` | `sing-box` | 否 | sing-box 路径(Docker 内置,无需修改) |
|
||
| `TZ` | `Asia/Shanghai` | 否 | 时区 |
|
||
|
||
完整配置见 [.env.example](.env.example),更多池子参数可通过 WebUI 设置面板调整。
|
||
|
||
## 项目结构
|
||
|
||
```text
|
||
main.go # 入口,协调所有模块
|
||
├── config/ # 配置(环境变量 + config.json)
|
||
├── storage/ # SQLite 持久化(proxies + subscriptions + source_status)
|
||
├── fetcher/ # 多源代理抓取 + 断路器
|
||
├── validator/ # 代理验证(连接 + IP + 地理 + 延迟)
|
||
├── pool/ # 池子管理(准入 + 替换 + 状态机)
|
||
├── checker/ # 健康检查(free 删除 / custom 禁用)
|
||
├── optimizer/ # 质量优化(仅免费池)
|
||
├── custom/ # 订阅管理
|
||
│ ├── parser.go # 格式自动识别解析
|
||
│ ├── singbox.go # sing-box 进程管理
|
||
│ └── manager.go # 刷新循环 + 探测唤醒 + 过期清理
|
||
├── proxy/ # 代理服务(HTTP + SOCKS5,4 端口)
|
||
├── webui/ # 管理面板(嵌入式 HTML + REST API)
|
||
└── logger/ # 日志收集
|
||
```
|
||
|
||
## 扩展文档
|
||
|
||
- [架构设计文档](POOL_DESIGN.md) — 状态机、数据模型、选择策略、sing-box 集成
|
||
- [地理过滤配置](GEO_FILTER.md) — 国家代码、白名单/黑名单、测试方法
|
||
- [数据目录说明](DATA_DIRECTORY.md) — 数据库、配置文件、备份恢复
|
||
- [测试脚本](test/README.md) — HTTP + SOCKS5 测试脚本
|
||
- [更新日志](CHANGELOG.md) — 版本历史
|
||
|
||
## 免责声明
|
||
|
||
本项目仅供学习交流和技术研究使用。
|
||
|
||
- 本项目抓取的代理均来自互联网公开资源,不保证其可用性、稳定性和安全性
|
||
- 用户应自行承担使用本项目的一切风险,包括但不限于网络安全风险、法律风险等
|
||
- 请遵守当地法律法规,不得将本项目用于任何违法违规活动
|
||
- 订阅导入功能仅为方便用户管理自有代理资源,用户应确保其订阅来源合法合规
|
||
- 访客贡献的订阅由贡献者自行负责,项目维护者不对其内容承担任何责任
|
||
- 本项目不提供任何形式的代理服务,不对通过本系统传输的内容负责
|
||
- 作者不对因使用本项目造成的任何直接或间接损失承担责任
|
||
|
||
使用本项目即表示您已阅读并同意以上声明。
|
||
|
||
## 友情链接
|
||
|
||
- [LINUX DO](https://linux.do/) — 真诚、友善、团结、专业,共建你我引以为傲的社区
|
||
|
||
## License
|
||
|
||
[MIT](LICENSE)
|