background
A
w
W
H
1
g
W
+
O
(
f
i
<
o
H
t
$
c
s
S
p
D
U
R
8
E
j
*
X
)
$
w

favicon
favicon
回归终端
 

平台架构概览

Reverier-Xu at 2026-01-28 11:20:46 3.8+ R2SPL

本页介绍回归终端的运维架构,重点说明平台服务与外部组件之间的关系。部署前可以先通过本页确认必需服务、可选服务、外置方案和关闭某些组件后的功能变化。具体安装命令见后续部署指南。

核心边界

回归终端的运行时核心是 ret2shell 平台服务。平台服务对外提供 Web 页面、HTTP API、WebSocket、镜像仓库代理和题目实例控制接口,对内连接数据库、缓存、消息队列、文件存储、日志系统和 Kubernetes 集群。

Browser / Player / Admin
        |
        v
Gateway / Ingress / Nginx / Caddy
        |
        +--> static frontend
        |
        v
ret2shell platform service
        |
        +--> PostgreSQL          persistent platform data
        +--> Valkey / Redis      sessions, tokens, cache, rate limit
        +--> NATS JetStream      asynchronous jobs and event fanout
        +--> local / PVC files   game bucket, media, logs, captures
        +--> VictoriaLogs        optional centralized log query
        +--> Kubernetes API      optional dynamic challenge instances
        |       |
        |       +--> challenge Pods / Services in ret2shell-challenge
        |       +--> image pull from registry / Docker Hub / GHCR / Harbor
        |
        +--> registry API        optional managed challenge image upload/search
        +--> SMTP / captcha / OAuth providers as optional integrations

平台服务可以运行在裸机、Docker Compose 或 Kubernetes 中。动态题目环境由 Kubernetes 编排,平台服务通过 kubeconfig 或集群内 ServiceAccount 访问 Kubernetes API。平台服务与题目容器可以位于同一个集群,也可以分别部署在不同环境中。

组件角色

组件是否必需关系与职责替换与关闭方式
ret2shell 平台服务必需承载前后端、权限、比赛逻辑、题目实例控制、脚本执行入口和管理 API。支持二进制、容器和 Helm 部署;前端静态文件可由平台内置静态服务托管,也可交给 Nginx、Caddy、Ingress 或 CDN。
PostgreSQL必需保存用户、队伍、比赛、题目、提交、公告、日历、配置、审计记录、OAuth 绑定等持久数据。Helm 可使用内置 PostgreSQL,也可通过 postgresql.mode = external 指向云数据库或自维护数据库;该服务需要保持可用。
Valkey / Redis必需保存会话相关缓存、一次性令牌、接口限速状态、部分运行时缓存和短期状态。Helm 可使用内置 Valkey,也可通过 valkey.mode = external 指向 Redis/Valkey、Redis Cluster 或 Sentinel 服务;该服务需要保持可用。
NATS JetStream必需提供后台任务和事件队列,平台用它处理邮件、事件落库、IP 记录、计分板更新、异常事件等异步流程。Helm 可使用内置 NATS,也可通过 nats.mode = external 指向外部 NATS JetStream;该服务需要保持可用。
文件存储必需bucket 保存比赛/题目仓库、附件、checker、静态资源;media 保存用户上传图片;logcaptures 保存本地日志和抓包/录制文件。当前使用文件系统语义。裸机可使用本地盘或挂载盘,Kubernetes 中建议使用 PVC、CSI、NFS 等持久卷;这些目录需要和数据库一起备份。
Kubernetes可选题目需要在线环境时,平台通过 Kubernetes API 创建 ret2shell-challenge 命名空间下的 Pod 和 Service,并按标签清理过期实例。可设置 [cluster].enabled = false 关闭动态容器能力。当前版本的动态题目环境以 Kubernetes 作为编排层。
Registry可选受控镜像仓库用于后台上传、搜索和代理挑战镜像,平台可通过 /api/cluster/registry 与前置网关暴露的 /v2 路径进行管理。可使用 registry.mode = internal 部署内置 registry:3,也可用 registry.mode = external 接入 Harbor、云厂商仓库或自维护 Docker Registry。无需平台管理镜像时,可设置 registry.mode = disabled 或不配置 [cluster.registry],并在题目 env.toml 中直接填写 Docker Hub、GHCR 等外部镜像地址,由 Kubernetes 节点直接拉取。
VictoriaLogs可选接收平台结构化日志,支撑后台日志检索、按 trace 查询和异常排查。可使用 victoriaLogs.mode = internal,也可用 victoriaLogs.mode = external 指向已有 VictoriaLogs。设为 disabled 后,平台仍写本地日志;集中检索可由 Loki、ELK、云日志或节点侧采集器承接。
网关 / 反向代理生产环境推荐统一暴露 Web、API、WebSocket、大文件上传和可选 registry /v2 代理,同时负责 TLS、真实 IP、压缩和静态文件。可使用 Nginx、Caddy、Kubernetes Ingress、云负载均衡或 CDN 回源;小规模内网测试也可直接暴露平台端口。
SMTP可选发送注册验证、找回密码等邮件。[email].enabled = false 时关闭邮件能力;开启后可接入标准 SMTP 服务。
Captcha Provider可选平台内置 PoW/image 校验,也可接入 reCAPTCHA v3 或 hCaptcha。可按 [captcha].validatornoneimagepowrecaptcha_v3h_captcha 之间切换。
ret2script内嵌能力ret2shell 通过 Rune/ret2script 模块执行题目 checker、动态环境变量生成、流量映射脚本和生命周期脚本。平台服务内置对应执行能力;ret2script 命令行主要用于题目作者在本地测试 checker/main.rx
ret2boot推荐部署入口生产环境可用的交互式安装器,负责预检、Kubernetes/Helm/网关/平台部署规划和状态持久化。适合单服务器快速部署;安装完成后无需常驻运行;复杂场景可以改用手工二进制、Docker Compose 或 Helm 部署。

