Performance-oriented contest management system for IOI like contest
Important
🚧 work in progress, please wait until first release
- 🪶Lightweight: Only 50MB for the binary(
plugin is very large) - ⚡Lighting fast: Using
Rust+Grpc-Weband correct implementation/algorithm - 🚀Easy to use: By using docker compose, you can setup the system in minutes
- ⏱️Accurate: Directly use cgroupv2(no docker in judger), Report time deviation to frontend
- 🔒Secure: Using nsjail to sandbox user submitted code
Tip
Because we use grpc-web(server-side stream), HTTP2 is recommended, otherwise users won't be able to see realtime submit update(it's still very usable)
- 🐳Scalable: When deployed in cluster, you can scale the system to satisfy reasonable request.
- 🗄️Extensible: You can add any programing language by placing a
*.langfile inpluginsfolder - 🔭 Powerful
metrics/tracingusingOpen-Telemetry
Copy docker/quickstart file to your server and run docker compose up -d, then open https://localhost in your browser.
login as admin@admin and start play arounds.
- Copy
docker/productionfrom source code to your folder - run migration by running
docker compose up migration - generate config for judger by starting the judger once, and edit config
- generate config for backend by starting the backend once
- download and extract plugin(language support) of your choice to
./plugins
If you prefer to use default config, you can skip step 3 and 4.
See wiki for more details.
- install following package:
- From system package manager:
protobuf-devel,gcc - From rustup:
rustup,cargo,just - From their website:
docker,docker-compose
Then start reading documents in subfolder of your interest.
you may need to run
just prepareinjudger,backendsubfolder.
Tip
Set CONFIG_PATH to change the path to config file, default value is config.toml
See wiki for more detail
MDOJ contain three service:
- Frontend: Render first time html, serve wasm.
- Backend: Serve both frontend and web client(chrome...)
- judger: run user-submitted code and return resource usage(and output)
Tip
See DEV.md to understand how to get started.
See /backend/README.md, judger/README.md, frontend/README.md for more detail.