feat: 添加可选的代理功能支持

新增功能:
- 集成 Cloudflare WARP socks5 代理服务
- 通过环境变量 USE_PROXY 控制代理开关
- 支持自定义 HTTP/HTTPS/SOCKS5 代理服务器
- 使用 docker compose profile 管理 proxy 服务

配置方式:
- USE_PROXY=true 启用代理
- ALL_PROXY/HTTP_PROXY/HTTPS_PROXY 自定义代理
- docker compose --profile proxy up 启动 warp 服务

文件变更:
- docker-compose.yaml: 添加 warp-proxy 服务
- playwright-auth.ts: 添加代理配置逻辑
- example.env: 添加代理环境变量
- PROXY.md: 使用文档
This commit is contained in:
JamesFlare1212
2026-04-06 16:37:54 -04:00
parent 4e04063469
commit 4a97057825
4 changed files with 209 additions and 5 deletions

158
PROXY.md Normal file
View File

@@ -0,0 +1,158 @@
# DSAS CCA Backend - Proxy Configuration
## 代理功能说明
本应用支持可选的代理配置,用于绕过网络限制访问 engage.nkcswx.cn。
## 使用 Cloudflare WARP 代理
### 1. 启动带代理的服务
```bash
# 启动包含 warp-proxy 的服务
docker compose --profile proxy up -d
```
### 2. 配置环境变量
`.env` 文件中设置:
```bash
# 启用代理
USE_PROXY=true
# 使用 warp-proxy 服务(默认配置,无需修改)
# 或者自定义代理服务器
ALL_PROXY=socks5://warp-proxy:9091
```
### 3. 验证代理工作
```bash
# 查看日志确认代理已启用
docker compose logs -f app | grep "Using proxy"
```
## 使用自定义代理服务器
### HTTP/HTTPS 代理
```bash
USE_PROXY=true
HTTP_PROXY=http://your-proxy:8080
HTTPS_PROXY=http://your-proxy:8080
```
### SOCKS5 代理
```bash
USE_PROXY=true
ALL_PROXY=socks5://your-proxy:1080
```
### 需要认证的代理
```bash
USE_PROXY=true
ALL_PROXY=socks5://username:password@your-proxy:1080
```
## 环境变量说明
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| `USE_PROXY` | 是否启用代理 | `false` |
| `ALL_PROXY` | 通用代理服务器 | - |
| `HTTP_PROXY` | HTTP 代理服务器 | - |
| `HTTPS_PROXY` | HTTPS 代理服务器 | - |
## Warp Proxy 服务配置
### 启动 Warp 服务
```bash
# 单独启动 warp-proxy
docker compose --profile proxy up warp-proxy
# 查看所有服务(包括 warp-proxy
docker compose --profile ps
```
### Warp 服务端口
- **内部端口**: 9091 (SOCKS5 + HTTP 混合模式)
- **访问方式**: `socks5://warp-proxy:9091`
### 自定义 Warp 配置
可以在 `docker-compose.yaml` 中添加环境变量:
```yaml
warp-proxy:
image: ghcr.io/mon-ius/docker-warp-socks:v5
environment:
# 自定义 Warp 配置
# WARP_MODE=premium # 如果需要 premium 模式
```
## 故障排除
### 代理未生效
1. 检查 `USE_PROXY=true` 是否已设置
2. 确认 warp-proxy 服务正在运行:
```bash
docker compose ps
```
3. 查看应用日志:
```bash
docker compose logs app | grep proxy
```
### Warp 连接失败
1. 检查网络连接
2. 重启 warp-proxy 服务:
```bash
docker compose --profile proxy restart warp-proxy
```
3. 查看 warp 日志:
```bash
docker compose logs warp-proxy
```
### 性能问题
如果代理导致请求变慢:
1. 考虑关闭代理(如果不需要):
```bash
USE_PROXY=false
```
2. 或者使用更快的代理服务器
## 不启用代理的使用
默认情况下代理是关闭的。正常使用:
```bash
# 正常启动(不使用代理)
docker compose up -d
# 或者明确指定不使用代理
USE_PROXY=false docker compose up -d
```
## 注意事项
1. **首次启动**: 如果使用代理,首次启动可能会慢一些,因为需要建立 Warp 连接
2. **cookies 刷新**: 启用代理后,建议重新获取 cookies
```bash
docker exec dsas-cca-backend bun run test/get-cookies.ts
```
3. **网络要求**: Warp 需要访问 Cloudflare 服务器,确保网络可达
## 参考
- [Docker Warp Socks GitHub](https://github.com/Mon-ius/Docker-Warp-Socks)
- [Docker Hub](https://hub.docker.com/r/monius/docker-warp-socks)

View File

@@ -1,4 +1,16 @@
services:
# Warp Socks Proxy Service (Optional - starts with --profile proxy)
warp-proxy:
image: ghcr.io/mon-ius/docker-warp-socks:v5
container_name: dsas-cca-warp-proxy
restart: unless-stopped
networks:
- cca_network
expose:
- "9091"
profiles:
- proxy
app:
build:
context: .
@@ -11,16 +23,24 @@ services:
environment:
- NODE_ENV=production
- PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
# Proxy configuration (only active when USE_PROXY=true)
- USE_PROXY=${USE_PROXY:-false}
- HTTP_PROXY=${HTTP_PROXY:-}
- HTTPS_PROXY=${HTTPS_PROXY:-}
- ALL_PROXY=${ALL_PROXY:-}
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
warp-proxy:
condition: service_started
required: false
volumes:
- ./services/cookies.json:/usr/src/app/services/cookies.json
networks:
- cca_network
mem_limit: 1g
cpus: 1.0
extra_hosts:
- "host.docker.internal:host-gateway"
redis:
image: "redis:8.0-alpine"
@@ -36,7 +56,6 @@ services:
interval: 10s
timeout: 5s
retries: 5
mem_limit: 256m
volumes:
redis_data:

View File

@@ -17,3 +17,15 @@ CONCURRENT_API_CALLS=16
STAFF_UPDATE_INTERVAL_MINS=360
CLUB_UPDATE_INTERVAL_MINS=360
LOG_LEVEL=info # Example: 'debug', 'info', 'warn', 'error'
# Proxy Configuration (Optional)
# Set USE_PROXY=true to enable proxy for Playwright requests
USE_PROXY=false
# Custom proxy server (default: socks5://warp-proxy:9091 when using warp-proxy service)
# Examples:
# HTTP: http://proxy.example.com:8080
# SOCKS5: socks5://proxy.example.com:1080
# Warp: socks5://warp-proxy:9091
ALL_PROXY=
HTTP_PROXY=
HTTPS_PROXY=

View File

@@ -8,16 +8,31 @@ const COOKIE_FILE_PATH = resolve(import.meta.dir, 'cookies.json');
let _inMemoryCookies: Cookie[] | null = null;
// Proxy configuration
const USE_PROXY = process.env.USE_PROXY === 'true';
const PROXY_SERVER = process.env.ALL_PROXY || process.env.HTTP_PROXY || `socks5://warp-proxy:9091`;
/**
* Login using Playwright and extract cookies
*/
export async function loginWithPlaywright(username: string, password: string): Promise<Cookie[]> {
logger.info('Starting Playwright login process...');
const browser = await chromium.launch({
const browserLaunchOptions: any = {
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
};
// Configure proxy if enabled
if (USE_PROXY) {
logger.info(`Using proxy: ${PROXY_SERVER}`);
browserLaunchOptions.proxy = {
server: PROXY_SERVER,
bypass: 'localhost,127.0.0.1,::1'
};
}
const browser = await chromium.launch(browserLaunchOptions);
try {
const context = await browser.newContext({