오픈소스 online-judge 구축기 (코드 표절 검사가 되는)

open-source 기반 online-judge 시스템 구축을 하고 싶었다. MOSS(코드 표절검사기능)이 탑재된걸로..
그러다가
https://github.com/DMOJ/online-judge
이걸 찾았다.

충분히 docker 기반으로 하나 만들어줄 수 있을법싶은데도.. 안되어있더라 ㅜㅜ
일단은.. https://docs.dmoj.ca/#/site/installation 에 안적혀있는 에러들을 수정해가며.. 다음과 같이 구축해보았다..

prerequisites

docker pull ubuntu:20.04

그리고 online judge 접속을 위한 OJ_PORT 하나를 연다.. ssh 접속해서 관리하려면 ssh를 위한 22 포트도 열자 :)

docker run --name oj_server -p OJ_PORT:80 SSH_PORT:22 -dit ubuntu:20.04
docker attach oj_server
apt-get update
apt-get install sudo

apt-get install git gcc g++ make python3-dev python3-pip libxml2-dev libxslt1-dev zlib1g-dev gettext curl redis-server
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
apt-get install nodejs
npm install -g sass postcss-cli postcss autoprefixer

apt-get install mariadb-server libmysqlclient-dev

/etc/init.d/mysql start

mysql -uroot -p

DB_PASSWORD를 고민한 뒤, mariadb> 가 뜨면 다음을 입력해주자

mariadb> CREATE DATABASE dmoj DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
mariadb> GRANT ALL PRIVILEGES ON dmoj.* to 'dmoj'@'localhost' IDENTIFIED BY 'DB_PASSWORD';
mariadb> exit
apt-get install python3.8-venv
python3 -m venv dmojsite
. dmojsite/bin/activate

git clone https://github.com/DMOJ/site.git
cd site
git checkout v2.1.0  # only if planning to install a judge from PyPI, otherwise skip this step
git submodule init
git submodule update

sed -ri 's/mistune/mistune<2/' requirements.txt # https://github.com/DMOJ/online-judge/commit/0975d4d00ed58c9da888e0fcc3f9acdf5d66c48a

pip3 install wheel
pip3 install -r requirements.txt
pip3 install mysqlclient pymysql
wget https://raw.githubusercontent.com/DMOJ/docs/master/sample_files/local_settings.py -O dmoj/local_settings.py

그리고 이게 에러가 없는지 보자

python3 manage.py check

Compiling assets

다음을 실행하면, dmoj/local_settings.py 에서 세팅한 STATIC_ROOT 안에 static file들이 생기게 된다.

./make_style.sh
python3 manage.py collectstatic
python3 manage.py compilemessages
python3 manage.py compilejsi18n

local_settings.py에 들어가서, DATABASE 밑의 PASSWORD에
<password> 부분을 아까 설정한 DB_PASSWORD로 바꿔주자!

그리구 ALLLOWED_HOSTS comment 제거하고, 내 도메인 또는 IP를 적어두자.

python3 manage.py migrate
python3 manage.py loaddata navbar
python3 manage.py loaddata language_small
python3 manage.py createsuperuser

Setting up MOSS (Optional)

만약 MOSS를 쓰고 싶다면,
다음 링크를 참고해서 user id를 받은 뒤에,
https://m.blog.naver.com/ljy9378/221483295984

dmoj/settings.py 에서 MOSS_API_KEY를 방금 받은 user id 숫자 그대로 넣어준다.

celery

pip install Redis #https://stackoverflow.com/questions/70164076/celery-unable-to-use-redis
service redis-server start

dmoj/local_settings.py 에서 CELERY_BROKER_URLCELERY_RESULT_BACKEND를 uncomment 시킨다

이제 다음 명령을 한줄씩 실행해서 한 10~15초씩 기다려보고.. 잘 되었는지 확인하자

python3 manage.py runbridged
celery -A dmoj_celery worker

setting up uWSGI

pip3 install uwsgi
wget https://raw.githubusercontent.com/DMOJ/docs/master/sample_files/uwsgi.ini

그리고 uswgi.ini 들어가서 # Paths 라고 되어있는 부분에 path 설정 잘 해주자.
아마 다음과 비슷하게 될거다

chdir = /home/user/site
pythonpath = /home/user/site
virtualenv = /home/user/dmojsite

Setting up supervisord

apt-get install supervisor
wget https://raw.githubusercontent.com/DMOJ/docs/master/sample_files/site.conf -O /etc/supervisor/conf.d/site.conf
wget https://raw.githubusercontent.com/DMOJ/docs/master/sample_files/bridged.conf -O /etc/supervisor/conf.d/bridged.conf
wget https://raw.githubusercontent.com/DMOJ/docs/master/sample_files/celery.conf -O /etc/supervisor/conf.d/celery.conf

그리구 방금 다운받은 파일들 들어가서 path 설정해주자.

그리고 supervisor를 실행한다.

supervisord -c /etc/supervisor/supervisord.conf
supervisorctl -c /etc/supervisor/supervisord.conf

nginx

apt-get install nginx
wget https://raw.githubusercontent.com/DMOJ/docs/master/sample_files/nginx.conf -O /etc/nginx/conf.d/nginx.conf

그리고 다음 명령어를 통해, /etc/nginx/conf.d/nginx.conf/etc/nginx/sites-available/defaultlisten [::]:80; 를 comment 시켜버리자.. IPv6를 위한것으로 아는데.. 에러가 나는 경우가 있다 ㅎㅎ

sed -ri 's/listen       \[::\]:80;/# listen       \[::\]:80;/' /etc/nginx/conf.d/nginx.conf
sed -ri 's/listen \[::\]:80 default_server;/# listen \[::\]:80 default_server;/' /etc/nginx/sites-available/default

그리고 /etc/nginx/conf.d/nginx.conf에 들어가서, path를 세팅해주자
code path는 쉬울거구..
django STATIC ROOT는 dmoj/local_settings.py의 STATIC_ROOT 변수의 parent path를 가리켜야한다. 아무것도 안바꿨다면, /tmp로 바꿔주면 된다.

다음 명령어로 에러 안나는지 확인하고,

nginx -t
service nginx start
sed -ri 's/DEBUG = True/DEBUG = False/' dmoj/local_settings.py

이제 아까 열었던 OJ_PORT를 통해,
hostname:OJ_PORT 에 접속이 가능할거다!

judge 구축

아까 생성했던 superuser로 로그인하고,
hostname:OJ_PORT/admin/judge/judge/add/ 접속 또는

여기를 클릭한다.

JUDGE_NAME 정하구
Regenerate를 눌러서 JUDGE_KEY 얻고
save.

그리고

apt-get install build-essential libseccomp-dev
pip3 install dmoj==2.1.0
dmoj-autoconf

그 결과물을 그대로 복사하자. 밑에서 써야한다.

그리고 judge.yml 이라는 파일을 만들어서 다음과 비슷하게 적는다

id: JUDGE_NAME
key: "JUDGE_KEY"
problem_storage_root:
  - /home/user/problems
runtime:
복사한결과물

그리고

dmoj -c judge.yml localhost

마지막으로,
dmoj/settings.py에서 DMOJ_PROBLEM_DATA_ROOT를 위에서 설정한 /home/user/problems랑 맞춰주자.

그리고 supervisor 다시 실행..

supervisorctl restart bridged site celery

좋은 웹페이지 즐겨찾기