-
开发态(EvaluateApp 在宿主机运行):
docker-compose.dev.yml- 仅启动依赖:MongoDB、Redis、MinIO;EvaluateApp 用 uv 在宿主机运行。
- 启动依赖:
docker compose -f docker-compose.dev.yml up -d - 启动 EvaluateApp:
cd evaluateapp && cp .env.example .env(按需编辑.env)- 安装依赖:
uv sync - 运行服务:
uv run uvicorn main:app --host 0.0.0.0 --port 8000 - 若评测走 Docker 后端,设置
.env中SANDBOX_BACKEND=DOCKER且指定DOCKER_IMAGE=<你的评测镜像>(宿主运行不支持self)。
-
部署态(EvaluateApp 在容器运行):
docker-compose.deploy.yml- 启动:
docker compose -f docker-compose.deploy.yml up -d --build - 该方案会构建
evaluateapp/docker/evaluateapp.Dockerfile,镜像基于:swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/python:3.12-slim
- 容器默认
SANDBOX_BACKEND=DOCKER且DOCKER_IMAGE=self,评测容器会复用服务容器的 Python 环境与依赖。 - 依赖服务与 EvaluateApp 同网段
aigame,evaluateapp暴露8000端口。
- 启动:
说明:根目录原有
docker-compose.yml保留兼容,推荐使用新文件分别在开发/部署环境中运行。
Redis,Mongodb,minio
需要设置data权限
chmod 755 ./init.sh
sh ./init.sh开发态依赖:
docker compose -f docker-compose.dev.yml up -d部署态服务:
docker compose -f docker-compose.deploy.yml up -d --build需要先安装 uv,之后
cd evaluateapp
cp .env.example .env
uv sync创建沙盒
# 创建一个不允许登录的系统用户和组
sudo groupadd sandboxgroup
sudo useradd --system --no-create-home --shell /bin/false -g sandboxgroup sandboxuser
# 创建监狱目录
sudo mkdir -p /opt/sandbox_jail
sudo chown root:root /opt/sandbox_jail
sudo mkdir -p /opt/sandboxes
sudo chmod 1777 /opt/sandboxes若要在宿主机上使用 Docker 作为评测后端:
- 在
evaluateapp/.env设置:SANDBOX_BACKEND=DOCKER与DOCKER_IMAGE=<包含评测依赖的镜像>。 - 注意:
DOCKER_IMAGE=self仅在“EvaluateApp 以容器运行”时可用于复用服务容器镜像; 宿主机运行时如需与服务容器相同环境,可构建服务镜像并指定其 tag:docker build -t aigame-eval:py312 -f evaluateapp/docker/evaluateapp.Dockerfile ..env中设置:DOCKER_IMAGE=aigame-eval:py312
使用pnpm进行启动,css采用tailwind
为了方便调试统一环境
需要修改host
sudo nano /etc/hosts
加入下面的
127.0.0.1 mongo
127.0.0.1 redis
127.0.0.1 minio
cd webapp
pnpm i
pnpm npx generate
cp .env.example .envcd webapp
pnpm devpnpm prisma generate
pnpm prisma db push题目目录使用统一结构,便于快速打包和在后台上传:
evaluate_example/
task_name/
judge/ # 评测脚本 judge.py 及参考标签/文件
data/ # 可选,提供给选手下载的数据集
test_submit/ # 提交示例(示例结果或代码骨架)
problem.yml # 元信息(标题/简介/起止时间/分值等)
desc.md # 题目详细描述(Markdown)
注意:detailedDescription 已从 problem.yml 分离为独立的 desc.md 文件。后台批量上传会优先读取压缩包中的 desc.md。
- 在
evaluate_example/中新增你的题目文件夹(英文名)。 - 将
judge.py和参考标签等放入judge/,示例提交放入test_submit/,可选数据集放入data/。 - 在根目录填写
problem.yml(无 detailedDescription 字段)以及desc.md(Markdown)。 - 使用打包脚本生成上传包:
cd evaluate_example
python3 pack.py path/to/task_name
# 或者批量打包当前目录下所有题目
python3 pack.py --all --root .脚本会在题目目录内生成三类子包:judge.zip、test_submit.zip、data.zip(可选),并最终生成 task_name.zip(包含上述子包 + problem.yml + desc.md)。
- 训练耗时较长(“训练久”)的题目:建议采用“标签上传”思路——选手线下训练,线上仅上传预测结果(例如
results.csv/results.json)。- 在
judge/内放置参考标签文件,judge.py做结果对齐与评分。 test_submit/提供一个可直接压缩上传的结果示例。
- 在
- 训练较快(“训练快”)的题目:建议采用“文件上传”思路——选手上传可执行代码,线上快速运行并评分。
- 在
test_submit/提供最小可运行示例代码骨架(如main.py)。 judge.py负责拉起/校验代码产出的结果并打分。
- 在
最后在“管理后台 → 题目管理 → 批量上传”页面上传 task_name.zip 即可;若同名题目需更新,可选择“覆盖”。
项目包含一些用于数据库初始化和数据生成的辅助脚本,位于 webapp/scripts 目录下。
重要: 直接使用 node 运行这些脚本会失败,因为它们需要加载 .env 文件中的数据库连接等环境变量。请使用下面定义的 pnpm 命令来运行它们。
首先,确保你已经根据 .env.example 创建了 .env 文件:
cd webapp
cp .env.example .env然后,你可以使用 pnpm 运行以下脚本命令 (我们将在下一步中把这些命令添加到 package.json):
初始化数据库,主要用于测试数据库连接。
用法:
cd webapp
pnpm db:init创建一个默认的管理员账户。如果已存在管理员或用户名为 admin 的账户,则不会创建。
- 默认用户名:
admin - 默认密码:
123456
用法:
cd webapp
pnpm db:admin初始化MinIO存储桶,确保存储桶存在并设置为公共读取权限。脚本会创建名为 aigame 的存储桶。
用法:
cd webapp
pnpm minio:init为数据库生成一套完整的测试数据,包括竞赛、题目、队伍、用户、提交记录和排行榜。
注意: 此脚本会先清空数据库中除 admin 用户外的大部分数据,请谨慎在生产环境中使用。
用法:
cd webapp
pnpm db:seeddocker run --rm swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mongodb/mongodb-community-server:8.0.13-ubuntu2204 id -u mongodb