mirror of
https://github.com/isboyjc/GoProxy.git
synced 2026-05-06 20:02:54 +08:00
feat: ✨ update README and remove Docker setup documentation; reorganize testing guides and add new sections for data directory and GitHub Actions CI/CD
This commit is contained in:
153
.github/DOCKER_SETUP.md
vendored
153
.github/DOCKER_SETUP.md
vendored
@@ -1,153 +0,0 @@
|
||||
# GitHub Actions Docker 镜像自动构建配置
|
||||
|
||||
本项目使用 GitHub Actions 自动构建并推送 Docker 镜像到多个镜像仓库。
|
||||
|
||||
## 📦 自动构建触发条件
|
||||
|
||||
- **Push to main 分支**:自动构建 `latest` 标签
|
||||
- **推送版本标签**(如 `v1.0.0`):自动构建版本标签(`1.0.0`, `1.0`, `1`, `latest`)
|
||||
- **手动触发**:在 GitHub Actions 页面手动运行
|
||||
|
||||
## 🔧 配置 GitHub Secrets
|
||||
|
||||
### GitHub Container Registry(默认已配置)✅
|
||||
|
||||
GitHub Container Registry (ghcr.io) **无需任何配置**,workflow 会自动推送:
|
||||
|
||||
- **镜像地址**:`ghcr.io/isboyjc/goproxy`
|
||||
- **认证方式**:自动使用 `GITHUB_TOKEN`
|
||||
- **推送策略**:每次构建都会推送
|
||||
|
||||
### Docker Hub 配置(可选)⚙️
|
||||
|
||||
Docker Hub 配置是**可选的**,如果不配置,workflow 会自动跳过 Docker Hub 推送,**不会影响 GHCR 构建**。
|
||||
|
||||
**如需推送到 Docker Hub**,按以下步骤配置:
|
||||
|
||||
1. 登录 [Docker Hub](https://hub.docker.com/)
|
||||
2. 在 **Account Settings > Security** 创建 Access Token
|
||||
3. 在 GitHub 仓库的 **Settings > Secrets and variables > Actions** 添加:
|
||||
- `DOCKERHUB_USERNAME`: 你的 Docker Hub 用户名
|
||||
- `DOCKERHUB_TOKEN`: 刚才创建的 Access Token
|
||||
|
||||
配置完成后,workflow 会同时推送到两个仓库:
|
||||
- `docker.io/isboyjc/goproxy`
|
||||
- `ghcr.io/isboyjc/goproxy`
|
||||
|
||||
## 🏗️ 构建特性
|
||||
|
||||
- ✅ **多架构支持**:`linux/amd64`、`linux/arm64`
|
||||
- ✅ **多标签发布**:`latest`、版本号(如 `1.0.0`、`1.0`、`1`)
|
||||
- ✅ **双仓库推送**:Docker Hub + GitHub Container Registry
|
||||
- ✅ **构建缓存**:使用 GitHub Actions 缓存加速构建
|
||||
|
||||
## 📋 使用镜像
|
||||
|
||||
### 从 Docker Hub 拉取
|
||||
|
||||
```bash
|
||||
docker pull isboyjc/goproxy:latest
|
||||
docker run -d \
|
||||
--name proxygo \
|
||||
-p 127.0.0.1:7776:7776 \
|
||||
-p 127.0.0.1:7777:7777 \
|
||||
-p 7778:7778 \
|
||||
-e WEBUI_PASSWORD=your_password \
|
||||
-v "$(pwd)/data:/app/data" \
|
||||
isboyjc/goproxy:latest
|
||||
```
|
||||
|
||||
### 从 GitHub Container Registry 拉取
|
||||
|
||||
```bash
|
||||
docker pull ghcr.io/isboyjc/goproxy:latest
|
||||
docker run -d \
|
||||
--name proxygo \
|
||||
-p 127.0.0.1:7776:7776 \
|
||||
-p 127.0.0.1:7777:7777 \
|
||||
-p 7778:7778 \
|
||||
-e WEBUI_PASSWORD=your_password \
|
||||
-v "$(pwd)/data:/app/data" \
|
||||
ghcr.io/isboyjc/goproxy:latest
|
||||
```
|
||||
|
||||
### 使用特定版本
|
||||
|
||||
```bash
|
||||
# 使用特定版本号
|
||||
docker pull ghcr.io/isboyjc/goproxy:1.0.0
|
||||
|
||||
# 使用主版本号(自动获取最新的 1.x.x)
|
||||
docker pull ghcr.io/isboyjc/goproxy:1
|
||||
```
|
||||
|
||||
## 🚀 发布新版本
|
||||
|
||||
创建并推送版本标签即可触发自动构建:
|
||||
|
||||
```bash
|
||||
# 创建版本标签
|
||||
git tag -a v1.0.0 -m "Release version 1.0.0"
|
||||
|
||||
# 推送标签到 GitHub
|
||||
git push origin v1.0.0
|
||||
```
|
||||
|
||||
GitHub Actions 会自动:
|
||||
1. 构建多架构镜像
|
||||
2. 推送到 Docker Hub 和 GHCR
|
||||
3. 创建多个标签(`1.0.0`, `1.0`, `1`, `latest`)
|
||||
|
||||
## 🌐 端口绑定说明
|
||||
|
||||
默认示例使用 `127.0.0.1:7776` 和 `127.0.0.1:7777`(仅本地访问):
|
||||
|
||||
- **场景**:在部署机器上本地使用代理
|
||||
- **安全**:最安全,代理服务不对外暴露
|
||||
- **限制**:其他机器无法使用该代理
|
||||
|
||||
**如需对外开放代理服务**(局域网/VPS 多机共享),修改端口绑定:
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
--name proxygo \
|
||||
-p 7776:7776 \ # ⚠️ 改为对外开放(无认证)
|
||||
-p 7777:7777 \ # ⚠️ 改为对外开放(无认证)
|
||||
-p 7778:7778 \
|
||||
-e WEBUI_PASSWORD=strong_password \
|
||||
-v "$(pwd)/data:/app/data" \
|
||||
ghcr.io/isboyjc/goproxy:latest
|
||||
```
|
||||
|
||||
**⚠️ 安全警告**:
|
||||
- 代理服务本身**无认证机制**,对外开放后任何人都可使用
|
||||
- 建议配合**防火墙白名单**或**云安全组**限制访问 IP
|
||||
- WebUI 有登录认证,可以安全对外开放
|
||||
|
||||
更多部署场景说明,请查看 [README - 部署场景配置](../README.md#部署场景配置)
|
||||
|
||||
---
|
||||
|
||||
## 🔄 构建策略
|
||||
|
||||
Workflow 使用**分离构建策略**:
|
||||
|
||||
1. **GHCR 构建**(总是执行):
|
||||
- 无需任何配置,自动推送到 `ghcr.io/isboyjc/goproxy`
|
||||
- 使用内置的 `GITHUB_TOKEN`
|
||||
- 即使 Docker Hub 未配置也不受影响
|
||||
|
||||
2. **Docker Hub 构建**(可选):
|
||||
- 仅在配置了 `DOCKERHUB_USERNAME` 和 `DOCKERHUB_TOKEN` secrets 时执行
|
||||
- 未配置时自动跳过,不会报错
|
||||
|
||||
**优势**:
|
||||
- ✅ 零配置即可使用(通过 GHCR)
|
||||
- ✅ Docker Hub 完全可选
|
||||
- ✅ 构建失败不会影响另一个仓库
|
||||
|
||||
## 📝 注意事项
|
||||
|
||||
- **权限配置**:首次推送到 GHCR 可能需要在仓库 **Settings > Actions > General** 中设置 **Workflow permissions** 为 `Read and write permissions`
|
||||
- **GHCR 可见性**:默认镜像为私有,可在 **Packages** 页面修改为公开
|
||||
- **Docker Hub 可选**:不配置 Docker Hub secrets 不会影响构建,workflow 会自动跳过
|
||||
32
.github/workflows/docker-image.yml
vendored
32
.github/workflows/docker-image.yml
vendored
@@ -25,14 +25,24 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
uses: docker/setup-qemu-action@v3.2.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v3.7.1
|
||||
|
||||
- name: Check for Docker Hub credentials
|
||||
id: dockerhub-check
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "${{ secrets.DOCKERHUB_USERNAME }}" != '' ]; then
|
||||
echo "available=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "available=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Extract metadata for GHCR
|
||||
id: meta-ghcr
|
||||
uses: docker/metadata-action@v5
|
||||
uses: docker/metadata-action@v5.5.1
|
||||
with:
|
||||
images: ${{ env.REGISTRY_GHCR }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
@@ -44,8 +54,8 @@ jobs:
|
||||
|
||||
- name: Extract metadata for Docker Hub
|
||||
id: meta-dockerhub
|
||||
if: secrets.DOCKERHUB_USERNAME != ''
|
||||
uses: docker/metadata-action@v5
|
||||
if: steps.dockerhub-check.outputs.available == 'true'
|
||||
uses: docker/metadata-action@v5.5.1
|
||||
with:
|
||||
images: ${{ env.REGISTRY_DOCKERHUB }}/${{ env.IMAGE_NAME }}
|
||||
tags: |
|
||||
@@ -56,8 +66,8 @@ jobs:
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: github.event_name != 'pull_request' && secrets.DOCKERHUB_USERNAME != ''
|
||||
uses: docker/login-action@v3
|
||||
if: github.event_name != 'pull_request' && steps.dockerhub-check.outputs.available == 'true'
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY_DOCKERHUB }}
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
@@ -65,14 +75,14 @@ jobs:
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v3.3.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY_GHCR }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push to GHCR
|
||||
uses: docker/build-push-action@v5
|
||||
uses: docker/build-push-action@v6.9.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
@@ -83,8 +93,8 @@ jobs:
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Build and push to Docker Hub
|
||||
if: github.event_name != 'pull_request' && secrets.DOCKERHUB_USERNAME != ''
|
||||
uses: docker/build-push-action@v5
|
||||
if: github.event_name != 'pull_request' && steps.dockerhub-check.outputs.available == 'true'
|
||||
uses: docker/build-push-action@v6.9.0
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
|
||||
212
DATA_DIRECTORY.md
Normal file
212
DATA_DIRECTORY.md
Normal file
@@ -0,0 +1,212 @@
|
||||
# Data 目录说明
|
||||
|
||||
`data/` 目录用于存储 GoProxy 的所有运行时数据和配置。
|
||||
|
||||
## 📁 目录内容
|
||||
|
||||
### 1. SQLite 数据库文件
|
||||
|
||||
**`proxy.db`** - 主数据库文件(约 1-10MB,取决于池子大小)
|
||||
|
||||
包含两张表:
|
||||
|
||||
**`proxies` 表**:代理池数据
|
||||
- 代理地址、协议类型
|
||||
- 出口 IP、地理位置
|
||||
- 延迟、质量等级
|
||||
- 使用统计(使用次数、成功次数、失败次数)
|
||||
- 状态信息(active/degraded/candidate_replace)
|
||||
- 时间戳(最后使用、最后检查、创建时间)
|
||||
|
||||
**`source_status` 表**:代理源状态
|
||||
- 源 URL
|
||||
- 成功/失败次数、连续失败次数
|
||||
- 最后成功/失败时间
|
||||
- 状态(active/degraded/disabled)
|
||||
- 禁用到期时间
|
||||
|
||||
### 2. SQLite WAL 模式文件
|
||||
|
||||
**`proxy.db-shm`** - 共享内存文件(临时)
|
||||
- WAL 模式的索引文件
|
||||
- 进程运行时存在,停止后可能自动删除
|
||||
|
||||
**`proxy.db-wal`** - 预写日志文件(临时)
|
||||
- 存储未提交的数据库事务
|
||||
- checkpoint 后会合并到主数据库
|
||||
- 提高并发性能
|
||||
|
||||
### 3. 配置文件
|
||||
|
||||
**`config.json`** - 运行时配置(通过 WebUI 修改的配置)
|
||||
|
||||
包含:
|
||||
- 池子容量配置(max_size、http_ratio、min_per_protocol)
|
||||
- 延迟标准配置(max_latency_*)
|
||||
- 验证配置(concurrency、timeout)
|
||||
- 健康检查配置(interval、batch_size)
|
||||
- 优化配置(interval、replace_threshold)
|
||||
|
||||
> 💡 **注意**:`config.json` 是运行时生成的,首次启动时不存在,使用默认配置。通过 WebUI 修改配置后会自动保存到此文件。
|
||||
|
||||
## 🐳 Docker 挂载
|
||||
|
||||
### 为什么需要挂载 data 目录?
|
||||
|
||||
**持久化数据**:
|
||||
- 容器重启/更新后代理池数据不丢失
|
||||
- 配置修改持久保存
|
||||
- 源状态(断路器)持续跟踪
|
||||
|
||||
**不挂载的后果**:
|
||||
- ❌ 每次重启都需要重新抓取代理(耗时、耗资源)
|
||||
- ❌ WebUI 的配置修改会丢失
|
||||
- ❌ 源的失败记录清零(可能重复尝试失效源)
|
||||
|
||||
### Docker Compose 配置
|
||||
|
||||
```yaml
|
||||
volumes:
|
||||
- ${DATA_DIR:-./data}:/app/data
|
||||
```
|
||||
|
||||
**说明**:
|
||||
- 宿主机目录:`./data`(docker-compose.yml 所在目录下)
|
||||
- 容器内路径:`/app/data`
|
||||
- 首次启动会自动创建 `data/` 目录
|
||||
|
||||
### Docker Run 配置
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-v "$(pwd)/data:/app/data" \ # 挂载 data 目录
|
||||
-e DATA_DIR=/app/data \ # 告诉程序数据目录位置
|
||||
ghcr.io/isboyjc/goproxy:latest
|
||||
```
|
||||
|
||||
## 📊 数据大小
|
||||
|
||||
根据池子配置,预计文件大小:
|
||||
|
||||
| 池子大小 | proxy.db | proxy.db-wal | config.json | 总计 |
|
||||
|---------|----------|--------------|-------------|------|
|
||||
| 50 个代理 | ~1 MB | ~200 KB | ~500 B | ~1.2 MB |
|
||||
| 100 个代理 | ~2 MB | ~400 KB | ~500 B | ~2.4 MB |
|
||||
| 200 个代理 | ~4 MB | ~800 KB | ~500 B | ~4.8 MB |
|
||||
| 500 个代理 | ~10 MB | ~2 MB | ~500 B | ~12 MB |
|
||||
|
||||
> 💡 **注意**:WAL 文件大小会动态变化,checkpoint 后会重置。
|
||||
|
||||
## 🔍 查看数据
|
||||
|
||||
### 查看数据库内容
|
||||
|
||||
```bash
|
||||
# 进入 data 目录
|
||||
cd data/
|
||||
|
||||
# 查看所有代理
|
||||
sqlite3 proxy.db "SELECT address, protocol, exit_location, latency, quality_grade FROM proxies LIMIT 10;"
|
||||
|
||||
# 查看质量分布
|
||||
sqlite3 proxy.db "SELECT quality_grade, COUNT(*) FROM proxies GROUP BY quality_grade;"
|
||||
|
||||
# 查看国家分布
|
||||
sqlite3 proxy.db "SELECT SUBSTR(exit_location, 1, 2) AS country, COUNT(*) FROM proxies GROUP BY country ORDER BY COUNT(*) DESC;"
|
||||
|
||||
# 查看源状态
|
||||
sqlite3 proxy.db "SELECT url, status, consecutive_fails, last_success FROM source_status;"
|
||||
```
|
||||
|
||||
### 查看配置文件
|
||||
|
||||
```bash
|
||||
cat data/config.json | jq .
|
||||
```
|
||||
|
||||
如果还没有通过 WebUI 修改配置,这个文件可能不存在(使用默认配置)。
|
||||
|
||||
## 🧹 清理数据
|
||||
|
||||
### 重置代理池(保留配置)
|
||||
|
||||
```bash
|
||||
# 仅清空代理表
|
||||
sqlite3 data/proxy.db "DELETE FROM proxies;"
|
||||
|
||||
# 或删除整个数据库(下次启动重新创建)
|
||||
rm -f data/proxy.db*
|
||||
```
|
||||
|
||||
### 完全重置(包括配置)
|
||||
|
||||
```bash
|
||||
# 删除整个 data 目录
|
||||
rm -rf data/
|
||||
|
||||
# 下次启动会自动创建并使用默认配置
|
||||
```
|
||||
|
||||
### Docker 容器重置
|
||||
|
||||
```bash
|
||||
# 停止并删除容器
|
||||
docker compose down
|
||||
|
||||
# 删除数据卷
|
||||
rm -rf data/
|
||||
|
||||
# 重新启动(全新环境)
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## 🔒 备份数据
|
||||
|
||||
### 手动备份
|
||||
|
||||
```bash
|
||||
# 备份整个 data 目录
|
||||
tar -czf goproxy-backup-$(date +%Y%m%d).tar.gz data/
|
||||
|
||||
# 或仅备份数据库
|
||||
cp data/proxy.db backups/proxy-$(date +%Y%m%d).db
|
||||
```
|
||||
|
||||
### 定时备份脚本
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup.sh
|
||||
|
||||
BACKUP_DIR="backups"
|
||||
DATE=$(date +%Y%m%d-%H%M%S)
|
||||
|
||||
mkdir -p $BACKUP_DIR
|
||||
cp data/proxy.db "$BACKUP_DIR/proxy-$DATE.db"
|
||||
|
||||
# 保留最近 7 天的备份
|
||||
find $BACKUP_DIR -name "proxy-*.db" -mtime +7 -delete
|
||||
|
||||
echo "✅ 备份完成: $BACKUP_DIR/proxy-$DATE.db"
|
||||
```
|
||||
|
||||
### 恢复数据
|
||||
|
||||
```bash
|
||||
# 停止服务
|
||||
docker compose down
|
||||
|
||||
# 恢复数据库
|
||||
cp backups/proxy-20260328.db data/proxy.db
|
||||
|
||||
# 重启服务
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
1. **WAL 文件**:停止服务前会自动 checkpoint,无需手动处理
|
||||
2. **并发安全**:多个容器不要共享同一个 data 目录(SQLite 不支持多进程写入)
|
||||
3. **权限问题**:确保容器有权限读写 data 目录
|
||||
4. **备份时机**:建议在服务停止时备份,避免数据不一致
|
||||
5. **迁移数据**:直接复制整个 data 目录到新服务器即可
|
||||
42
README.md
42
README.md
@@ -64,10 +64,11 @@ GoProxy 从多个公开代理源自动抓取 HTTP/SOCKS5 代理,通过严格
|
||||
|
||||
### 📝 扩展文档
|
||||
|
||||
- [Docker 镜像发布配置](.github/DOCKER_SETUP.md) - GitHub Actions CI/CD 设置
|
||||
- [地理过滤配置指南](GEO_FILTER.md) - 国家代码、使用场景、测试方法
|
||||
- [认证功能测试](test/AUTH_TEST.md) - 代理认证测试和多语言客户端示例
|
||||
- [基础功能测试](test/TEST_GUIDE.md) - 测试脚本使用指南
|
||||
- [数据目录说明](DATA_DIRECTORY.md) - 数据库、配置文件、备份恢复
|
||||
- [代理认证测试](test/AUTH_TEST.md) - 代理认证测试和多语言客户端示例
|
||||
- [测试脚本使用](test/README.md) - Bash/Go/Python 测试脚本详细说明
|
||||
- [架构设计文档](POOL_DESIGN.md) - 完整的系统设计和实现细节
|
||||
|
||||
## 📦 项目结构
|
||||
|
||||
@@ -91,15 +92,17 @@ GoProxy 从多个公开代理源自动抓取 HTTP/SOCKS5 代理,通过严格
|
||||
│ ├── test_proxy.sh # Bash 测试脚本
|
||||
│ ├── test_proxy.go # Go 测试脚本
|
||||
│ ├── test_proxy.py # Python 测试脚本
|
||||
│ ├── TEST_GUIDE.md # 基础功能测试指南
|
||||
│ └── AUTH_TEST.md # 🆕 认证功能测试指南
|
||||
├── .github/ # 🆕 GitHub Actions CI/CD
|
||||
│ ├── workflows/docker-image.yml # 自动构建多架构镜像
|
||||
│ └── DOCKER_SETUP.md # Docker 镜像发布配置指南
|
||||
│ ├── README.md # 测试脚本使用说明
|
||||
│ └── AUTH_TEST.md # 认证功能测试指南
|
||||
├── .github/workflows/
|
||||
│ └── docker-image.yml # 🆕 GitHub Actions 自动构建(多平台镜像)
|
||||
├── .env.example # 🆕 环境变量配置模板
|
||||
├── docker-compose.yml # 🆕 Docker Compose 配置(自动更新镜像)
|
||||
├── Dockerfile # Docker 构建文件
|
||||
├── data/ # 🆕 数据目录(SQLite 数据库、配置文件)
|
||||
│ └── .gitkeep # 目录占位符和说明
|
||||
├── GEO_FILTER.md # 🆕 地理过滤配置指南
|
||||
├── DATA_DIRECTORY.md # 🆕 数据目录说明文档
|
||||
├── POOL_DESIGN.md # 完整架构设计文档
|
||||
└── README.md # 本文件
|
||||
```
|
||||
@@ -223,8 +226,25 @@ export https_proxy=http://proxy:your_password@192.168.1.100:7777
|
||||
|
||||
## 🐳 Docker 部署
|
||||
|
||||
> 💡 **自动构建**:GitHub Actions 自动构建多架构镜像(amd64/arm64),支持 Docker Hub 和 GHCR 双仓库推送。
|
||||
> 详细配置说明请查看 [`.github/DOCKER_SETUP.md`](.github/DOCKER_SETUP.md)
|
||||
> 💡 **自动构建**:GitHub Actions 自动构建多架构镜像(linux/amd64、linux/arm64),默认推送到 GHCR,可选推送到 Docker Hub
|
||||
> 💾 **数据持久化**:必须挂载 `data/` 目录以保存代理池数据和配置,详见 [`DATA_DIRECTORY.md`](DATA_DIRECTORY.md)
|
||||
|
||||
### 🔄 GitHub Actions 自动构建
|
||||
|
||||
项目配置了自动化 CI/CD 流程:
|
||||
|
||||
**触发条件**:
|
||||
- 推送到 `main` 分支 → 构建 `latest` 标签
|
||||
- 推送版本标签(如 `v1.0.0`)→ 构建多个版本标签(`1.0.0`, `1.0`, `1`, `latest`)
|
||||
- 手动触发(workflow_dispatch)
|
||||
|
||||
**镜像仓库**:
|
||||
- **GHCR**(默认):`ghcr.io/isboyjc/goproxy` - 零配置,自动推送
|
||||
- **Docker Hub**(可选):`docker.io/isboyjc/goproxy` - 需配置 secrets:
|
||||
- `DOCKERHUB_USERNAME` - Docker Hub 用户名
|
||||
- `DOCKERHUB_TOKEN` - Docker Hub Access Token
|
||||
|
||||
**工作流程文件**:[`.github/workflows/docker-image.yml`](.github/workflows/docker-image.yml)
|
||||
|
||||
### 快速启动(推荐)
|
||||
|
||||
@@ -951,7 +971,7 @@ curl -x http://127.0.0.1:7777 https://httpbin.org/ip
|
||||
```
|
||||
|
||||
**更多测试指南**:
|
||||
- 基础功能测试:[`test/TEST_GUIDE.md`](./test/TEST_GUIDE.md)
|
||||
- 基础功能测试:[`test/README.md`](./test/README.md)
|
||||
- 认证功能测试:[`test/AUTH_TEST.md`](./test/AUTH_TEST.md)
|
||||
|
||||
## 🙏 致谢与声明
|
||||
|
||||
@@ -1,245 +0,0 @@
|
||||
# GoProxy 测试指南
|
||||
|
||||
本项目提供了三种测试脚本,用于验证代理服务的功能和性能。所有脚本都采用**持续运行模式**(类似 `ping` 命令),按 `Ctrl+C` 停止并显示统计信息。
|
||||
|
||||
## 📋 测试脚本说明
|
||||
|
||||
所有测试脚本位于 `test/` 目录下。
|
||||
|
||||
### 1. Bash 脚本(推荐)- `test_proxy.sh`
|
||||
|
||||
最简单直接,使用 `curl` 命令持续测试代理服务。
|
||||
|
||||
**使用方法:**
|
||||
|
||||
```bash
|
||||
# 测试随机轮换模式(默认 7777 端口)
|
||||
./test/test_proxy.sh
|
||||
|
||||
# 测试最低延迟模式(7776 端口)
|
||||
./test/test_proxy.sh 7776
|
||||
|
||||
# 自定义端口
|
||||
./test/test_proxy.sh 8080
|
||||
```
|
||||
|
||||
**特点:**
|
||||
- 无需安装依赖(仅需 curl 和 Python3)
|
||||
- 兼容 macOS 和 Linux
|
||||
- 持续运行,按 Ctrl+C 停止
|
||||
- 显示国旗 emoji 和出口 IP
|
||||
|
||||
---
|
||||
|
||||
### 2. Go 脚本 - `test_proxy.go`
|
||||
|
||||
使用 Go 语言编写,与项目本身技术栈一致。
|
||||
|
||||
**使用方法:**
|
||||
|
||||
```bash
|
||||
# 测试随机轮换模式(默认 7777 端口)
|
||||
go run test/test_proxy.go
|
||||
|
||||
# 测试最低延迟模式(7776 端口)
|
||||
go run test/test_proxy.go 7776
|
||||
|
||||
# 自定义端口
|
||||
go run test/test_proxy.go 8080
|
||||
|
||||
# 或编译后运行
|
||||
cd test && go build -o test_proxy test_proxy.go
|
||||
./test_proxy 7776
|
||||
```
|
||||
|
||||
**特点:**
|
||||
- 与项目技术栈统一
|
||||
- 可编译为独立二进制
|
||||
- 显示国旗 emoji 和出口 IP
|
||||
- 持续运行,按 Ctrl+C 停止
|
||||
- 彩色输出
|
||||
|
||||
---
|
||||
|
||||
### 3. Python 脚本 - `test_proxy.py`
|
||||
|
||||
使用 Python 编写,语法简洁易读。
|
||||
|
||||
**使用方法:**
|
||||
|
||||
```bash
|
||||
# 安装依赖
|
||||
pip install requests
|
||||
|
||||
# 测试随机轮换模式(默认 7777 端口)
|
||||
python test/test_proxy.py
|
||||
|
||||
# 测试最低延迟模式(7776 端口)
|
||||
python test/test_proxy.py 7776
|
||||
|
||||
# 自定义端口
|
||||
python test/test_proxy.py 8080
|
||||
```
|
||||
|
||||
**特点:**
|
||||
- Python 生态丰富
|
||||
- 易于扩展和修改
|
||||
- 持续运行,按 Ctrl+C 停止
|
||||
- 显示国旗 emoji 和出口 IP
|
||||
|
||||
---
|
||||
|
||||
## 🎯 测试输出示例
|
||||
|
||||
```
|
||||
PROXY 127.0.0.1:7777 (http://ip-api.com/json/?fields=countryCode,query): continuous mode
|
||||
|
||||
proxy from 🇺🇸 203.0.113.45: seq=1 time=1234ms
|
||||
proxy from 🇩🇪 198.51.100.78: seq=2 time=987ms
|
||||
proxy from 🇬🇧 192.0.2.123: seq=3 time=1567ms
|
||||
proxy from 🇺🇸 203.0.113.45: seq=4 time=1123ms
|
||||
proxy #5: request failed (timeout)
|
||||
proxy from 🇯🇵 198.51.100.12: seq=6 time=890ms
|
||||
proxy from 🇫🇷 192.0.2.234: seq=7 time=1456ms
|
||||
proxy from 🇨🇳 68.71.249.153: seq=8 time=1102ms
|
||||
...
|
||||
^C
|
||||
---
|
||||
50 requests transmitted, 47 received, 3 failed, 6.0% packet loss
|
||||
```
|
||||
|
||||
**特点:**
|
||||
- ✅ 简洁输出,类似 `ping` 命令
|
||||
- ✅ 一行一个结果,清晰易读
|
||||
- ✅ 显示国旗 emoji、出口 IP 和延迟
|
||||
- ✅ 按 Ctrl+C 停止并显示统计摘要
|
||||
- ✅ 显示丢包率(失败率)
|
||||
|
||||
## 🔍 观察要点
|
||||
|
||||
### 1. 出口 IP 变化
|
||||
- 每次请求的出口 IP **应该不同**,证明代理池在轮换
|
||||
- 如果连续多次是同一个 IP,说明池子中可用代理较少
|
||||
- 持续运行可以观察到代理的循环使用模式
|
||||
|
||||
### 2. 延迟表现
|
||||
- 延迟应该在合理范围内(通常 < 2000ms)
|
||||
- 如果延迟过高或超时,说明代理质量下降
|
||||
- 观察延迟趋势:是否稳定在某个范围
|
||||
|
||||
### 3. 成功率(动态显示)
|
||||
- 正常情况下成功率应该 > 90%
|
||||
- 持续运行时成功率会动态更新
|
||||
- 如果成功率持续下降,需要检查:
|
||||
- 代理池是否有足够的健康代理
|
||||
- 网络连接是否正常
|
||||
- 代理源质量是否下降
|
||||
|
||||
### 4. 协议对比
|
||||
- HTTP 代理:速度通常较快,兼容性好
|
||||
- SOCKS5 代理:更底层,可传输各种协议数据
|
||||
|
||||
### 5. 持续测试优势
|
||||
- 可以长时间运行,观察代理池的稳定性
|
||||
- 实时监控成功率变化
|
||||
- 按 Ctrl+C 随时查看统计结果
|
||||
- 类似 `ping` 命令的使用体验
|
||||
|
||||
## 📊 配合 WebUI 监控
|
||||
|
||||
测试时可以同时打开 WebUI (http://localhost:7778):
|
||||
|
||||
1. **代理列表**:查看正在使用的代理
|
||||
2. **使用统计**:观察 `使用次数` 列的变化
|
||||
3. **系统日志**:实时查看代理请求日志
|
||||
4. **质量分布**:查看当前池子的质量分布
|
||||
|
||||
## ⚙️ 自定义配置
|
||||
|
||||
修改脚本顶部的配置变量:
|
||||
|
||||
```bash
|
||||
PROXY_HOST="127.0.0.1" # 代理服务地址
|
||||
PROXY_PORT="7777" # 代理服务端口
|
||||
TEST_URL="http://httpbin.org/ip" # 测试目标 URL
|
||||
DELAY=1 # 每次请求间隔(秒)
|
||||
```
|
||||
|
||||
**注意**:所有脚本现在都是持续运行模式,按 `Ctrl+C` 停止,无需配置请求次数。
|
||||
|
||||
## 🛠️ 高级测试
|
||||
|
||||
### 测试特定网站
|
||||
|
||||
```bash
|
||||
# 测试访问 Google
|
||||
curl -x "http://127.0.0.1:7777" https://www.google.com
|
||||
|
||||
# 测试访问 GitHub API
|
||||
curl -x "http://127.0.0.1:7777" https://api.github.com/users/github
|
||||
|
||||
# 测试中国网站
|
||||
curl -x "http://127.0.0.1:7777" https://www.baidu.com
|
||||
```
|
||||
|
||||
### 并发压力测试
|
||||
|
||||
```bash
|
||||
# 使用 ab (Apache Bench) 进行压力测试
|
||||
ab -n 100 -c 10 -X 127.0.0.1:7777 http://httpbin.org/ip
|
||||
|
||||
# 使用 wrk 进行压力测试
|
||||
wrk -t4 -c100 -d30s --proxy http://127.0.0.1:7777 http://httpbin.org/ip
|
||||
```
|
||||
|
||||
### 查看当前使用的代理
|
||||
|
||||
```bash
|
||||
# 通过 httpbin 获取当前出口 IP
|
||||
curl -x "http://127.0.0.1:7777" http://httpbin.org/ip
|
||||
|
||||
# 获取更详细的信息(包括 headers)
|
||||
curl -x "http://127.0.0.1:7777" http://httpbin.org/anything
|
||||
```
|
||||
|
||||
## 📝 注意事项
|
||||
|
||||
1. **启动代理服务**:测试前确保 `goproxy` 已启动
|
||||
```bash
|
||||
./goproxy
|
||||
```
|
||||
|
||||
2. **等待代理池就绪**:首次启动需要等待代理抓取和验证(约 30-60 秒)
|
||||
|
||||
3. **网络环境**:确保服务器可以访问外部代理源和测试 URL
|
||||
|
||||
4. **防火墙**:确保 7777 端口没有被防火墙阻止
|
||||
|
||||
5. **代理协议**:不同协议可能表现不同,建议都测试一遍
|
||||
|
||||
## 🐛 故障排查
|
||||
|
||||
### 全部请求失败
|
||||
- 检查 `goproxy` 服务是否正在运行
|
||||
- 检查代理池是否有可用代理(访问 WebUI 查看)
|
||||
- 检查端口 7777 是否被占用
|
||||
|
||||
### 成功率低
|
||||
- 查看 WebUI 日志,确认代理质量
|
||||
- 可能需要等待池子优化(系统会自动轮换低质量代理)
|
||||
- 检查网络连接是否稳定
|
||||
|
||||
### SOCKS5 测试失败
|
||||
- 确认 curl 版本支持 SOCKS5(`curl --version`)
|
||||
- Python 脚本需要安装 `pysocks`:`pip install pysocks`
|
||||
- Go 脚本需要安装依赖:`go get golang.org/x/net/proxy`
|
||||
|
||||
### Bash 脚本时间戳错误(macOS)
|
||||
如果看到 `value too great for base` 错误:
|
||||
- 脚本已自动使用 Python3 获取毫秒时间戳(macOS 兼容)
|
||||
- 确保系统已安装 Python3(macOS 自带)
|
||||
- 或安装 GNU coreutils:`brew install coreutils`
|
||||
|
||||
---
|
||||
|
||||
**Happy Testing! 🚀**
|
||||
Reference in New Issue
Block a user