accuber

导航

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/ 更换镜像

附配置成功图

image
image
image
image

posted on 2025-11-13 18:44  accuber  阅读(0)  评论(0)    收藏  举报