用gin+xorm+docker编写Online Judge后端
项目链接: https://github.com/Myriad-Dreamin/core-oj/tree/develop
思路:
- 将worker分为两种, compiler & judger
- compiler负责隔离编译环境,设置编译资源限制,权限限制
- judger负责隔离运行环境,sandboxize
- 设计结构体管理compilers/judgers
- gin-server只是作为core的测试服务器,可以利用compiler/judger的daemon自行编写服务
compiler
- daemon与compilers之间用grpc通信。
- compiler的资源受到daemon管理,当compiler超时无反应时,直接摧毁compiler重建一个新的compiler,并向上级报告严重错误
- compiler的language config可自定义,暴露的接口可以定义新的编译类型。
judger
- 隔绝所有网络环境。
- daemon与judgers之间用unix-socket通信。
- 资源限制与judger类似。
- 使用docker的用户映射,docker根用户root为物理机普通用户,除了共享容器的完全访问权限,没有其他任何权限。judger开辟子进程运行程序时,改变其uid-gid为运行时用户worker。worker只有目标程序的100权限,没有judger以及物理机其他的任何权限。
docker configuration
- 采用alpine最小镜像
- 支持c/c++/java/python2/python3的编译及运行。
- c/c++编译器为g++,java sdk为openjdk8,python2,3版本分别为2.7,3.7。
- 单个compiler占用外存273M,单个judger占用外存197M。
problem/code api
problem orm模型如下。
// Problem example
type Problem struct {ID int `xorm:"not null pk autoincr 'id'"`Name string `xorm:"'name'"`OwnerUID int `xorm:"owner_uid"`
}
OwnerUID为预设的用户uid。
大部分配置位于path/to/problem/Problem.ID/problem_config.xxx
中。
problem-config支持yaml/xml/toml/json。
yaml的配置示例如下:
judge:judge-type: acmtasks:- name: tasktime-limit: 1000000000memory-limit: 262144input-path: /codes/output-path: /codes/
special-judge:enable: truelanguage-type: c++11file-path: /spj.cpp
查看源码: https://github.com/Myriad-Dreamin/core-oj/blob/develop/problem-config/problem-config.example.yml
judge支持多种类型acm (目前只支持acm类型,未来可能支持ioi, interactive类型等),可以将问题分为多个子类型。每个子类型允许设置时间限制/空间限制,输入/输出路径。
special judge支持多种语言类型的special judge
,目前只支持testlib.lib
(c++)
Example
目前项目编写了一个使用core编写Online Judge后端的示例。
查看源码: https://github.com/Myriad-Dreamin/core-oj/tree/develop/gin-server
支持的api接口如下:
codeService.Get /code/:id@GET
查询code信息
codeService.GetContent /code/:id/content@GET
查询code代码
codeService.GetResult /code/:id/result@GET
查询code judge的结果
codeService.PostForm /code/postform@POST
添加code
codeService.Delete /code/:id@DELETE
删除code
problemService.Get /problem/:id@GET
获取problem信息
problemService.PostForm /problem/postform@POST
添加problem
problemService.Delete /problem/:id@DELETE
删除problem
problemService.Stat /problemfs/:id/stat@GET
查询problem所属文件夹的文件信息
problemService.Mkdir /problemfs/:id/mkdir@PUT
查询problem所属文件夹的文件信息
problemService.Ls /problemfs/:id/ls@GET
查看problem所属文件夹下某文件夹所有文件
problemService.Read /problemfs/:id/read@GET
查看problem所属文件夹的文件内容
problemService.Write /problemfs/:id/write@POST
上传文件到problem所属文件夹
problemService.Writes /problemfs/:id/writes@POST
上传多个文件到problem所属文件夹
problemService.Zip /problemfs/:id/zip@POST
上传压缩包到problem所属文件夹并解压
problemService.ReadConfigV2 /problemfs/:id/config@GET
读取problem-config
problemService.PutConfig /problemfs/:id/config@PUT
修改problem-config
注意事项:
- Alpine可运行文件需要经过linux,i386交叉编译,否则可能无法识别
- 合理配置Docker,防止远程代码恶意行为
用gin+xorm+docker编写Online Judge后端相关推荐
- docker 一键部署前后端项目 ruoyi
使用 docker 一键部署前后端项目 这里我以开源项目ruoyi 的 vue 前后端为例,想要通过 docker 一键跑起来,需要对项目做部分调整. 修改 springboot yml 的配置 ap ...
- 基于Go语言Gin+Xorm+Layui实现RBAC权限管理系统
项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...
- 基于Go语言Gin+Xorm的OA办公系统
项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...
- 基于Go语言Gin+Xorm实现的毕业设计神器
项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...
- 基于Go语言框架Gin+Xorm搭建的MVC项目
项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...
- linux启动php服务_群晖docker 实现nodejs为后端的简单web服务器 并连接数据库
前情摘要:虽然群晖有web station 作为开发简单网页的服务器首选,但是web station 里面最好用的技术栈还是基于LNMP或者LAMP的php开发环境.对于学习nodejs的同学可能丈二 ...
- go java web框架_java程序员10分钟可上手的golang框架golang实战使用gin+xorm搭建go语言web框架restgo...
1.首先上效果 是不是想起spring MVC? cd $GOPATH/src git clone https://github.com/winlion/restgo-admin.git 你将得到re ...
- 编写python程序实现分段函数_python分段函数如何编写?_后端开发
C语言自定义函数(图文详解)_后端开发 每个C程序都至少有一个函数,即主函数main(),在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大臃肿, ...
- docker ss-pannel_ss-panel-v3-mod_Uim 端口偏移后端教程
释放双眼,带上耳机,听听看~! 后端安装: 通过前面的文章,我们已经解释了,前端只是作为显示节点,具体控制还是需要通过后端完成. 后端我们如何控制呢? 通过Docker自带的端口映射功能,详细解释下, ...
- clion卸载+clion连接docker编写trt程序
一.卸载 # 删除安装文件夹 1.rm -r clion-2021.1.1 # 删除配置文件 2.sudo rm -rf ~/.config/JetBrains/CLion2021.1 二.连接doc ...
最新文章
- telnet命令的使用
- 一到关于js函数的前端面试题引发的血案
- statsmodels 笔记:seasonal_decompose 时间序列分解
- 学习Vue的一些看法
- FPGA学习及设计中的注意事项
- linux arm下硬件驱动程序放哪里,Arm-Linux摄像头驱动程序的移植
- 大数据_Flink_数据处理_流式数据源测试---Flink工作笔记0010
- [转载]Dynamic Database Switching in Rails - How to do it
- 通过ResNet-50进行面部表情识别(易懂)
- vue报错 Uncaught (in promise) NavigationDuplicated {_name:““NavigationDuplicated“... 的解决方法
- 白板推导系列Pytorch-隐马尔可夫模型(HMM)
- [转] 跨域资源共享 CORS 详解
- node+redis+阿里云短信验证码,注册手机验证码完整功能代码
- Java随机生成加减乘除运算,并记录结果
- ios代码中的内存泄露,内存检测工具leaks 检测不出来
- android直播音频开发准备
- STM32单片机的启动模式 三种BOOT模式介绍
- linux某服务启动失败,提示Authorization not available. Check if polkit...问题解决
- 从0开始带你成为jvm实战高手(狸猫技术窝)
- SMPTE ST 2110 概论(二)