The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the ATEX AI Gateway listing page.
合规版积分预测社区(类 Manifold × Good Judgment Open × Kalshi 信息呈现)。 FastAPI + SQLite,积分只送不卖 / 不可流通 / 不可回兑 / 彻底去加密,合规优先。
见 deploy/:Dockerfile / docker-compose.yml / nginx.conf / .env.example /
realcast.service(systemd) / backup.sh(热备) / healthcheck.sh / 部署运维手册.md。
Railway 提供持久化卷,SQLite 可直接用,无需改 Postgres。配置文件已就绪:
railway.json + deploy/Dockerfile.railway(构建上下文为仓库根目录,与
deploy/Dockerfile 不同,别混用)。
控制台操作步骤:
New Project → Deploy from GitHub Repo,选本仓库
Settings → Volumes → Add Volume,挂载路径填 /data
(不挂卷 = 容器每次重建数据归零;库目录不存在时应用会拒绝启动并打印排查提示)
Variables 里设置:
| 变量 | 值 | 说明 |
|---|---|---|
ADMIN_TOKEN | 长随机串(≥32 位) | 运营后台/审核/结算必填 |
CORS_ORIGINS | 你的 Railway 域名 | 不要留 * |
DB_PATH | /data/platform.db | 镜像已默认,与卷挂载点对应 |
APP_TZ | 8(国内)/ 0(UTC) | 决定「今天是哪一天」的边界 |
UVICORN_WORKERS | 1 | 不可 >1,原因见下 |
SEED_ON_BOOT | 0 | 演示环境可设 1 自动播种(幂等) |
REDIS_URL | 可选 | 配了才能安全扩容到多 worker |
部署后访问 https://<你的域名>/api/health,确认 status=ok
为什么 UVICORN_WORKERS 必须是 1:未配 REDIS_URL 时实时广播走进程内
MemoryBackplane(app/core/backplane.py),一个 worker 就是一个独立广播域。
worker > 1 时,A 进程的市场状态变更推不到连在 B 进程上的客户端,不同用户看到的
概率会不一致。要扩容必须先配 REDIS_URL 切到 RedisBackplane,并建议同时迁 Postgres。
为什么 overlapSeconds = 0:Railway 默认在新旧容器间做短暂重叠实现零停机,
但重叠窗口内两个进程会同时写同一个 SQLite 文件,轻则锁竞争、重则损坏数据。
设为 0 = 先停旧再起新,代价是每次部署几秒中断。
提示:本机若设了
HTTP_PROXY,测试脚本访问127.0.0.1会被代理拦截(表现为 502), 运行时请加env -u HTTP_PROXY -u HTTPS_PROXY -u http_proxy -u https_proxy清除。
script-src(v0.7.1 起)与 style-src(v0.7.5 起)均已去掉 'unsafe-inline',
改为每请求生成的一次性 nonce。nonce 只能由后端在渲染 HTML 时注入,因此:
_render_index),不能由 nginx 等静态托管;deploy/nginx.conf 文件头说明)。sigma。
排行榜分两类:积分榜(sort=points,默认,反映活跃度)与技能榜(sort=skill)。
技能榜不按单点分排序,而按 Glicko-2 的保守下界 skill_rating - 1.96 × skill_rd:
skill_rd(评分偏差)直接量化「我们对这个人有多不确定」。下注越多 RD 越小;
长期不下注 RD 会回升(见 rating.rd_decay)。correct/resolved 在样本极小时噪声极大——新用户下 2 注
全中就是 100% 直冲榜首,样本一多又暴跌。用区间下沿后,低样本用户自然排后面,
真实水平随样本积累才浮上来。命中率另给 Wilson 置信下界(accuracy_conservative)。s_ij = score_j / (score_i + score_j),满足 s_ij + s_ji = 1:一场比较零和,
不会凭空造分,且比「谁押中谁赢 1 分」保留了幅度与校准信息。provisional: true,
?ranked_only=1 可只看正式榜位。为什么不用 Brier 直接评 prob_at_bet:prob_at_bet 是下注时的市场价格(群体
共识),不是用户自报的信念。拿 Brier 评它,评的是「群体共识准不准」,会出现
「押中 50% 热门(0.25) 输给 未中 40% 冷门(0.16)」的反向结论。改用「跑赢共识」的
标准化技能分 (y - p) / sqrt(p(1-p)) 后方向才正:逆势押中 +2.0 > 从众押中 +0.5 >
0 > 冷门未中 −0.5 > 热门翻车 −2.0。
EXTERNAL_REF_ENDPOINT 配置后,可拉取外部公开市场的概率作为参考水位,用于
冷启动播种、「群体预测 vs 外部共识」偏差分析、以及校验自有 Oracle 的合理性。
合规隔离(硬约束,改动前必读):
markets.external_ref_prob / external_ref_json,绝不参与结算——
结算只读 oracle_log 与自有权威源。smoke 测试有代码级断言守护这条边界
(结算/Oracle 路径出现 external_ref 即失败)。enabled=false,绝不伪造参考值。