
1. 青岛OJ系统简介与部署准备青岛OJQingdaoU/OnlineJudge是一款由青岛大学开发的开源在线判题系统专为编程竞赛和算法训练设计。作为ACM/ICPC竞赛训练平台的优秀替代方案它提供了完整的判题沙箱、比赛管理和用户评级体系。最新2.0版本采用Docker容器化部署方案大幅降低了环境配置复杂度。1.1 系统核心组件解析该OJ系统由三个关键微服务构成前端服务基于Vue.js的响应式Web界面支持多语言切换后端服务Django框架实现的判题核心包含用户认证、题目管理和提交处理判题机独立沙箱环境支持C/C/Java/Python等20编程语言提示系统默认使用80/443端口若冲突需提前规划。生产环境建议配置域名和HTTPS证书。1.2 硬件需求与系统选择实测部署建议配置测试环境2核CPU/4GB内存/50GB存储适合小型团队生产环境4核CPU/8GB内存/100GB SSD支持100并发判题操作系统兼容性首选CentOS 7.x官方测试最充分备选Ubuntu 20.04 LTS需手动调整部分依赖不推荐Windows系统Docker性能损耗较大2. 基础环境搭建与Docker配置2.1 宝塔面板初始化可选对于不熟悉Linux命令的用户建议先安装宝塔面板# CentOS安装命令 yum install -y wget wget -O install.sh http://download.bt.cn/install/install_6.0.sh sh install.sh安装后需完成安全入口设置记录随机路径LNMP环境安装Nginx1.20MySQL5.7PHP7.4防火墙放行8888/888/80/443端口2.2 Docker引擎安装优化官方一键安装可能遇到网络问题推荐使用国内镜像源# 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 使用阿里云镜像安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 配置镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://xxxx.mirror.aliyuncs.com] } EOF # 启动服务 sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl enable docker验证安装docker version # 应显示Client和Server版本信息2.3 Docker-Compose特殊处理很多教程忽略的依赖问题# 先安装必要工具 yum install -y python3-devel libffi-devel openssl-devel gcc # 使用pip3安装指定版本 pip3 install docker-compose1.29.2 -i https://pypi.tuna.tsinghua.edu.cn/simple # 验证安装 docker-compose -v # 应显示1.29.2版本常见问题处理若出现pip command not found需执行yum install python3-pipSSL证书错误可添加--trusted-host pypi.tuna.tsinghua.edu.cn参数3. OJ系统部署实战流程3.1 项目目录规范建议避免常见权限问题的最佳实践mkdir -p /opt/onlinejudge/{data,logs,backup} cd /opt/onlinejudge chmod 755 data3.2 克隆部署仓库的细节国内服务器推荐使用镜像加速# 原始命令可能较慢 git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git # 国内优化方案 git clone -b 2.0 https://gitee.com/mirrors_qduoj/OnlineJudgeDeploy.git目录结构说明OnlineJudgeDeploy/ ├── docker-compose.yml # 主配置文件 ├── .env # 环境变量 ├── data/ # 数据库持久化 └── initdb/ # 初始SQL脚本3.3 启动前的关键配置调整修改.env文件的必要参数# 时区设置 TZAsia/Shanghai # 数据库配置 MYSQL_ROOT_PASSWORDYourStrongPass123 MYSQL_USERojuser MYSQL_PASSWORDOjUser123 # 邮件服务需提前准备 EMAIL_HOSTsmtp.example.com EMAIL_PORT587 EMAIL_USERadminexample.com EMAIL_PASSWORDEmailPass123端口冲突解决方案# 修改docker-compose.yml services: oj-backend: ports: - 8000:80 # 将80改为80003.4 启动与初始化命令完整启动流程# 拉取镜像首次较慢 docker-compose pull # 后台启动服务 docker-compose up -d # 观察日志无报错可退出 docker-compose logs -f # 初始化数据库关键步骤 docker exec -it oj-backend python3 manage.py migrate docker exec -it oj-backend python3 manage.py inituser --usernameadmin --passwordadminadmin --actioncreate_super_admin4. 系统验收与故障排查4.1 基础功能验证清单前端访问http://服务器IP:端口应显示OJ首页后台登录http://服务器IP:端口/admin使用初始账号(root/rootroot)判题测试提交示例代码应返回Accepted4.2 常见问题解决方案问题1数据库连接失败# 检查MySQL容器状态 docker ps | grep mysql # 查看日志 docker logs oj-mysql # 常见原因密码包含特殊字符需转义问题2静态资源404错误# 重新收集静态文件 docker exec -it oj-backend python3 manage.py collectstatic # 检查Nginx配置 docker exec -it oj-backend nginx -t问题3判题机离线# 重启判题服务 docker-compose restart judge-server # 检查沙箱镜像 docker images | grep judge4.3 性能优化建议数据库调优-- 在MySQL容器内执行 SET GLOBAL innodb_buffer_pool_size1G; SET GLOBAL max_connections500;判题机配置# 修改docker-compose.yml judge-server: environment: - JUDGE_MAX_RUNNING20 # 根据CPU核心数调整定期维护脚本# 清理旧提交记录 docker exec -it oj-backend python3 manage.py clean_submission --days30 # 备份数据库 docker exec -it oj-mysql mysqldump -uroot -p$MYSQL_ROOT_PASSWORD onlinejudge backup.sql5. 生产环境进阶配置5.1 HTTPS安全部署使用Lets Encrypt证书示例# 在宿主机安装certbot yum install -y certbot # 获取证书需提前解析域名 certbot certonly --standalone -d oj.yourdomain.com # 修改Nginx配置 docker exec -it oj-backend vi /etc/nginx/nginx.conf # 添加SSL配置后重启 docker-compose restart oj-backend5.2 多判题机负载均衡横向扩展方案# 修改docker-compose.yml judge-server: deploy: replicas: 3 environment: - JUDGE_SERVER_ID1 # 每个实例ID不同5.3 定期维护方案推荐使用crontab定时任务# 每天凌晨备份 0 3 * * * docker exec -it oj-mysql mysqldump -uroot -p$MYSQL_ROOT_PASSWORD onlinejudge /opt/backup/oj_$(date \%Y\%m\%d).sql # 每周清理日志 0 4 * * 0 find /opt/onlinejudge/logs -type f -mtime 7 -exec rm {} \;我在实际部署中发现青岛OJ的Docker镜像对ARM架构支持不佳在树莓派等设备上需要重新编译镜像。建议x86_64架构服务器部署。另外判题服务的并发能力与CPU核心数直接相关在赛事期间可临时增加judge-server实例数量。