Files
KF-OnlineJudge/deploy

本地开发依赖

compose.dev.yml 只提供 PostgreSQL 和 RabbitMQ,端口绑定 localhost。 先复制 .env.example 为 .env,然后在仓库根目录运行:

make infra-config
make infra-up
make infra-down

infra-down 保留数据卷;不要把示例口令用于正式部署。 API 存活检查和前端预览不依赖这些容器,可以先独立启动。 该 Compose 不运行判题 Worker 或不可信代码。

镜像固定具体维护版本(PostgreSQL 18.6、RabbitMQ 4.3.6),正式实验前另锁镜像摘要。 配置检查只验证 Compose 结构;成功启动、实际健康与备份恢复需要单独验证。 后续受控主机服务和最小权限沙箱启动器配置放在本目录。

官方镜像说明:PostgreSQL、 RabbitMQ。

单机 helper 工厂

kf-sandbox factory --config /etc/kf-judge/runtime.json 是 Root 服务入口; 普通 Worker 使用配置中 state_root/factory/control.sock 的普通用户客户端。 deploy/kf-sandbox-factory.service 给出有限服务预算示例,安装前由可信管理员 核对固定二进制、不可写 GNU 镜像/配置、Worker UID/GID,以及与服务自身 cgroup 分离的 Root 所有任务委派根。工厂实际读回服务 cgroup 限额,应用/读回任务总预算; 每次编译和测试点仍须通过已有完整隔离门控。服务文件本身不证明这些条件成立。

工厂只接收有界 run ID,无排队:槽位满、重复 ID 或未知字段立即拒绝。 每次申请使用全新单线程 helper,固定继承已认证的连接与工厂生命线; 额外控制帧、断开或生命线消失会终止整棵任务树。ID 先写入有限持久记录 (最多 4096 个,跨重启拒绝重放);容量用尽需要管理员在所有任务停止、已核对 回收后安排新记录周期,不自动删除记录。清理失败保留身份租约并停止新分配; 重启只根据已记录归属和 inode 回收,未知/外来内容保留并拒绝启动。

kf-worker judge-submission 是受控本地适配入口。常驻 kf-worker serve --config 使用有界 AMQP 通知和经过服务身份认证的 Coordinator claim;配置与依赖见 判题工程说明。 它验证不可变清单摘要,C17/C++20 仅映射到固定 GNU 命令,编译一次; 成功产物经完整清理后封印并计算 SHA-256,每点分别申请 helper、stdin 与工作区。 期望值逐点读取,留在比较端,不传给工厂/用户文件系统。 新增锁定 sha2 0.10.9 仅供 Worker 验证输入及编译产物摘要; Sandbox 同版本仅为独立 VM 测试数据生成的开发依赖,Engine 不依赖加密或 OS 库。

单机提交服务的启动与停止

  1. Backend Alembic 迁移;创建分别仅继承平台/协调器 NOLOGIN 角色的专用登录账号, 平台角色只可插入初始评测,执行状态仅由 Coordinator 写入。
  2. 普通平台服务持有私有工件目录;使用应用服务导入不可变题目和创建测试账号。
  3. 验证固定 GNU 镜像、Root 配置及工厂服务/任务 cgroup 的真实上限,再启动工厂。
  4. 独立启动 API、Coordinator、outbox publisher 和普通 Worker;单机 HTTP/AMQP 仅数值 loopback,PostgreSQL loopback/Unix socket。任何入口都不自动创建表。
  5. Coordinator readiness 验证数据库和权限;仍需独立 VM 验证真实执行门控。 Root 工厂不可持有平台/MQ/数据库口令,用户运行镜像不含服务文件。
  6. 先向 Worker 发送 SIGTERM,使当前任务取消/清理,再停止 publisher/API/Coordinator, 最后停止工厂和本地依赖。强制死亡后的旧 attempt 必须撤销并取得实际停止证明; cleanup_failed 不等于普通终态,先核对保留资源再由管理员恢复工厂/Worker。

这些入口和顺序不表示生产部署已完成。隔离/超限与用户程序仅在无 NIC、无宿主共享 挂载、无业务凭据且整体上限已读回的独立测试 VM 内验收。开发 Compose 仍只提供可信 数据库和 broker,不在宿主或业务服务器运行用户代码。workflow 如需启用由指定 GitHub 私有仓库承载,并设置有限并发;Gitea 只保存逐阶段工程提交。