Files
GoProxy/README.md

287 lines
10 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.
# GoProxy
> **智能代理池系统** — 基于 Go 的轻量级、自适应代理池服务,支持免费代理自动抓取 + 付费订阅导入
[![Docker Hub](https://img.shields.io/docker/v/isboyjc/goproxy?label=Docker%20Hub&logo=docker)](https://hub.docker.com/r/isboyjc/goproxy)
[![GitHub Container Registry](https://img.shields.io/badge/GHCR-latest-blue?logo=github)](https://github.com/isboyjc/GoProxy/pkgs/container/goproxy)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
[![Go Version](https://img.shields.io/badge/Go-1.25-00ADD8?logo=go)](https://go.dev/)
GoProxy 从公开代理源自动抓取 HTTP/SOCKS5 代理,同时支持导入 Clash/V2ray 付费订阅,通过出口 IP + 地理位置 + 延迟三重验证后统一入池,对外提供 HTTP 和 SOCKS5 双协议代理服务。
**GitHub**[github.com/isboyjc/GoProxy](https://github.com/isboyjc/GoProxy)
![](https://cdn.amux.ai/data/1322149f78ab57adb821ce731c11a9e944504649.png)
## 核心特性
### 双池架构
- **免费代理池** — 自动从 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 + SOCKS54 端口)
├── 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)