XCPC 竞赛 Ubuntu 环境 DOMjudge Server 完整配置指南
一、前言:什么是DOMjudge ?
DOMjudge 是一款专为 XCPC(国际大学生程序设计竞赛) 设计的开源裁判系统,核心作用包括:
1.自动接收参赛队伍的代码提交,支持 C++、Python、Java 等主流竞赛语言;
2.编译运行代码,通过预设测试用例判断提交是否正确(AC/WA/TLE/MLE 等结果);
3.实时排名计算(按解题数、罚时排序),生成竞赛排行榜;
支持题目管理、队伍注册、权限分配(裁判 / 参赛队 / 观众角色分离);
4.兼容 ICPC、CCPC 等竞赛规则,是高校 / 区域赛常用的裁判系统。
本文将在VMare 17 虚拟机 参考文章安装 ,ubuntu-24.04.3-live-server-amd64.iso镜像环境下 参考文章配置,从基础依赖到完整部署,一步步引导配置 DOMjudge Server 8.2.3,所有代码可直接复制执行,关键步骤标注版本 / 地址注意事项。
二、核心前提说明
1.网络要求:需联网(下载软件包、依赖库);
虚拟机联网
2.虚拟机与Windows实现双向复制粘贴;
点击查看代码
sudo apt-get update
sudo apt-get install open-vm-tools-desktop
sudo apt-get install open-vm-tools
reboot
三、完整配置步骤
第一步:系统更新与基础依赖准备
点击查看代码
# 更新系统软件包列表(确保获取最新版本信息,避免依赖冲突)
sudo apt update && sudo apt upgrade -y
# 安装基础工具(后续编译、下载、解压需用到)
sudo apt install -y wget curl git build-essential
第二步:解决核心报错 —— 添加 PHP 8.2 官方源
点击查看代码
# 1. 安装添加 HTTPS 源所需的依赖工具
sudo apt install -y software-properties-common apt-transport-https lsb-release ca-certificates
# 2. 添加 PHP 官方 PPA 源(Ondrej 维护的官方源,支持所有稳定版 PHP)
# 注意:该源适用于 Ubuntu 20.04/22.04/24.04,其他版本需替换 $(lsb_release -cs) 为对应系统代号
sudo add-apt-repository ppa:ondrej/php -y
# 3. 再次更新软件包列表(让系统识别新添加的 PHP 源)
sudo apt update
第三步:安装 DOMjudge 必需依赖
版本注意
- PHP 版本:必须是 8.2(DOMjudge 8.2.3 官方兼容版本,避免 PHP 8.3 兼容性问题);
- 移除 php8.2-json:PHP 8.2 中 JSON 扩展已合并到核心,独立包不存在,否则会报 E: 软件包 php8.2-json 没有可安装候选
点击查看代码
# 安装核心依赖(含 Web 服务器、数据库、PHP 及扩展、编译工具等)
sudo apt install -y libcgroup-dev make acl zip unzip mariadb-server nginx \
php8.2 php8.2-fpm php8.2-gd php8.2-cli php8.2-intl php8.2-mbstring \
php8.2-mysql php8.2-curl php8.2-xml php8.2-zip composer ntp \
pkg-config debootstrap lsof procps gcc g++ pypy3 openjdk-17-jdk gfortran
第四步:下载 DOMjudge 8.2.3 源码(版本固定,避免兼容问题)
地址注意:
- 下载地址:使用 DOMjudge 官方稳定版源码(8.2.3 是长期支持版,bug 较少);
- 解压目录:固定在 /home/[用户名]/ 下(本文用户名为 accuber,需替换为你的实际用户名)。
点击查看代码
# 1. 进入用户主目录(替换 accuber 为你的 Ubuntu 用户名)
cd /home/accuber/
# 2. 下载 DOMjudge 8.2.3 源码包(官方地址,确保文件完整)
wget https://www.domjudge.org/releases/domjudge-8.2.3.tar.gz
# 3. 解压源码包(生成 domjudge-8.2.3 目录,后续编译安装依赖该目录)
tar -zxf domjudge-8.2.3.tar.gz && cd domjudge-8.2.3/
第五步:编译并安装 DOMjudge Server
注意事项:
- 编译时间:根据虚拟机 / 服务器性能,需 1-10 分钟,请勿中断执行;
- 安装路径:固定为 /opt/domjudge(DOMjudge 官方推荐路径,后续配置无需修改路径)。
点击查看代码
# 1. 配置安装路径(--prefix 指定安装到 /opt/domjudge,固定路径无需修改)
./configure --prefix=/opt/domjudge
# 2. 多线程编译(-j$(nproc) 自动识别 CPU 核心数,加快编译速度)
make domserver -j$(nproc)
# 3. 安装 DOMjudge 到指定目录(需 sudo 权限,写入系统目录)
sudo make install-domserver
第六步:初始化 MariaDB 数据库(DOMjudge 数据存储核心)
关键说明:
- 数据库自动配置:dj_setup_database 脚本会自动创建数据库、用户及权限,无需手动操作;
- 凭证文件:生成的 dbpasswords.secret 是数据库连接凭证,必须让 PHP 有权读取。
点击查看代码
# 1. 进入 DOMjudge 二进制脚本目录(固定路径,编译安装后自动生成)
cd /opt/domjudge/domserver/bin/
# 2. 生成数据库访问凭证(自动生成随机密码,保存到 dbpasswords.secret)
sudo ./dj_setup_database genpass
# 3. 初始化数据库(-s 选项自动处理数据库权限,避免手动配置出错)
sudo ./dj_setup_database -s install
# 4. 修复凭证文件权限(让 PHP-FPM 运行用户 www-data 能读取,否则数据库连接失败)
sudo chown www-data:www-data /opt/domjudge/domserver/etc/dbpasswords.secret
sudo chmod 644 /opt/domjudge/domserver/etc/dbpasswords.secret
第七步:配置 Nginx 服务器(Web 访问入口)
配置说明:
- 根目录:固定为 /opt/domjudge/domserver/webapp/public(DOMjudge 前端文件存放目录);
- PHP 转发:通过 fastcgi_pass 关联 PHP-FPM,确保 .php 脚本正常执行。
点击查看代码
# 1. 关联 DOMjudge 专属 Nginx 配置,同时删除默认配置避免端口冲突
sudo ln -s /opt/domjudge/domserver/etc/nginx-conf /etc/nginx/sites-enabled/domjudge
sudo rm -f /etc/nginx/sites-enabled/default
# 2. 覆盖 Nginx 配置文件(确保路径和转发规则正确,直接复制无需修改)
sudo tee /opt/domjudge/domserver/etc/nginx-conf << 'EOF'
# PHP-FPM upstream 配置(关联 DOMjudge 专用 FPM 进程)
upstream domjudge {
server unix:/var/run/php-fpm-domjudge.sock;
}
# HTTPS 转发适配(兼容后续可能的 HTTPS 配置)
map $http_x_forwarded_proto $fastcgi_param_https_variable {
default $https;
https 'on';
}
server {
listen 80; # 监听 80 端口(HTTP 默认端口,无需修改)
listen [::]:80;
server_name localhost; # 本地访问,无需修改
root /opt/domjudge/domserver/webapp/public; # 前端文件根目录(固定)
index index.php; # 优先解析 index.php(单入口应用)
charset utf-8; # 字符编码,避免中文乱码
send_timeout 36000s; # 延长超时时间,适配大文件提交
# 路由规则:所有请求转发到 index.php(DOMjudge 框架要求)
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# PHP 脚本处理:转发 .php 请求到 PHP-FPM
location ~ \.php$ {
try_files $uri =404; # 不存在的脚本返回 404,避免恶意请求
fastcgi_pass domjudge; # 关联 upstream domjudge
fastcgi_index index.php;
# 传递脚本路径(必须正确,否则 PHP 无法找到脚本)
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; # 加载默认 fastcgi 参数
}
# 禁止访问 .ht 隐藏文件(安全配置)
location ~ /\.ht {
deny all;
}
}
EOF
# 3. 验证 Nginx 配置是否正确(输出 success 则正常,否则检查语法错误)
sudo nginx -t
第八步:配置 PHP-FPM(优化运行参数)
路径注意:
PHP 配置路径:/etc/php/8.2/fpm/pool.d/(对应 PHP 8.2,若安装其他版本需修改路径)
点击查看代码
# 1. 关联 DOMjudge 专用 PHP-FPM 配置文件
sudo ln -s /opt/domjudge/domserver/etc/domjudge-fpm.conf /etc/php/8.2/fpm/pool.d/domjudge.conf
# 2. 添加优化配置(追加到配置文件末尾,无需修改原有内容)
sudo tee -a /etc/php/8.2/fpm/pool.d/domjudge.conf << 'EOF'
# 内存限制:从默认 128M 改为 512M,避免初始化内存不足
php_admin_value[memory_limit] = 512M
# 脚本最大执行时间:300 秒(5 分钟),适配题目判题过程
php_admin_value[max_execution_time] = 300
# 时区配置:Asia/Shanghai(避免日期时间警告)
php_admin_value[date.timezone] = Asia/Shanghai
# 开启错误显示(临时用于排查问题,生产环境可关闭)
php_admin_flag[display_errors] = On
# 开启错误日志(报错时可通过日志定位问题)
php_admin_flag[log_errors] = On
EOF
# 3. 重启 PHP-FPM 和 Nginx,使配置生效
sudo systemctl daemon-reload
sudo systemctl restart php8.2-fpm nginx
# 设置开机自启(避免服务器重启后服务失效)
sudo systemctl enable php8.2-fpm nginx
第九步:安装 Symfony 依赖(DOMjudge 框架核心)
报错说明
- DOMjudge 基于 Symfony 框架开发,缺少依赖会导致 500 错误,且源码中可能未自带 composer.json,执行 composer install 会报 Composer could not find a composer.json file。
点击查看代码
# 1. 进入 DOMjudge 前端应用目录(固定路径)
cd /opt/domjudge/domserver/webapp/
# 2. 手动创建 composer.json(适配 DOMjudge 8.2.3,直接复制无需修改)
sudo tee composer.json << 'EOF'
{
"name": "domjudge/domjudge",
"type": "project",
"description": "DOMjudge programming contest judge system",
"license": "GPL-2.0-or-later",
"require": {
"php": "^7.4 || ^8.0",
"ext-ctype": "*",
"ext-curl": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-filter": "*",
"ext-gd": "*",
"ext-hash": "*",
"ext-iconv": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-mbstring": "*",
"ext-mysqli": "*",
"ext-pcre": "*",
"ext-PDO": "*",
"ext-pdo_mysql": "*",
"ext-session": "*",
"ext-simplexml": "*",
"ext-tokenizer": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*",
"symfony/console": "5.4.*",
"symfony/dotenv": "5.4.*",
"symfony/flex": "^1.17|^2",
"symfony/framework-bundle": "5.4.*",
"symfony/http-client": "5.4.*",
"symfony/intl": "5.4.*",
"symfony/mailer": "5.4.*",
"symfony/mime": "5.4.*",
"symfony/process": "5.4.*",
"symfony/property-access": "5.4.*",
"symfony/property-info": "5.4.*",
"symfony/routing": "5.4.*",
"symfony/security-bundle": "5.4.*",
"symfony/serializer": "5.4.*",
"symfony/translation": "5.4.*",
"symfony/twig-bundle": "5.4.*",
"symfony/validator": "5.4.*",
"symfony/web-profiler-bundle": "5.4.*",
"symfony/webpack-encore-bundle": "^1.16",
"symfony/yaml": "5.4.*",
"twig/extra-bundle": "^2.12|^3.0",
"twig/twig": "^2.12|^3.0",
"doctrine/doctrine-bundle": "^2.5",
"doctrine/orm": "^2.11",
"doctrine/annotations": "^1.13",
"friendsofsymfony/rest-bundle": "^3.3",
"jms/serializer-bundle": "^4.0",
"nelmio/api-doc-bundle": "^4.10",
"sensio/framework-extra-bundle": "^6.2",
"league/flysystem": "^1.1",
"symfony/cache": "5.4.*",
"monolog/monolog": "^2.3",
"ramsey/uuid": "^4.2",
"symfony/asset": "5.4.*",
"symfony/expression-language": "5.4.*",
"symfony/security-csrf": "5.4.*",
"symfony/templating": "5.4.*",
"symfony/var-dumper": "5.4.*",
"symfony/web-link": "5.4.*"
},
"require-dev": {
"symfony/browser-kit": "5.4.*",
"symfony/css-selector": "5.4.*",
"symfony/debug-bundle": "5.4.*",
"symfony/maker-bundle": "^1.39",
"symfony/phpunit-bridge": "^5.4",
"symfony/stopwatch": "5.4.*",
"symfony/var-exporter": "5.4.*"
},
"config": {
"allow-plugins": {
"symfony/flex": true,
"symfony/runtime": true
},
"optimize-autoloader": true,
"preferred-install": {
"*": "dist"
},
"sort-packages": true
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php73": "*",
"symfony/polyfill-php74": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-php81": "*"
},
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},
"conflict": {
"symfony/symfony": "*"
},
"extra": {
"symfony": {
"allow-contrib": false,
"require": "5.4.*"
}
}
}
EOF
# 3. 手动创建 composer.lock(锁定依赖版本,避免后续更新冲突)
sudo tee composer.lock << 'EOF'
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "a1b2c3d4e5f67890abcdef1234567890",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
"php": "^7.4 || ^8.0",
"ext-ctype": "*",
"ext-curl": "*",
"ext-dom": "*",
"ext-fileinfo": "*",
"ext-filter": "*",
"ext-gd": "*",
"ext-hash": "*",
"ext-iconv": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-mbstring": "*",
"ext-mysqli": "*",
"ext-pcre": "*",
"ext-PDO": "*",
"ext-pdo_mysql": "*",
"ext-session": "*",
"ext-simplexml": "*",
"ext-tokenizer": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
"ext-zip": "*",
"ext-zlib": "*"
},
"platform-dev": [],
"plugin-api-version": "2.3.0"
}
EOF
# 4. 修复文件权限(让 www-data 用户可读取/修改,避免 composer 执行权限报错)
sudo chown www-data:www-data composer.json composer.lock
sudo chmod 644 composer.json composer.lock
# 5. 更换国内 Composer 镜像(解决下载慢/超时问题,必执行)
sudo -u www-data composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# 6. 安装依赖(--no-dev 不安装开发依赖,--ignore-platform-reqs 忽略版本小差异)
sudo -u www-data composer install --no-dev --ignore-platform-reqs --no-interaction
第十步:初始化缓存与修复全目录权限
点击查看代码
# 1. 清除并预热 Symfony 缓存(避免配置缓存导致的报错)
sudo -u www-data php bin/console cache:clear --env=prod
sudo -u www-data php bin/console cache:warmup --env=prod
# 2. 修复 DOMjudge 全目录权限(关键!确保 PHP 能读写文件/缓存/日志)
sudo chown -R www-data:www-data /opt/domjudge/domserver/
# 目录权限:755(读/写/执行)
sudo chmod -R 755 /opt/domjudge/domserver/
# 缓存目录:775(额外写权限,避免缓存写入失败)
sudo chmod -R 775 /opt/domjudge/domserver/webapp/var/
# 3. 最后重启一次服务,确保所有配置生效
sudo systemctl restart php8.2-fpm nginx
第十一步:获取登录信息并访问 DOMjudge
点击查看代码
# 输出管理员登录凭证(务必保存!首次登录必需)
echo "====================================="
echo "DOMjudge Server 配置完成!"
echo "====================================="
echo "访问地址:http://127.0.0.1(虚拟机本地访问)"
echo " http://[服务器IP](局域网/外网访问)"
echo "管理员用户名:admin"
echo "初始密码:"
sudo cat /opt/domjudge/domserver/etc/initial_admin_password.secret
echo "====================================="
echo "注意:首次登录后请立即修改密码(进入 Profile 页面)"
echo "配置检查:登录后点击 Config Checker,确保无标红报错"
echo "====================================="
第十二步:验证配置成功
打开虚拟机 / 服务器的浏览器,输入 http://127.0.0.1;
输入用户名 admin 和上述输出的初始密码,成功进入 DOMjudge 裁判管理后台;
点击左侧「Config Checker」,若所有检查项为绿色(无标红),说明配置完全正常。
第十三步、常见问题排查
-
访问报 500 错误:查看 PHP 日志 sudo tail -20 /var/log/php8.2-fpm.log,根据报错修复(通常是权限或依赖问题);
-
2.访问报 404 错误:检查 Nginx 配置中的 root 路径是否正确,重启 Nginx sudo systemctl restart nginx;
-
数据库连接失败:重新执行数据库初始化步骤(第六步),确保 dbpasswords.secret 权限正确;
-
Composer 下载超时:重新执行 sudo -u www-data composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 更换镜像
附配置成功图




浙公网安备 33010602011771号