- TypeScript 76.8%
- Vue 18.7%
- JavaScript 1.9%
- CSS 1.1%
- PowerShell 1.1%
- Other 0.3%
| deploy | ||
| docs/specs | ||
| server | ||
| tests/fixtures/portal | ||
| web | ||
| .dockerignore | ||
| .env.example | ||
| .gitignore | ||
| compose.local.yaml | ||
| compose.yaml | ||
| Dockerfile.server | ||
| Dockerfile.web | ||
| Dockerfile.worker | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.base.json | ||
中品红包自动领取服务
这是一个可部署到服务器的多用户 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
把生成结果填入 .env 的 MASTER_KEY_BASE64,并设置以下必填项:
APP_ORIGIN、APP_DOMAIN、ACME_EMAIL- PostgreSQL 与 Redis 的随机长密码及对应连接串
ADMIN_USERNAME、ADMIN_INITIAL_PASSWORD- 三个
ZHONGPIN_*_URL(示例文件已填入当前平台地址)
确保 DATABASE_URL、REDIS_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 3–5 并发,并根据内存、平台响应速度和失败率逐步调整。
备份与恢复
创建带 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_BASE64、MASTER_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 调整。