feat: update environment configuration and enhance WebUI logging

This commit is contained in:
isboyjc
2026-03-29 13:44:22 +08:00
parent 0cff1ea6a6
commit cede441015
6 changed files with 64 additions and 219 deletions

View File

@@ -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
View File

@@ -28,6 +28,8 @@ data/
# Environment variables
.env
docker-compose.dokploy.yml
# Temporary files
*.tmp
*.bak

View File

@@ -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、7777WebUI 对外开放(端口 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)
## 🙏 致谢与声明

View File

@@ -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:

View File

@@ -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
```
### 测试 5HTTPS 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 有独立的登录系统

View File

@@ -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)
}
}()