Skip to content

Deployment

Sliverkiss edited this page Sep 14, 2026 · 1 revision

部署

Docker Compose(推荐)

仓库根目录提供 Dockerfiledocker-compose.yml

services:
  wb2api:
    build: .
    ports:
      - "7863:7863"
    volumes:
      - ./auths:/app/auths
      - ./data:/app/data
      - ./config.json:/app/config.json:ro
    environment:
      - TZ=Asia/Shanghai
    restart: unless-stopped
docker compose up -d --build
docker compose logs -f

要点:

  • 7863:7863 — 网关 HTTP 端口;
  • 挂载 auths/(凭证目录)与 data/state.json 落盘);data/ 属主须与容器内 uid 匹配,见下方权限说明;
  • config.json 以只读挂载;修改后 docker compose restart 生效;
  • TZ=Asia/Shanghai — 定时任务与「次日 04:00」等冷却恢复时刻按北京时间计算。

镜像细节

  • 多阶段构建:golang:1.23-alpine 编译 → alpine:3.20 运行;
  • 非 root 运行:app 用户,uid 10001;
  • 内置 6 个预编译二进制:wb2apisignin_binlogincredittrial_binactivity_bin
  • HEALTHCHECK 探测 wget /healthz

data/ 目录权限

池状态 state.json 由网关周期性原子写入(tmp + rename,0600 权限)。若用 bind mount 且宿主编解码 uid 与 10001 不匹配,会落盘失败。日志会给出行之有效的修复建议:

fix=chown -R 10001:10001 ./data

或改用 named volume。Dockerfile 内镜像默认 WORKDIR /app/app/data 建议以 named volume 或 chown 10001:10001 后的 bind mount 挂载。

源码构建

# 要求 Go 1.22.5+
git clone https://github.com/Sliverkiss/workbuddy2api.git
cd workbuddy2api

# 主网关
go build -o wb2api ./cmd/server
./wb2api

# 其余内置工具(可选)
go build -o signin_bin  ./cmd/signin
go build -o login       ./cmd/login
go build -o credit      ./cmd/credit
go build -o trial_bin   ./cmd/trial
go build -o activity_bin ./cmd/activity

启动前清单

  1. cp config.example.json config.json,按需修改(见 Configuration);
  2. ./login.sh 登录至少一个 CN 账号(国际版用 ./login.sh --realm=global,见 International);
  3. 启动后访问 http://localhost:7863/status 确认账号已加载;/healthz 无鉴权可直接探活。

容器内工具

镜像内置的辅助二进制,均可直接使用:

工具 命令 说明
查询状态 curl localhost:7863/status 池健康、冷却、禁用、realm 分组、限额台账(见 API-Reference
即时签到对账 ./signin_bin auths 逐账号表格输出 uid/nick/status/remain/detail + 汇总行;token 临近过期自动预刷新
签到辅助脚本 ./checkin.sh [-v] [auths_dir] 先探 /status 判活,再构建并执行 signin_bin-v 追加 fail 明细(FAIL/LOAD_ERR/AUTH_INVALID)
登录 ./login url|poll|realm 设备授权获取凭证;见 International
积分日报 ./credit [-pretty|-json] realm 感知的余额查询
Global trial ./trial.sh [auths_dir] 一次 only global 的 trial 加油包领取(OK / ALREADY 幂等 / N/A CN 不适用)
活跃上报 ./activity_bin 单次对话活跃上报(复用 config.json 的 schedule 配置)

容器内 signin_bin / trial_bin / activity_bin 已预置(无需 go 工具链);本地则首次自动 go build/tmp/workbuddy2api-bin 缓存。

凭证文件格式

login.sh 落盘的 JSON(auths/workbuddy-<uid>.json)结构:

{
  "auth": {
    "accessToken": "...",
    "refreshToken": "...",
    "expiresAt": "2026-01-01T00:00:00+08:00",
    "domain": "www.workbuddy.ai",
    "realm": "global"
  },
  "account": { "uid": "...", "enterpriseId": "...", "nickname": "..." },
  "device_token": "..."
}
  • realmcn / global;凭证缺少该字段时按域判定规则回填(见 International);
  • 文件以 0600 权限、tmp + rename 原子写入;
  • 同一 UID 重复出现时启动打警告,后加载者覆盖。

状态持久化

  • 池状态(积分、冷却、禁用、成功率、软退避计数)→ state.json,每 5s 脏标记落盘 + 退出时 Flush
  • 可选 upstash 配置后同时镜像到 Redis(7 天 TTL),启动时与本地文件择新恢复
  • 会话粘性绑定 → 内存 TTL 滚动续期(GC 5m);配置 upstash 后同样镜像 Redis;
  • modelCooldowns(6004 模型级冷却)与 modelCost(实测扣费账本)为运行态,重启清零(成本随上游活动变化,持久化旧值反而是脏数据)。

Clone this wiki locally