open-source 기반 online-judge 시스템 구축을 하고 싶었다. MOSS(코드 표절검사기능)이 탑재된걸로..
그러다가
https://github.com/DMOJ/online-judge
이걸 찾았다.
충분히 docker 기반으로 하나 만들어줄 수 있을법싶은데도.. 안되어있더라 ㅜㅜ
일단은.. https://docs.dmoj.ca/#/site/installation 에 안적혀있는 에러들을 수정해가며.. 다음과 같이 구축해보았다..
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
다음을 실행하면, 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
만약 MOSS를 쓰고 싶다면,
다음 링크를 참고해서 user id를 받은 뒤에,
https://m.blog.naver.com/ljy9378/221483295984
dmoj/settings.py
에서 MOSS_API_KEY
를 방금 받은 user id 숫자 그대로 넣어준다.
pip install Redis #https://stackoverflow.com/questions/70164076/celery-unable-to-use-redis
service redis-server start
dmoj/local_settings.py
에서 CELERY_BROKER_URL
와 CELERY_RESULT_BACKEND
를 uncomment 시킨다
이제 다음 명령을 한줄씩 실행해서 한 10~15초씩 기다려보고.. 잘 되었는지 확인하자
python3 manage.py runbridged
celery -A dmoj_celery worker
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
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
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/default
의 listen [::]: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 에 접속이 가능할거다!
아까 생성했던 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