From 4a97057825bf5a3bc17115f07d59d4577b381681 Mon Sep 17 00:00:00 2001 From: JamesFlare1212 Date: Mon, 6 Apr 2026 16:37:54 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=8F=AF=E9=80=89?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=90=86=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增功能: - 集成 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: 使用文档 --- PROXY.md | 158 ++++++++++++++++++++++++++++++++++++ docker-compose.yaml | 25 +++++- example.env | 12 +++ services/playwright-auth.ts | 19 ++++- 4 files changed, 209 insertions(+), 5 deletions(-) create mode 100644 PROXY.md diff --git a/PROXY.md b/PROXY.md new file mode 100644 index 0000000..2a77ad5 --- /dev/null +++ b/PROXY.md @@ -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) diff --git a/docker-compose.yaml b/docker-compose.yaml index 7108681..c92e5a6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -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: diff --git a/example.env b/example.env index 7641cc0..488b765 100644 --- a/example.env +++ b/example.env @@ -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= diff --git a/services/playwright-auth.ts b/services/playwright-auth.ts index 0830ef9..1351cfe 100644 --- a/services/playwright-auth.ts +++ b/services/playwright-auth.ts @@ -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 { 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({