“内置”表示 Helm 或 ret2boot 可以一并部署这些服务。PostgreSQL、Valkey、NATS 是运行必需项,并且都支持外置。Registry、VictoriaLogs、Kubernetes、SMTP、Captcha Provider 可按比赛需求启用、接入外部服务或关闭。

数据与控制流

常规访问路径

用户访问平台时,浏览器请求通常先到网关。网关把 / 路径交给静态前端,把 /api 和 WebSocket 请求转发给 ret2shell 平台服务。启用受控 registry 后,网关还可以把 Docker Registry 标准的 /v2 路径重写到平台的 registry 代理接口。

平台收到请求后会读取 PostgreSQL 中的业务数据,使用 Valkey 处理登录态、短期令牌和限速状态,并把耗时或需要异步传播的工作投递到 NATS JetStream。后台 worker 再从 NATS 拉取任务,例如发送邮件、记录事件、更新计分板或写入 IP 访问记录。

题目仓库与文件

比赛与题目文件同时依赖数据库和文件系统。bucket 目录保存题目结构、描述、附件、checker、环境配置和 Git 记录;media 目录保存平台上传图片;本地日志、抓包和录制文件也分别落在配置指定的目录中。灾备时需要把 PostgreSQL 和这些持久化目录纳入同一恢复点。

动态题目环境

题目配置了在线环境且 [cluster].enabled = true 时,平台会读取题目 env.toml,先用 ret2script/Rune 执行 environ() 生成动态环境变量,然后在 Kubernetes 中创建 Pod 与 Service。Pod 使用题目配置中的镜像地址,Service 根据外部暴露需求选择 NodePortClusterIP

平台会给 Pod 和 Service 打上 ret.sh.cn/* 标签,用于按用户、队伍、比赛、题目和流量标识查询与清理。平台启动时还会确保存在 ret2shell-challenge 命名空间,并创建默认的 internet-disabled 网络策略,用于限制标记为不可联网的题目实例。

配置 traffic 脚本后,平台会把 Kubernetes Service 信息交给脚本的 expose() 函数,由脚本返回用户可见的访问地址。这个脚本可以对接你自己的网关、端口映射、反向代理、frp、云负载均衡或 DNS 规则;平台只负责把 Kubernetes 层的真实状态交给脚本。

镜像来源

Registry 是可选的镜像管理组件。启用 registry 时,平台可以提供镜像上传、仓库搜索和 /v2 代理能力,适合将比赛镜像纳入平台权限体系管理的场景。内置 registry 是 Helm/ret2boot 提供的默认实现,外部 Harbor、云镜像仓库、私有 Docker Registry 也可以承担同样角色。

无需平台管理镜像时,可以直接关闭 registry。此时题目环境仍然可以运行,只要 env.toml 里的镜像地址能被 Kubernetes 节点拉取即可,例如 docker.io/library/nginx:latestghcr.io/org/challenge:tag 或私有仓库地址。私有仓库认证应通过 Kubernetes 的 image pull secret 处理,并在题目环境配置中引用。

日志与审计

平台始终会写本地日志。配置 VictoriaLogs 后,结构化日志还会被批量写入 VictoriaLogs,后台的日志查询接口再代理 LogSQL 查询。NATS 中的事件用于平台内部状态传播和业务事件落库;VictoriaLogs 面向运维检索,NATS 面向平台内部异步流程。

关闭 VictoriaLogs 后,仍可通过本地文件、节点日志采集器或第三方日志平台观测服务。正式比赛通常建议保留一个集中式日志方案,尤其是开启动态环境、镜像上传或多管理员协作时。

常见部署形态

全部运行在 Kubernetes

这是 Helm chart 默认覆盖最完整的模式。ret2shell、PostgreSQL、Valkey、NATS、registry、VictoriaLogs 和持久卷都由同一个 Helm release 管理,平台通过集群内 ServiceAccount 控制题目命名空间。它适合已经接受 Kubernetes 运维模型、希望把平台和题目算力放在同一资源池中的部署。

平台在集群外,题目在 Kubernetes

平台可以用裸机或 Docker Compose 运行,通过 kubeconfig 访问外部 Kubernetes 集群。这个模式适合把平台服务、数据库和对象文件放在稳定主机上,把题目容器调度交给独立集群。此时要特别确认平台到 Kubernetes API、registry、VictoriaLogs、数据库、缓存和队列的网络连通性。

不启用动态题目环境

比赛题目无需在线容器时,可以关闭 [cluster].enabled。平台仍可承载账号、队伍、公告、Wiki、附件、提交、计分和静态题目内容;“启动实例”“容器日志”“流量映射”等功能随动态容器能力一同停用。此模式下 registry 通常也可以关闭,镜像仓库从平台运行路径中移除。

使用 ret2boot 引导

ret2boot 的定位是把上面的部署选择收敛成一个交互式安装流程:它收集公网入口、TLS、服务部署模式、存储模式、Kubernetes 发行版和 Helm values,再执行预检、集群初始化、网关部署和平台安装。它可以生成内置、外置或关闭可选组件的方案。安装完成后,平台运行时仍然遵循本页描述的组件关系。