Установка ejudge в Ubuntu 20.04 LTS

05.10.2014 - Alexey Nurgaliev

ejudge - система для проведения онлайн-соревнований по программированию. Документация системы

Будет рассмотрена установка версии 3.8.0.

Предварительная настройка

Загрузка и установка пакетов. Создается пользователь и группа ejudge. Также создаются рабочие каталоги.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash

#Зависимости и компиляторы
sudo apt-get update
sudo apt-get install -y sendmail ncurses-base libncurses-dev libncursesw5 \
  libncursesw5-dev expat libexpat1 libexpat1-dev zlib1g-dev libelf-dev \
  g++ gawk apache2 gettext fpc mc openjdk-8-jdk \
  libcurl4-openssl-dev libzip-dev uuid-dev bison flex \
  mono-devel mono-runtime mono-vbnc php7.4-cli perl \
  ruby python python3 gccgo locales net-tools

sudo locale-gen en_US.UTF-8 ru_RU.UTF-8

#Установка FreeBASIC x86_64 (нет в репозитории)
wget -O freebasic.tar.gz http://downloads.sourceforge.net/fbc/FreeBASIC-1.03.0-linux-x86_64.tar.gz?download
sudo tar -xvf freebasic.tar.gz -C /opt/
cd /opt/FreeBASIC-1.03.0-linux-x86_64/
sudo ./install.sh -i
cd

#Или FreeBASIC x86 для 32-битных ОС
#wget -O freebasic.tar.gz http://downloads.sourceforge.net/fbc/FreeBASIC-1.03.0-linux-x86.tar.gz?download
#sudo tar -xvf freebasic.tar.gz -C /opt/
#cd /opt/FreeBASIC-1.03.0-linux-x86/
#sudo ./install.sh -i
#cd

#Создание группы и пользователя ejudge
sudo groupadd ejudge
sudo useradd ejudge -s /bin/bash -m -d /home/ejudge -g ejudge
sudo adduser ejudge sudo

#Создание рабочего каталога judges
sudo mkdir -p /home/judges /home/judges/test_work
sudo chown ejudge:ejudge /home/judges /home/judges/test_work
sudo chmod 0755 /home/judges /home/judges/test_work

#Каталоги сервера
sudo mkdir -p /var/www/ejudge/cgi-bin
sudo mkdir -p /var/www/ejudge/htdocs
sudo chmod 0777 /var/www/ejudge/cgi-bin /var/www/ejudge/htdocs

#Включение модуля CGI
sudo a2enmod cgi
sudo service apache2 restart

Сборка ejudge

Собирать и устанавливать лучше под пользователем ejudge. Пример, как можно сменить пользователя: sudo su ejudge

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

cd /home/ejudge

#Загрузка ejudge
wget --no-check-certificate http://www.ejudge.ru/download/ejudge-3.8.0.tgz
tar -xvzf ejudge-3.8.0.tgz

cd ejudge

#Сборка
./configure --prefix=/home/ejudge/inst-ejudge \
            --enable-contests-home-dir=/home/judges \
            --with-httpd-cgi-bin-dir=/var/www/ejudge/cgi-bin \
            --with-httpd-htdocs-dir=/var/www/ejudge/htdocs \
            --with-primary-user="ejudge" \
            --with-exec-user="ejudge" \
            --with-compile-user="ejudge" \
            --enable-ajax \
            --enable-charset=utf-8

make
make install

Конфигурация

Запуск программы конфигурации: /home/ejudge/ejudge/ejudge-setup

Нужно указать Test Working Dir - /home/judges/test_work

Также нужно не забыть указать данные администратора в разделе Administrator identity

Сохранить конфигурацию в файл ejudge-install.sh.

Установка

Запустить от имени root: sudo /home/ejudge/ejudge/ejudge-install.sh

Запуск

Запускается система только от имени пользователя ejudge!

Переход в каталог установки: cd /home/ejudge/inst-ejudge/bin

Формирование ресурсов для веб-интерфейса: ./ejudge-upgrade-web

Запуск ejudge: ./ejudge-control start

Настройка apache2

Пример конфигурации виртуального хоста для apache2 версии 2.4 (файл /etc/apache2/sites-enabled/ejudge.conf, возможно потребуется удалить существующую конфигурацию):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<VirtualHost *:80>
    DocumentRoot /var/www/ejudge/htdocs

    ScriptAlias /cgi-bin/ "/var/www/ejudge/cgi-bin/"

    <Directory "/var/www/ejudge/cgi-bin">
        Options +ExecCGI +FollowSymLinks +Includes
        AllowOverride None
        Require all granted
    </Directory>

    <Directory "/var/www/ejudge/htdocs">
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

Перезапустить apache: service apache2 restart

ejudge будет доступен по адресу http://localhost/cgi-bin/serve-control

Настройка nginx

Пример настройки nginx + fcgiwrap.

Установка пакетов:

1
2
3
4
5
#Удаление apache
sudo apt-get remove --autoremove apache2

#Установка nginx
sudo apt-get install nginx fcgiwrap

Конфигурация сервера (файл /etc/nginx/sites-enabled/ejudge):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    server {

     listen 80;
     server_name localhost;
     root /var/www/ejudge/htdocs/;

     location ~ ^/cgi-bin/.* {
            gzip           off;
            root           /var/www/ejudge/;
            fastcgi_pass   unix:/var/run/fcgiwrap.socket;

            fastcgi_param  QUERY_STRING       $query_string;
            fastcgi_param  REQUEST_METHOD     $request_method;
            fastcgi_param  CONTENT_TYPE       $content_type;
            fastcgi_param  CONTENT_LENGTH     $content_length;

            fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
            fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
            fastcgi_param  REQUEST_URI        $request_uri;
            fastcgi_param  DOCUMENT_URI       $document_uri;
            fastcgi_param  DOCUMENT_ROOT      $document_root;
            fastcgi_param  SERVER_PROTOCOL    $server_protocol;

            fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
            fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

            fastcgi_param  REMOTE_ADDR        $remote_addr;
            fastcgi_param  REMOTE_PORT        $remote_port;
            fastcgi_param  SERVER_ADDR        $server_addr;
            fastcgi_param  SERVER_PORT        $server_port;
            fastcgi_param  SERVER_NAME        $host;
        }
    }

Конфигурация основана на статье в debian wiki.

ejudge также будет доступен по адресу http://localhost:80

Проверка установки

Если все сделано правильно, то административный интерфейс ejudge будет доступен по адресу http://localhost/cgi-bin/serve-control

Лицензия Creative Commons
Code More Team - GitHub