No description
  • TypeScript 76.8%
  • Vue 18.7%
  • JavaScript 1.9%
  • CSS 1.1%
  • PowerShell 1.1%
  • Other 0.3%
Find a file
2026-09-02 17:40:51 +08:00
deploy Fix expired platform session recovery 2026-09-02 17:40:51 +08:00
docs/specs Add bounded retries for ineligible claims 2026-08-29 23:51:27 +08:00
server Fix expired platform session recovery 2026-09-02 17:40:51 +08:00
tests/fixtures/portal Initial red envelope service 2026-08-28 16:58:56 +08:00
web Add bounded retries for ineligible claims 2026-08-29 23:51:27 +08:00
.dockerignore Initial red envelope service 2026-08-28 16:58:56 +08:00
.env.example Initial red envelope service 2026-08-28 16:58:56 +08:00
.gitignore Initial red envelope service 2026-08-28 16:58:56 +08:00
compose.local.yaml Initial red envelope service 2026-08-28 16:58:56 +08:00
compose.yaml Initial red envelope service 2026-08-28 16:58:56 +08:00
Dockerfile.server Add bounded retries for ineligible claims 2026-08-29 23:51:27 +08:00
Dockerfile.web Initial red envelope service 2026-08-28 16:58:56 +08:00
Dockerfile.worker Add bounded retries for ineligible claims 2026-08-29 23:51:27 +08:00
package-lock.json Initial red envelope service 2026-08-28 16:58:56 +08:00
package.json Initial red envelope service 2026-08-28 16:58:56 +08:00
README.md Initial red envelope service 2026-08-28 16:58:56 +08:00
tsconfig.base.json Initial red envelope service 2026-08-28 16:58:56 +08:00

中品红包自动领取服务

这是一个可部署到服务器的多用户 Web 服务。用户可注册、登录、保存多个中品数字生态平台账号,选择用户红包和商家保底红包,手动创建今日任务,并为账号开启每日自动领取。系统使用 Playwright 驱动无头 Chromium任务经 Redis/BullMQ 排队,由独立 Worker 执行。

已实现功能

  • 用户注册、登录、退出与安全会话 Cookie
  • 多个中品平台账号、账号名称、备注、启停和红包类型配置
  • “今日开始抢红包”以及单账号立即执行
  • 按北京时间设置每日自动领取;服务短暂中断后会在当天补调度
  • 同一账号、同一业务日期、同一红包类型只保留一个任务
  • 领取结果、失败原因、尝试次数和任务筛选
  • 单一后台管理员:用户列表、系统密码重置、全部平台账号配置、平台凭据查看与修改、任务筛选和失败任务重试
  • Worker 心跳、队列状态、账号级并发锁、失败重试和页面变化安全停止
  • Docker Compose、自动数据库迁移、HTTPS 反向代理、数据库备份脚本

安全模型

  • 系统登录密码使用 Argon2id 单向哈希,管理端仅提供重置操作。
  • 中品平台密码和浏览器会话使用 AES-256-GCM 加密后写入 PostgreSQL。
  • 平台账号密码仅在管理员凭据页面按需解密;接口响应带 Cache-Control: no-store,页面离开时清除内存状态。
  • 修改平台登录账号或密码会立即清除已保存的中品登录会话。
  • 日志和任务结果不写入平台密码;诊断截图只截取红包区域。
  • 删除平台账号采用软删除,并保留历史任务;有排队或执行中任务时返回冲突,待任务结束后再删除。

请将 .env 权限限制为部署用户可读,严禁提交到版本库。掌握 Docker 守护进程或服务器 root 权限的人员仍属于受信任运维边界。

服务器部署

建议配置Linux x86_64、4 核 CPU、8 GB 内存、30 GB 可用磁盘,已安装 Docker Engine 与 Docker Compose v2。域名需提前解析到服务器并开放 80/443 端口。

cp .env.example .env
npm run generate:key

把生成结果填入 .envMASTER_KEY_BASE64,并设置以下必填项:

  • APP_ORIGINAPP_DOMAINACME_EMAIL
  • PostgreSQL 与 Redis 的随机长密码及对应连接串
  • ADMIN_USERNAMEADMIN_INITIAL_PASSWORD
  • 三个 ZHONGPIN_*_URL(示例文件已填入当前平台地址)

确保 DATABASE_URLREDIS_URL 中的密码与各服务密码一致URL 特殊字符需进行百分号编码。然后启动:

chmod 600 .env
docker compose config --quiet
docker compose up -d --build
docker compose ps
docker compose logs --tail=100 api scheduler worker

migrate 服务会先执行 Prisma migration成功后 API 才启动。首次 API 启动会创建唯一管理员;后续重启不会用环境变量覆盖已有管理员密码。

部署后验证:

APP_ORIGIN=https://你的域名 node deploy/scripts/smoke.mjs

访问 https://你的域名 注册普通用户;管理员使用 .env 中首次设置的账号密码登录。

容量与 Worker 扩展

单个 Worker 默认同时运行 5 个浏览器任务,可通过 BROWSER_CONCURRENCY 调整。账号数量增长后,优先横向扩展 Worker

docker compose up -d --scale worker=3

同一平台账号由 Redis 租约锁串行处理,不同账号可并行。建议先保持每个 Worker 35 并发,并根据内存、平台响应速度和失败率逐步调整。

备份与恢复

创建带 SHA-256 校验文件的压缩备份:

mkdir -p backups
docker compose --profile tools run --rm backup

恢复前先暂停 API、调度器和 Worker并核对备份校验值

sha256sum -c backups/red-envelope-YYYYMMDDTHHMMSSZ.sql.gz.sha256
docker compose stop api scheduler worker
gzip -dc backups/red-envelope-YYYYMMDDTHHMMSSZ.sql.gz | docker compose exec -T postgres psql -U red_envelope -d red_envelope
docker compose start api scheduler worker

数据库备份必须与同一时期的 MASTER_KEY_BASE64MASTER_KEY_VERSION 一起放入受控的密钥保管系统,否则加密的平台凭据无法恢复。

Windows 本机启动

本机联调配置保存在不会提交到版本库的 .env.local。启动脚本会启动 PostgreSQL/Redis 容器、执行迁移和服务端构建,再启动 API、调度器、Worker 与 Vite 前端:

.\deploy\scripts\start-local.ps1

访问 http://127.0.0.1:5173。停止全部本机服务:

.\deploy\scripts\stop-local.ps1

本地验证

需要 Node.js 24+

npm ci
npm run prisma:generate
npm run typecheck
npm run test
npm run build
npm audit --audit-level=high
npm run compose:check

Playwright 适配器使用本地 HTML 契约测试验证登录、红包领取、终态识别、路由参数和页面变化保护。正式上线前,应使用专用测试账号在目标服务器做一次完整的已授权领取验证;若中品页面结构调整,只需更新 server/src/portal/portal-profile.ts 并同步契约 Fixture。

常用运维命令

docker compose ps
docker compose logs -f --tail=200 worker
docker compose restart api scheduler worker
docker compose pull
docker compose up -d --build

诊断文件默认保留 7 天,位于 Docker 的 diagnostics 卷;可通过 DIAGNOSTIC_RETENTION_DAYS 调整。