合并应用宝 Worker 容器

This commit is contained in:
yml2213
2026-08-12 17:59:26 +08:00
parent cebbd94ae8
commit 1a20c367db
15 changed files with 155 additions and 110 deletions
-18
View File
@@ -1,18 +0,0 @@
FROM node:20-bookworm-slim
ENV PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1 NODE_ENV=production
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3 python3-pip ca-certificates \
&& rm -rf /var/lib/apt/lists/* \
&& python3 -m pip install --no-cache-dir --break-system-packages --upgrade pip
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY requirements-worker.txt ./
RUN python3 -m pip install --no-cache-dir --break-system-packages -r requirements-worker.txt
COPY runtime/ ./
RUN mkdir -p /app/config/worker-jobs
EXPOSE 8810
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD python3 -c "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8810/health')"
CMD ["python3", "scripts/yyb-worker.py", "--host", "0.0.0.0", "--port", "8810"]
+4 -5
View File
@@ -1,15 +1,14 @@
# YYB Worker Runtime
此目录是部署到 `douyu_login_py` 的最小 YYB 运行时。构建上下文只包含 Worker 启动所需的 Python、Node/jsdom 依赖、协议脚本和静态重放数据。
此目录是 `douyu-login` 主镜像部署的 YYB 运行时代码。构建会将 Worker 所需的 Python、Node/jsdom 依赖、协议脚本和静态重放数据纳入同一镜像
- 源码分析和协议验证工作区仍在 `js_reverse/sites/yyb`;不要将该分析仓库上传到服务器。
- 不要向 `runtime/config/` 放入 Cookie、订单响应、二维码或付款链接。每个任务的动态数据仅写入 Docker volume 挂载的 `/app/config/worker-jobs/<job-id>/`
- 不要向 `runtime/config/` 放入 Cookie、订单响应、二维码或付款链接。每个任务的动态数据仅写入挂载目录 `/app/data/yyb-worker-jobs/<job-id>/`
- `mall-order-template.json` 仅保留请求结构与非用户常量。登录态、商品、区服、角色、支付平台、动态令牌和加密字段均由当前任务运行时填充。
- 本服务没有 Compose 端口映射,只允许 `douyu-login` 通过默认 Compose 内网的 `http://yyb-worker:8810` 访问`YYB_WORKER_KEY` 必须与后台服务配置一致。
- Worker 在应用容器内仅监听 `127.0.0.1:8810`Web 后端通过本机地址访问`YYB_WORKER_KEY` 必须与后台服务配置一致。
本地独立验证:
```bash
docker build -t douyu-yyb-worker:local services/yyb-worker
docker run --rm -e YYB_WORKER_KEY=test-key douyu-yyb-worker:local
YYB_WORKER_KEY=test-key uv run python runtime/scripts/yyb-worker.py --host 127.0.0.1
```
@@ -1,3 +0,0 @@
curl_cffi>=0.13
pycryptodome>=3.20
segno>=1.6
@@ -14,6 +14,7 @@ import json
import os
import re
import subprocess
import sys
import threading
import time
import uuid
@@ -96,7 +97,7 @@ def _start_login(job_id: str, provider: str, timeout: int) -> None:
directory = _job_dir(job_id)
session = directory / "mall-session.json"
qr = directory / ("qq-login.jpg" if provider == "qq" else "wechat-login.jpg")
command = ["python3", f"scripts/login-{provider}.py", "--session", str(session),
command = [sys.executable, f"scripts/login-{provider}.py", "--session", str(session),
"--qr", str(qr), "--timeout", str(timeout)]
with _lock:
job["provider"] = provider
@@ -135,7 +136,7 @@ def _start_payment(job_id: str, selection: dict) -> None:
session = directory / "mall-session.json"
response = directory / "mall-order-response.json"
output = directory / "jsdom-order"
command = ["python3", "main.py", "mall", "auto", "--session", str(session),
command = [sys.executable, "main.py", "mall", "auto", "--session", str(session),
"--order-template", str(ROOT / "config" / "mall-order-template.json"),
"--quantity", "1", "--product-id", str(selection["product_id"]),
"--offer-id", str(selection["offer_id"]),
@@ -149,7 +150,7 @@ def _start_payment(job_id: str, selection: dict) -> None:
job = _jobs[job_id]
if job.get("status") != "success" or not response.exists():
return
pay_command = ["python3", "scripts/jsdom-pay.py", "--session", str(session),
pay_command = [sys.executable, "scripts/jsdom-pay.py", "--session", str(session),
"--mall-response", str(response), "--out-dir", str(output),
"--zone-id", str(selection["zone_id"]),
"--pf", str(selection.get("order_pf", "")),