Skip to content

Latest commit

 

History

History
36 lines (24 loc) · 6.23 KB

backend-api-and-operations.md

File metadata and controls

36 lines (24 loc) · 6.23 KB

账号、配置与部署

入口cmd/retrom创建PostgreSQL、Redis、受管Storage、runtime工具和HTTP服务。应用启动应用19表DDL及索引迁移,加载已验证Provider;空release实例只可在/setup一次初始化管理员。RETROM_MODE=test仅供隔离开发,自动创建明确测试管理员;生产不要启用测试模式。

账号密码使用已锁定Argon2组件及密码blocklist,验证后短事务再次围栏确认同一credential/active User,防密码变化后的旧验证创建新会话。密码变化增加session_version并撤销旧会话,selfchange生成新cookie。邀请/重置hash token一次消费、可撤销;重新创建reset撤销旧记录并增加其版本。账号停用/删除撤销有效会话和待用链接。Redis限流按IP/账号hash作用域原子TTL执行,存储不可用失败关闭。

登录会话最长有效7天,连续3天没有成功认证请求时失效。每次成功认证将闲置到期时间顺延3天,但不得超过创建会话后的第7天;到期后必须重新登录。浏览器登录Cookie的Max-Age为7天,从签发时固定计算,请求续期不重发Cookie;HttpOnly、SameSite=Strict及HTTPS下的Secure保持启用。新时长用于新建会话,已有会话仍遵循其已保存的绝对到期时间和浏览器Cookie期限,不批量改写历史记录。

配置 含义
RETROM_DATABASE_URL PostgreSQL连接URL,凭据通过私有环境注入
RETROM_REDIS_ADDR Redis地址或TLS/认证URL
RETROM_DATA_DIR 可写持久根
RETROM_DEPENDENCY_ROOT 密码blocklist的已验证只读依赖根
RETROM_RUNTIME_ROOT / RETROM_NODE 自足runtime工具根与Node24入口
RETROM_PROVIDER_ROOT 含active.json/installed的只读Provider根
RETROM_PUBLIC_ORIGIN 精确宿主origin
RETROM_RPG_RUNTIME_ORIGIN_TEMPLATE 独立隔离origin,使用{runId}
RETROM_HTTP_ADDR 内部监听地址
RETROM_WEB_ROOT 含public/runtime-isolation的固定Web资产根,镜像已打包该目录

本地独立运行端口需要给 Web 进程传入同一 RETROM_RPG_RUNTIME_ORIGIN_TEMPLATE。页面 CSP 仅追加该配置中明确的 http://{runId}.<域名>.localhost:<端口> 来源,支持隔离验收分配的随机端口;外部 HTTP 域名和无效模板不扩大许可范围。标准 PFB 的 localhost:3000 与生产 HTTPS 来源继续适用。

Node工具和Provider必须与版本控制的 data/runtime-inputs.json 配套。默认准备和镜像构建共同认证其中三个归档、实际解包字节和源码身份;显式build context也必须属于该认证集合。固定正式发行与开发运输输入的流程见配套依赖输入。当前描述固定正式 runtime Release;发行身份、归档大小和摘要由该描述决定,候选验收不能代替正式发行。生产镜像只放离线工具、已验证Provider、可由服务UID读取的公共blocklist和Go binary,运行不依赖源码或PFB。

生产同时运行PostgreSQL、Redis、Go、Web及可信反向代理。数据库和Redis不暴露公网;持久根仅服务UID可写。客户端IP默认信任内网与回环地址的直接代理,不需要配置代理网段。内网包括IPv4 RFC1918和IPv6 ULA;代理必须覆盖X-Forwarded-For。从右向左跳过内网代理,采用首个公网地址;整条链均为内网时采用最左侧客户端地址。公网直连忽略转发头,重复或超长的转发头,以及解析到无效地址时回退到直接连接地址。代理把/api/v1和/runtime交给Go,隔离host只代理/__retrom/runtime-isolation/,其他路径404;TLS、wildcard DNS和证书由部署者配置。健康ready端点仅内部验证依赖可用,不能将200当全部产品通过。

内容归一化的 runtime 调用上限为60分钟;扫描中单个游戏的准备预算为90分钟。内容替换提交立即返回202和操作ID,使用独立的一个执行位与两个FIFO等待位,满额返回503,同一游戏并行提交返回409;不占用游戏扫描的两个执行位。替换从接收起最多90分钟,包含等待、内容读取、归一化、校验和受管包发布。HTTP仍统一限制10分钟,Next.js外部rewrite恢复5分钟;替换进度查询、取消与最终结果均使用短请求,不要求代理等待后台准备。PFB网关和正式Nginx示例原有8小时读取超时继续服务运行传输,不构成内容替换的执行预算。

内容替换只在Redis保留每个游戏最新操作及24小时有效期,状态变化时续期,读取不续期,不新增业务表或任务列表。关闭页面不取消已接收操作;管理员可以在管理详情重新查询。服务停止取消已接收准备,重启后查询遗留进度得到interrupted,不自动续跑;若发布已开始,则按本次分配文件ID核对提交结果,确认提交才报告completed,无法核对时保留候选文件并允许再次查询。新操作覆盖旧进度或Redis过期/丢失后,旧操作ID返回404,界面提示核对游戏资料。崩溃残留由现有受管文件维护按24小时宽限与引用检查回收,外部来源不进入清理范围。

管理员目录浏览使用 GET /api/v1/admin/source-directories?path=/,返回 {items:[{name,path}]}。来源inspect、游戏扫描、BIOS扫描和内容替换均提交绝对 path;不配置来源根或目录白名单。操作系统读取权限与容器实际挂载决定可访问范围,来源文件保持只读,游戏与BIOS复制到受管存储。部署只挂载需要导入的素材目录,浏览能力本身不扩展宿主机挂载。

游戏的共享读取投影包含必需的 lastPlayedAtMs,值来自当前登录用户的 recent_game_tab,无游玩记录时为 null。普通列表、详情、收藏及最近列表都使用同一投影;分页完成后只读取所选游戏的当前用户记录,管理员也不会读取其他用户的游玩时间。成功运行继续更新既有最近记录,无新表或重复存储。

BIOS列表的 requirements 按核心透传runtime要求大小、SHA256与MD5,未声明值为null;同一BIOS key涉及多个核心时保留各自要求。列表原有 sizeBytes/sha256 仍表示已安装文件实际事实。待审缺失清单只返回key、名称与coreId,校验信息集中在运行依赖查看。