{"id":19602885,"url":"https://github.com/darkyzhou/seele","last_synced_at":"2025-10-06T07:58:18.753Z","repository":{"id":148378321,"uuid":"576355372","full_name":"darkyzhou/seele","owner":"darkyzhou","description":"面向云原生的在线评测系统. Cloud-Native oriented Online Judge system","archived":false,"fork":false,"pushed_at":"2025-09-20T06:24:25.000Z","size":7550,"stargazers_count":79,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-20T08:31:32.607Z","etag":null,"topics":["acm","cgroup","cloud-native","containers","linux","namespace","oci","online-judge","rust"],"latest_commit_sha":null,"homepage":"https://seele.darkyzhou.net","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/darkyzhou.png","metadata":{"files":{"readme":"README.en.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-12-09T16:30:42.000Z","updated_at":"2025-09-20T03:11:52.000Z","dependencies_parsed_at":"2024-10-24T05:59:06.065Z","dependency_job_id":"fcc7b83d-b78e-4e93-9291-dbe80feda3b9","html_url":"https://github.com/darkyzhou/seele","commit_stats":{"total_commits":395,"total_committers":4,"mean_commits":98.75,"dds":"0.020253164556962022","last_synced_commit":"4c9eb769df6fc860b4bca2a171d3af6c93a1ec66"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/darkyzhou/seele","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkyzhou%2Fseele","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkyzhou%2Fseele/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkyzhou%2Fseele/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkyzhou%2Fseele/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/darkyzhou","download_url":"https://codeload.github.com/darkyzhou/seele/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/darkyzhou%2Fseele/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276288441,"owners_count":25616948,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-21T02:00:07.055Z","response_time":72,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acm","cgroup","cloud-native","containers","linux","namespace","oci","online-judge","rust"],"created_at":"2024-11-11T09:26:47.005Z","updated_at":"2025-09-21T18:45:50.036Z","avatar_url":"https://github.com/darkyzhou.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\u003cimg alt=\"Banner\" src=\"docs/public/logo.svg\"\u003e\u003c/p\u003e\n\u003ch1 align=\"center\"\u003e\n  Seele\n  \u003cbr\u003e\n  \u003cimg src=\"https://github.com/darkyzhou/seele/actions/workflows/build.yml/badge.svg\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/v/release/darkyzhou/seele?include_prereleases\u0026label=version\u0026style=flat-square\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/darkyzhou/seele?color=FF5531\u0026style=flat-square\"\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003e\u003ca target=\"_blank\" href=\"https://github.com/darkyzhou/seele/blob/main/README.en.md\"\u003e[View in English]\u003c/a\u003e\u003c/b\u003e\n  \u0026nbsp;\n  \u003cb\u003e\u003ca target=\"_blank\" href=\"https://seele.darkyzhou.net/en\"\u003e[English Docs]\u003c/a\u003e\u003c/b\u003e\n  \u0026nbsp;\n  \u003cb\u003e\u003ca target=\"_blank\" href=\"https://seele.darkyzhou.net/\"\u003e[中文文档]\u003c/a\u003e\u003c/b\u003e\n\u003c/p\u003e\n\nSeele is a cloud-native online judge system, mainly targeting computer-related online course systems, programming competitions, and other scenarios. It serves as a judging service to receive user-submitted code, run it in a sandbox, and return judge reports.\n\nThe birth of Seele was to address the shortcomings of some popular open-source online judge systems in terms of scalability, extensibility, and observability. At the same time, its sandbox is based on the famous container runtime runc and uses [Rootless Containers](https://rootlesscontaine.rs/) to bring additional security. Currently, Seele serves the online course system of a university in South China, supporting various lab courses and tests, covering thousands of teachers and students from different colleges.\n\nThis project is the author's undergraduate graduation design and is in the early stages. There may be many shortcomings in terms of functionality and stability, so please bear with us. If you have any suggestions or find any bugs, please feel free to submit an issue and leave a star.\n\n## Scalability\n\nFrom the very beginning of its design, Seele has fully considered the importance of utilizing multiple CPU cores provided by the system to improve parallel processing capabilities for requests.\n\nIn addition, Seele can run in various environments. It can be run directly as a regular user on the system or scheduled with multiple instances using platforms like Docker and Kubernetes to handle user requests. When running on the Kubernetes platform, users can automatically scale horizontally based on system load, making full use of computing resources provided by multiple servers.\n\n## Extensibility\n\nSeele allows users to use YAML to describe the specific content of each step of the judge task in a structure similar to GitHub Actions and determine the dependencies, concurrency relationships, etc., between each step. To run any program, users only need to provide the corresponding container image names. Seele will automatically install these images and then start containers to run the specified programs.\n\nFollowing is a simple judge task, divided into three steps: adding source files, compiling source files, and executing programs. This judge task also provides a snippet of JavaScript code. When the judge task is executed, Seele will run this code to attach additional content to the returned judge report.\n\nIn this way, Seele delegates the responsibility for defining the judge process to the user, allowing them to freely customize the judge process to cope with complex and changing course requirements.\n\n```yaml\nreporter:\n  # Seele offers a global variable `DATA` representing the report object\n  javascript: |\n    const date = new Date();\n    return {\n      report: {\n        message: \"Hello at \" + date,\n        type: DATA.steps.prepare.status\n      }\n    }\n\nsteps:\n  prepare:\n    action: \"seele/add-file@1\"\n    files:\n      # Add a file named `main.c` using the following content\n      # You can also provide the content using http url\n      - path: \"main.c\"\n        plain: |\n          #include \u003cstdio.h\u003e\n          int main(void) {\n            printf(\"Hello, world!\\n\");\n            return 0;\n          }\n\n  compile:\n    action: \"seele/run-judge/compile@1\"\n    # Use the official gcc image from Docker Hub\n    image: \"gcc:11-bullseye\"\n    command: \"gcc -O2 -Wall main.c -o main\"\n    sources: [\"main.c\"]\n    saves: [\"main\"]\n\n  run:\n    action: \"seele/run-judge/run@1\"\n    image: \"gcc:11-bullseye\"\n    command: \"main\"\n    files: [\"main\"]\n```\n\n## Observability\n\nSeele provides good observability based on [OpenTelemetry](https://opentelemetry.io/), making it easy for maintainers to understand the current load of the judge system and set up related alerts. It mainly provides Tracing and Metrics indicators. Tracing can track the execution process of each input judge task in various components of the judge system. Metrics can provide information on the load of the judge system and the speed of processing requests.\n\nThe following image shows an example of monitoring Metrics indicators using [Grafana](https://grafana.com/).\n\n![Grafana Sample Panel](docs/public/grafana.png)\n\nThe following image shows Tracing data for a judge task collected and displayed by [Tempo](https://grafana.com/oss/tempo/).\n\n![Sample Tracing Data](docs/public/tempo.png)\n\n## Security\n\nSeele's sandbox is based on container technology provided by the Linux kernel, including [Control Group v2](https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html) and [Namespaces](https://www.kernel.org/doc/html/latest/admin-guide/namespaces/index.html). It also uses [Rootless Containers](https://rootlesscontaine.rs/), so it does **not** require `root` privileges. Compared to many sandboxes based on `ptrace`, it has better security, scalability, and does not significantly impact program execution efficiency. Compared to many sandboxes based on `seccomp`, it has better flexibility and does not require system call whitelists for each judge scenario.\n\nThe underlying sandbox is based on the famous container runtime [runc](https://github.com/opencontainers/runc/), allowing the sandbox to continuously provide fixes for security vulnerabilities appearing in the Linux kernel alongside updates, ensuring the correctness of container technology usage. We have prepared dozens of test cases for Seele's sandbox integration test, coming from [Qingdao University's judge system](https://github.com/QingdaoU/Judger), [Vijos](https://github.com/vijos/malicious-code), and [Matrix course system](https://matrix.sysu.edu.cn/about), covering malicious behaviors such as consuming computing resources and outputting large amounts of data. The results show that the sandbox can pass these test cases and protect system security.\n\n## Missing Features\n\nSeele is a relatively pure judge system with only one function: to receive externally submitted judge tasks, execute them, and return judge reports. It **does not have** other features that many other judge systems often possess, such as user management, course management, competition features, leaderboards, and web management frontends.\n\nSeele does not have the ability to save judge tasks. When the system is shut down or crashes during the judge task execution, it will not re-execute the judge tasks. Therefore, users need to maintain their own mechanism for saving and tracking submitted judge tasks.\n\n## Online Documentation\n\nFor more information, please visit the online documentation: [https://seele.darkyzhou.net](https://seele.darkyzhou.net)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkyzhou%2Fseele","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarkyzhou%2Fseele","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkyzhou%2Fseele/lists"}