mirror of
https://github.com/isboyjc/GoProxy.git
synced 2026-05-06 20:02:54 +08:00
feat: ✨ update environment configuration and enhance WebUI logging
This commit is contained in:
13
.env.example
13
.env.example
@@ -1,13 +1,10 @@
|
||||
# Docker 容器配置
|
||||
CONTAINER_NAME=goproxy
|
||||
|
||||
# 端口绑定配置
|
||||
# PROXY_HOST: 代理服务绑定地址
|
||||
# - 127.0.0.1 = 仅本地访问(推荐,最安全)
|
||||
# - 0.0.0.0 = 对外开放(如启用需配合认证或防火墙)
|
||||
PROXY_HOST=127.0.0.1
|
||||
# 端口配置
|
||||
STABLE_PORT=7776 # 最低延迟代理端口
|
||||
RANDOM_PORT=7777 # 随机轮换代理端口
|
||||
WEBUI_PORT=7778 # WebUI 管理端口
|
||||
|
||||
# 地理过滤配置
|
||||
# 屏蔽指定国家代码的出口代理(逗号分隔,如 CN,RU,KP)
|
||||
@@ -16,16 +13,14 @@ RANDOM_PORT=7777 # 随机轮换代理端口
|
||||
BLOCKED_COUNTRIES=CN
|
||||
|
||||
# 代理服务认证配置
|
||||
# ⚠️ 当 PROXY_HOST=0.0.0.0(对外开放)时,强烈建议启用认证!
|
||||
# ⚠️ 代理端口默认对外开放,强烈建议启用认证!
|
||||
# 使用方式:curl -x http://username:password@host:port https://example.com
|
||||
PROXY_AUTH_ENABLED=false # 是否启用代理认证(true/false)
|
||||
PROXY_AUTH_USERNAME=proxy # 代理认证用户名
|
||||
PROXY_AUTH_PASSWORD= # 代理认证密码(留空=不启用认证)
|
||||
# 示例:PROXY_AUTH_PASSWORD=my_secure_password_123
|
||||
|
||||
# WebUI 配置
|
||||
WEBUI_HOST=0.0.0.0 # WebUI 可对外访问(有登录认证保护)
|
||||
WEBUI_PORT=7778
|
||||
# WebUI 认证配置
|
||||
WEBUI_PASSWORD=goproxy # ⚠️ 生产环境请修改为强密码
|
||||
|
||||
# 数据存储配置(仅 docker run 本地开发需要)
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -28,6 +28,8 @@ data/
|
||||
# Environment variables
|
||||
.env
|
||||
|
||||
docker-compose.dokploy.yml
|
||||
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.bak
|
||||
|
||||
81
README.md
81
README.md
@@ -66,7 +66,6 @@ GoProxy 从多个公开代理源自动抓取 HTTP/SOCKS5 代理,通过严格
|
||||
|
||||
- [地理过滤配置指南](GEO_FILTER.md) - 国家代码、使用场景、测试方法
|
||||
- [数据目录说明](DATA_DIRECTORY.md) - 数据库、配置文件、备份恢复
|
||||
- [代理认证测试](test/AUTH_TEST.md) - 代理认证测试和多语言客户端示例
|
||||
- [测试脚本使用](test/README.md) - Bash/Go/Python 测试脚本详细说明
|
||||
- [架构设计文档](POOL_DESIGN.md) - 完整的系统设计和实现细节
|
||||
|
||||
@@ -92,8 +91,7 @@ GoProxy 从多个公开代理源自动抓取 HTTP/SOCKS5 代理,通过严格
|
||||
│ ├── test_proxy.sh # Bash 测试脚本
|
||||
│ ├── test_proxy.go # Go 测试脚本
|
||||
│ ├── test_proxy.py # Python 测试脚本
|
||||
│ ├── README.md # 测试脚本使用说明
|
||||
│ └── AUTH_TEST.md # 认证功能测试指南
|
||||
│ └── README.md # 测试脚本使用说明
|
||||
├── .github/workflows/
|
||||
│ └── docker-image.yml # 🆕 GitHub Actions 自动构建(多平台镜像)
|
||||
├── .env.example # 🆕 环境变量配置模板
|
||||
@@ -141,10 +139,11 @@ go build -o proxygo .
|
||||
- `:7777` - 随机轮换模式(IP 多样性)
|
||||
|
||||
### 默认端口
|
||||
- **代理服务(随机轮换)**:`127.0.0.1:7777` - 每次请求随机选择代理,IP 多样性高
|
||||
- **代理服务(最低延迟)**:`127.0.0.1:7776` - 固定使用延迟最低的代理,性能优先
|
||||
- **WebUI**:`http://127.0.0.1:7778`
|
||||
- **代理服务(随机轮换)**:`7777` - 每次请求随机选择代理,IP 多样性高
|
||||
- **代理服务(最低延迟)**:`7776` - 固定使用延迟最低的代理,性能优先
|
||||
- **WebUI**:`7778`
|
||||
- **默认密码**:`goproxy`(可通过 `WEBUI_PASSWORD` 环境变量自定义)
|
||||
- **访问方式**:本地使用 `localhost`,远程使用服务器 IP 地址
|
||||
|
||||
### 使用代理
|
||||
|
||||
@@ -155,7 +154,11 @@ GoProxy 提供**两个代理端口**,满足不同场景需求:
|
||||
适合需要 **IP 多样性** 的场景(爬虫、数据采集、负载均衡):
|
||||
|
||||
```bash
|
||||
curl -x http://127.0.0.1:7777 https://httpbin.org/ip
|
||||
# 本地使用
|
||||
curl -x http://localhost:7777 https://httpbin.org/ip
|
||||
|
||||
# 远程使用
|
||||
curl -x http://your-server-ip:7777 https://httpbin.org/ip
|
||||
```
|
||||
|
||||
**特点**:
|
||||
@@ -168,7 +171,11 @@ curl -x http://127.0.0.1:7777 https://httpbin.org/ip
|
||||
适合需要 **稳定连接** 的场景(长连接、流媒体、实时通信):
|
||||
|
||||
```bash
|
||||
curl -x http://127.0.0.1:7776 https://httpbin.org/ip
|
||||
# 本地使用
|
||||
curl -x http://localhost:7776 https://httpbin.org/ip
|
||||
|
||||
# 远程使用
|
||||
curl -x http://your-server-ip:7776 https://httpbin.org/ip
|
||||
```
|
||||
|
||||
**特点**:
|
||||
@@ -179,15 +186,15 @@ curl -x http://127.0.0.1:7776 https://httpbin.org/ip
|
||||
|
||||
#### 环境变量配置
|
||||
|
||||
**本地使用(无认证)**:
|
||||
**本地使用**:
|
||||
```bash
|
||||
# 使用随机模式
|
||||
export http_proxy=http://127.0.0.1:7777
|
||||
export https_proxy=http://127.0.0.1:7777
|
||||
export http_proxy=http://localhost:7777
|
||||
export https_proxy=http://localhost:7777
|
||||
|
||||
# 或使用稳定模式
|
||||
export http_proxy=http://127.0.0.1:7776
|
||||
export https_proxy=http://127.0.0.1:7776
|
||||
export http_proxy=http://localhost:7776
|
||||
export https_proxy=http://localhost:7776
|
||||
```
|
||||
|
||||
**远程使用(带认证)**:
|
||||
@@ -273,8 +280,8 @@ docker compose up -d
|
||||
|
||||
```bash
|
||||
docker run -d --name proxygo \
|
||||
-p 127.0.0.1:7776:7776 \
|
||||
-p 127.0.0.1:7777:7777 \
|
||||
-p 7776:7776 \
|
||||
-p 7777:7777 \
|
||||
-p 7778:7778 \
|
||||
-e WEBUI_PASSWORD=your_password \
|
||||
-v goproxy-data:/app/data \
|
||||
@@ -315,24 +322,30 @@ docker compose up -d
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| `PROXY_HOST` | `127.0.0.1` | 代理服务绑定地址(`0.0.0.0` = 对外开放) |
|
||||
| `BLOCKED_COUNTRIES` | `CN` | 屏蔽的国家代码(逗号分隔,如 `CN,RU`,留空=不屏蔽) |
|
||||
| `PROXY_AUTH_ENABLED` | `false` | 是否启用代理认证 |
|
||||
| `PROXY_AUTH_ENABLED` | `false` | 是否启用代理认证(对外开放时强烈建议启用) |
|
||||
| `PROXY_AUTH_USERNAME` | `proxy` | 代理认证用户名 |
|
||||
| `PROXY_AUTH_PASSWORD` | 空 | 代理认证密码 |
|
||||
| `WEBUI_PASSWORD` | `goproxy` | WebUI 登录密码 |
|
||||
| `STABLE_PORT` | `7776` | 最低延迟代理端口 |
|
||||
| `RANDOM_PORT` | `7777` | 随机轮换代理端口 |
|
||||
| `WEBUI_PORT` | `7778` | WebUI 管理端口 |
|
||||
|
||||
完整环境变量列表请查看 `.env.example` 文件。
|
||||
|
||||
**⚠️ 生产部署注意事项**:
|
||||
- 如使用 Dokploy、Coolify 等平台部署,确保 `docker-compose.yml` 中配置了平台网络(如 `dokploy-network`)
|
||||
- WebUI 端口可通过平台的域名功能访问,无需手动配置端口绑定
|
||||
- 代理端口(7776/7777)通过 `IP:端口` 直接访问,**强烈建议启用认证**
|
||||
|
||||
**常用配置示例**:
|
||||
|
||||
```bash
|
||||
# 场景 1:本地使用(默认,最安全)
|
||||
# 场景 1:本地使用(默认配置)
|
||||
# 直接运行 docker compose up -d 即可
|
||||
|
||||
# 场景 2:对外开放 + 启用认证(推荐)
|
||||
# 场景 2:启用代理认证(推荐)
|
||||
cat > .env << EOF
|
||||
PROXY_HOST=0.0.0.0
|
||||
PROXY_AUTH_ENABLED=true
|
||||
PROXY_AUTH_USERNAME=myuser
|
||||
PROXY_AUTH_PASSWORD=secure_pass_123
|
||||
@@ -358,23 +371,23 @@ docker compose up -d
|
||||
|
||||
### 安全部署配置
|
||||
|
||||
**默认配置**:代理服务仅本地访问(`127.0.0.1`),WebUI 可对外访问。
|
||||
**默认配置**:代理服务对外开放(端口 7776、7777),WebUI 对外开放(端口 7778)。
|
||||
|
||||
**如需对外开放代理服务**,强烈建议启用认证:
|
||||
**⚠️ 重要提示**:
|
||||
|
||||
| 使用场景 | 配置建议 | 安全级别 |
|
||||
|---------|---------|---------|
|
||||
| **个人 VPS + 本地使用** | `PROXY_HOST=127.0.0.1`(默认) | ⭐⭐⭐⭐⭐ 最安全 |
|
||||
| **团队共享 + 认证** | `PROXY_HOST=0.0.0.0` + 启用认证 | ⭐⭐⭐⭐ 安全 |
|
||||
| **内网 + 防火墙** | `PROXY_HOST=0.0.0.0` + iptables 白名单 | ⭐⭐⭐ 中等 |
|
||||
| **公网部署** | 启用代理认证 + 防火墙限制 | ⭐⭐⭐⭐⭐ 推荐 |
|
||||
| **内网部署** | 启用代理认证 或 防火墙白名单 | ⭐⭐⭐⭐ 安全 |
|
||||
| **本地测试** | 无需认证 | ⭐⭐⭐ 仅测试 |
|
||||
|
||||
**启用代理认证**(编辑 `.env`):
|
||||
|
||||
```bash
|
||||
PROXY_HOST=0.0.0.0
|
||||
PROXY_AUTH_ENABLED=true
|
||||
PROXY_AUTH_USERNAME=myuser
|
||||
PROXY_AUTH_PASSWORD=secure_pass_123
|
||||
WEBUI_PASSWORD=admin_pass
|
||||
```
|
||||
|
||||
**客户端使用(带认证)**:
|
||||
@@ -391,8 +404,6 @@ curl -x http://myuser:secure_pass_123@server-ip:7777 https://httpbin.org/ip
|
||||
proxies = {'http': 'http://myuser:secure_pass_123@server-ip:7777', 'https': '...'}
|
||||
```
|
||||
|
||||
> 💡 **认证测试指南**:详细的认证功能测试和多语言客户端示例,请查看 [`test/AUTH_TEST.md`](test/AUTH_TEST.md)
|
||||
|
||||
## ⚙️ 配置说明
|
||||
|
||||
### 配置文件示例
|
||||
@@ -551,7 +562,7 @@ proxies = {'http': 'http://myuser:secure_pass_123@server-ip:7777', 'https': '...
|
||||
|
||||
## 🎨 WebUI 使用指南
|
||||
|
||||
访问地址:`http://127.0.0.1:7778`
|
||||
访问地址:`http://localhost:7778`(本地)或 `http://your-server-ip:7778`(远程)
|
||||
|
||||
### 👥 双角色权限系统
|
||||
|
||||
@@ -907,8 +918,6 @@ A:
|
||||
2. 重启服务:`docker compose up -d`
|
||||
3. 客户端使用:`http://myuser:mypass@server-ip:7777`
|
||||
|
||||
详细说明和测试方法请查看 [`test/AUTH_TEST.md`](./test/AUTH_TEST.md)
|
||||
|
||||
### Q: 代理认证和 WebUI 认证有什么区别?
|
||||
A:
|
||||
- **代理认证**:保护 7776/7777 代理服务端口,防止代理被滥用
|
||||
@@ -979,7 +988,7 @@ python test/test_proxy.py 7776 # 测试 7776
|
||||
### 测试输出示例
|
||||
|
||||
```
|
||||
PROXY 127.0.0.1:7777 (http://ip-api.com/json/?fields=countryCode,query): continuous mode
|
||||
PROXY localhost: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
|
||||
@@ -996,15 +1005,13 @@ proxy from 🇯🇵 198.51.100.12: seq=5 time=890ms
|
||||
**测试认证功能**:
|
||||
```bash
|
||||
# 启用认证后测试
|
||||
curl -x http://myuser:mypass@127.0.0.1:7777 https://httpbin.org/ip
|
||||
curl -x http://myuser:mypass@localhost:7777 https://httpbin.org/ip
|
||||
|
||||
# 无认证请求(应该返回 407 错误)
|
||||
curl -x http://127.0.0.1:7777 https://httpbin.org/ip
|
||||
curl -x http://localhost:7777 https://httpbin.org/ip
|
||||
```
|
||||
|
||||
**更多测试指南**:
|
||||
- 基础功能测试:[`test/README.md`](./test/README.md)
|
||||
- 认证功能测试:[`test/AUTH_TEST.md`](./test/AUTH_TEST.md)
|
||||
**测试脚本使用**:[`test/README.md`](./test/README.md)
|
||||
|
||||
## 🙏 致谢与声明
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
services:
|
||||
proxygo:
|
||||
goproxy:
|
||||
# 使用预构建镜像(每次部署自动拉取最新版本)
|
||||
image: ghcr.io/isboyjc/goproxy:latest
|
||||
pull_policy: always
|
||||
@@ -7,14 +7,12 @@ services:
|
||||
# 或使用本地构建(取消下面注释,注释上面的 image 和 pull_policy 行)
|
||||
# build: .
|
||||
|
||||
container_name: ${CONTAINER_NAME:-proxygo}
|
||||
container_name: ${CONTAINER_NAME:-goproxy}
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
# 代理端口:默认仅本地访问(最安全)
|
||||
# 如需对外开放,在 .env 中设置 PROXY_HOST=0.0.0.0(⚠️ 无认证,需配合防火墙)
|
||||
- "${PROXY_HOST:-127.0.0.1}:${STABLE_PORT:-7776}:7776" # 稳定代理(最低延迟)
|
||||
- "${PROXY_HOST:-127.0.0.1}:${RANDOM_PORT:-7777}:7777" # 随机轮换
|
||||
- "${WEBUI_HOST:-0.0.0.0}:${WEBUI_PORT:-7778}:7778" # WebUI(有登录认证)
|
||||
- "${STABLE_PORT:-7776}:7776" # 稳定代理(最低延迟)
|
||||
- "${RANDOM_PORT:-7777}:7777" # 随机轮换
|
||||
- "${WEBUI_PORT:-7778}:7778" # WebUI(有登录认证)
|
||||
volumes:
|
||||
- goproxy-data:/app/data
|
||||
environment:
|
||||
|
||||
@@ -1,165 +0,0 @@
|
||||
# 代理认证功能测试指南
|
||||
|
||||
本文档说明如何测试 GoProxy 的代理认证功能。
|
||||
|
||||
## 🔒 启用认证
|
||||
|
||||
### 使用 docker-compose
|
||||
|
||||
编辑 `.env` 文件:
|
||||
|
||||
```bash
|
||||
PROXY_HOST=0.0.0.0
|
||||
PROXY_AUTH_ENABLED=true
|
||||
PROXY_AUTH_USERNAME=testuser
|
||||
PROXY_AUTH_PASSWORD=testpass123
|
||||
```
|
||||
|
||||
启动服务:
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### 直接运行
|
||||
|
||||
设置环境变量后启动:
|
||||
|
||||
```bash
|
||||
export PROXY_AUTH_ENABLED=true
|
||||
export PROXY_AUTH_USERNAME=testuser
|
||||
export PROXY_AUTH_PASSWORD=testpass123
|
||||
go run .
|
||||
```
|
||||
|
||||
## 🧪 测试认证功能
|
||||
|
||||
### 测试 1:无认证请求(应该失败)
|
||||
|
||||
```bash
|
||||
curl -x http://127.0.0.1:7777 https://httpbin.org/ip -v
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
- HTTP 状态码:`407 Proxy Authentication Required`
|
||||
- 响应头:`Proxy-Authenticate: Basic realm="GoProxy"`
|
||||
|
||||
### 测试 2:错误的用户名/密码(应该失败)
|
||||
|
||||
```bash
|
||||
curl -x http://wronguser:wrongpass@127.0.0.1:7777 https://httpbin.org/ip -v
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
- HTTP 状态码:`407 Proxy Authentication Required`
|
||||
|
||||
### 测试 3:正确的认证(应该成功)
|
||||
|
||||
```bash
|
||||
curl -x http://testuser:testpass123@127.0.0.1:7777 https://httpbin.org/ip
|
||||
```
|
||||
|
||||
**预期结果**:
|
||||
- HTTP 状态码:`200 OK`
|
||||
- 返回代理的出口 IP 信息
|
||||
|
||||
### 测试 4:环境变量方式(应该成功)
|
||||
|
||||
```bash
|
||||
export http_proxy=http://testuser:testpass123@127.0.0.1:7777
|
||||
export https_proxy=http://testuser:testpass123@127.0.0.1:7777
|
||||
curl https://httpbin.org/ip
|
||||
```
|
||||
|
||||
### 测试 5:HTTPS CONNECT 隧道(应该成功)
|
||||
|
||||
```bash
|
||||
curl -x http://testuser:testpass123@127.0.0.1:7776 https://www.google.com -I
|
||||
```
|
||||
|
||||
## 🧩 多语言客户端示例
|
||||
|
||||
### Python (requests)
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
proxies = {
|
||||
'http': 'http://testuser:testpass123@127.0.0.1:7777',
|
||||
'https': 'http://testuser:testpass123@127.0.0.1:7777',
|
||||
}
|
||||
|
||||
response = requests.get('https://httpbin.org/ip', proxies=proxies)
|
||||
print(response.text)
|
||||
```
|
||||
|
||||
### Go
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func main() {
|
||||
proxyURL, _ := url.Parse("http://testuser:testpass123@127.0.0.1:7777")
|
||||
client := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
Proxy: http.ProxyURL(proxyURL),
|
||||
},
|
||||
}
|
||||
|
||||
resp, err := client.Get("https://httpbin.org/ip")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
fmt.Println(string(body))
|
||||
}
|
||||
```
|
||||
|
||||
### Node.js
|
||||
|
||||
```javascript
|
||||
const axios = require('axios');
|
||||
const HttpsProxyAgent = require('https-proxy-agent');
|
||||
|
||||
const proxyUrl = 'http://testuser:testpass123@127.0.0.1:7777';
|
||||
const agent = new HttpsProxyAgent(proxyUrl);
|
||||
|
||||
axios.get('https://httpbin.org/ip', {
|
||||
httpAgent: agent,
|
||||
httpsAgent: agent
|
||||
})
|
||||
.then(response => console.log(response.data))
|
||||
.catch(error => console.error(error));
|
||||
```
|
||||
|
||||
## 🔍 日志验证
|
||||
|
||||
启动时会输出认证状态:
|
||||
|
||||
```
|
||||
proxy server listening on :7777 [随机轮换] [需认证 (用户: testuser)]
|
||||
proxy server listening on :7776 [最低延迟] [需认证 (用户: testuser)]
|
||||
```
|
||||
|
||||
无认证模式:
|
||||
|
||||
```
|
||||
proxy server listening on :7777 [随机轮换] [无认证]
|
||||
proxy server listening on :7776 [最低延迟] [无认证]
|
||||
```
|
||||
|
||||
## 📝 注意事项
|
||||
|
||||
- 认证采用 **HTTP Basic Auth** 标准,兼容绝大多数客户端
|
||||
- 密码存储为 **SHA256 哈希**,安全性高
|
||||
- 认证失败不会删除代理或影响池子状态
|
||||
- 两个端口(7776、7777)共享相同的认证配置
|
||||
- 认证仅保护代理服务,WebUI 有独立的登录系统
|
||||
@@ -63,6 +63,14 @@ func New(s *storage.Storage, cfg *config.Config, pm *pool.Manager, ft FetchTrigg
|
||||
|
||||
func (s *Server) Start() {
|
||||
mux := http.NewServeMux()
|
||||
|
||||
// 添加日志中间件
|
||||
loggedMux := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
log.Printf("[webui] %s %s | Host: %s | RemoteAddr: %s",
|
||||
r.Method, r.URL.Path, r.Host, r.RemoteAddr)
|
||||
mux.ServeHTTP(w, r)
|
||||
})
|
||||
|
||||
mux.HandleFunc("/", s.handleIndex)
|
||||
mux.HandleFunc("/login", s.handleLogin)
|
||||
mux.HandleFunc("/logout", s.handleLogout)
|
||||
@@ -85,7 +93,7 @@ func (s *Server) Start() {
|
||||
|
||||
log.Printf("WebUI listening on %s", s.cfg.WebUIPort)
|
||||
go func() {
|
||||
if err := http.ListenAndServe(s.cfg.WebUIPort, mux); err != nil {
|
||||
if err := http.ListenAndServe(s.cfg.WebUIPort, loggedMux); err != nil {
|
||||
log.Fatalf("webui: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
Reference in New Issue
Block a user