morijwana
수로그
morijwana
전체 방문자
오늘
어제
  • 분류 전체보기
    • 강의노트
    • Machine Learning
      • Pandas
      • NLP
    • Computer Science
      • Linux
      • TIL
    • Development
      • React
      • Swift
      • Javascript
    • 스터디 기록
      • Clean Code
      • 구글 BERT의 정석
      • 개발도서
      • 기타
    • Problem Solving
      • Baekjoon
      • ICPC Sinchon
    • 끄적
      • 끄적끄적
      • 요리왕

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 회고
  • 구부정스터디
  • Bert
  • 개발도서
  • GDSC Sookmyung
  • Solution Challenge
  • 자연어처리
  • word2vec
  • 프레임워크없는프론트엔드개발
  • 백준
  • 프로그래밍언어론
  • cs224n
  • ML
  • Pandas
  • nlp
  • Python
  • 데이터사이언스
  • gdsc
  • 구글BERT의정석
  • 민트하임스터디

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morijwana

수로그

Domjudge 8.0 + GCP(Ubuntu) 대회 환경 세팅법
끄적/끄적끄적

Domjudge 8.0 + GCP(Ubuntu) 대회 환경 세팅법

2022. 3. 12. 17:41

교내 프로그래밍 경진대회의 운영진으로 참여하게 되어 Domjudge 8.0 Docker Image와 GCP로 대회 환경을 세팅했던 과정을 정리해보려 한다. 제발 올해에 이어 내년에 제3회 프로그래밍 경진대회가 열려서 이 글이 후배들에게 도움이 되었으면 좋겠다.

GCP VM Instance 생성

Google Cloud Platform 사이트의 좌측 메뉴에서 Compute Engine > VM 인스턴스 > 상단바에서 '인스턴스 만들기'를 선택한다. 리전은 asia-northeast3(서울)을 선택하고, 영역은 a, b, c 중 아무거나 선택한다. 

머신 유형은 대회 규모에 따라 달라지는데, 보통 20팀 당 CPU 1개(=채점서버 1개)로 생각하면 된다고 한다. 메모리같은 경우 자바 코드 채점을 위한 JVM이 돌아가려면 최소 2GB 이상의 스펙이 필요하다. 우리 대회는 약 80~100명 정도의 참여가 예상되고 자바 코드 채점을 지원하므로 최소 4코어, 2GB 메모리가 필요하나, 지금은 테스트용으로 돌려보는 거라 e2-medium을 선택했다.

부팅 디스크는 Ubuntu 18.04 LTS, 크기는 16GB로 했다. 10GB로 했더니 judgehost에서 디스크 메모리 부족 경고가 떠서 조금 늘렸다. 방화벽은 HTTP/HTTPS 모두 허용한 다음 '만들기'를 눌러 인스턴스를 생성하자. 무료 크레딧을 사용중이라면 꼭 하단에 '이 VM 인스턴스에 무료 체험판 크레딧이 사용됩니다.' 메세지가 보이는지 확인해야 한다.

 

VM에 Docker 설치

https://docs.docker.com/engine/install/ubuntu/ 글을 바탕으로 작성했다.

 

Install Docker Engine on Ubuntu

 

docs.docker.com

1. apt 패키지를 업데이트하고 HTTPS를 통한 레포지토리 사용을 위해 필요한 패키지를 설치한다.

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

2. Docker 공식 GPG Key를 추가한다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

3. stable 레포지토리 설정을 위해 다음 명령어를 입력한다. nightly나 test 모드를 사용하고 싶다면 상단의 링크로 이동해서 원문을 보자.

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4. apt 패키지를 업데이트하고, 최신 버전의 Docker 엔진과 컨테이너를 설치한다. 특정 버전으로 설치하고 싶다면 원문을 보자.

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

5. hello-world 이미지를 실행해 Docker가 잘 설치되었는지 확인한다. CLI에 도커의 환영 메세지가 뜬다면 성공적으로 설치된 것이다.

sudo docker run hello-world

 

judgehost, domserver, mariadb 동시 실행을 위한 docker-compose 설치

 

Install Docker Compose

 

docs.docker.com

docker-compose는 다중 컨테이너 도커 애플리케이션을 빌드할 때 사용한다. 한 개의 서버에서 여러 개의 도커 컨테이너를 동시에 실행하고 쉽게 관리할 수 있도록 해준다. 이 글에선 docker-compose를 통해 judgehost, domserver, mariadb 실행을 관리할 것이다.

1.  Docker Compose를 다운로드한다. (2022.03.12 기준 1.29.2 버전이 최신)

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2. 다운로드받은 파일에 외부 접근 권한을 부여한다.

sudo chmod +x /usr/local/bin/docker-compose

3. 설치가 잘 되었는지 확인한다.

docker-compose --version

 

이 방법으로 설치하는 데 문제가 있는 경우, Running Docker Compose with Docker 문서를 참고해서 설치하면 된다.

 

여러 개의 judgehost 사용을 위한 grub 설정

채점을 담당하는 judgehost를 켜기 전, 여러 개의 judgehost를 사용하기 위해 grub 세팅을 마쳐야 한다.

아래 명령어로 /etc/default/grub 파일을 수정하자. GRUB_CMDLINE_LINUX_DEFAULT 값을 'cgroup_enable=memory swapaccount=1'로 설정한다. vi 에디터는 i 키를 눌러 삽입 모드로 전환 가능하고, 내용을 수정한 후에 esc 키를 누른 다음 :wq를 입력하면 수정 사항이 저장된다.

sudo vi /etc/default/grub

 

다음 파일에도 GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295 cgroup_enable=memory swapaccount=1" 라인을 추가해준다.

sudo vi /etc/default/grub.d/50-cloudimg-settings.cfg

 

두 파일 모두 수정했다면 다음 명령어를 입력해 업데이트를 적용하고 재부팅한다.

update-grub
sudo reboot

 

 

docker-compose.yml 설정과 domjudge 실행

이제 docker compose로 대회 진행에 필요한 domjudge 도커 이미지들을 받아와 실행할 차례다. 현재 위치에 docker-compose.yml 파일을 생성하고 다음 내용을 집어넣는다.

version: '3.9'

networks:
  domjudge:
    name: domjudge
    
services:
  mariadb:
    container_name: mariadb
    image: mariadb:latest
    networks:
      - domjudge
    ports:
      - 13306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=rootpw
      - MYSQL_USER=domjudge
      - MYSQL_PASSWORD=djpw
      - MYSQL_DATABASE=domjudge
    command: --max-connections=1000
    
  domserver:
    container_name: domserver
    image: domjudge/domserver:latest
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    networks:
      - domjudge
    ports:
      - 12345:80
    depends_on:
      - mariadb
    environment:
      - CONTAINER_TIMEZONE=Asia/Seoul
      - MYSQL_HOST=mariadb
      - MYSQL_ROOT_PASSWORD=rootpw
      - MYSQL_USER=domjudge
      - MYSQL_PASSWORD=djpw
      - MYSQL_DATABASE=domjudge
      
  judgehost-0:
    container_name: judgehost-0
    image: domjudge/judgehost:latest
    privileged: true
    hostname: judgedaemon-0
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
    networks:
      - domjudge
    depends_on:
      - domserver
    environment:
      - CONTAINER_TIMEZONE=Asia/Seoul
      - JUDGEDAEMON_USERNAME=judgehost
      - DAEMON_ID=0
      - JUDGEDAEMON_PASSWORD=your_password

 

다음으로 우선 mariadb와 domserver만 활성화한다. judgehost를 활성화하지 않는 이유는 domserver와 mariadb를 활성화하기 전까지는 judgehost의 초기 비밀번호를 모르고, 여러 개의 judgehost를 사용하려면 grub 설정이 추가적으로 필요하기 때문이다.

docker-compose up -d mariadb domserver

 

다시 인스턴스에 접속한 후, mariadb와 domserver가 정상적으로 실행되었고 방화벽 설정이 되어있다면 http://{public_ip}:12345로 접속했을 때 돔저지 UI가 보일 것이다. 이제 아래 명령어로 judgehost의 비밀번호를 확인한다. 가장 마지막에 출력되는 것이 비밀번호다.

docker exec -it domserver cat /opt/domjudge/domserver/etc/restapi.secret

이제 알아낸 비밀번호를 docker-compose.yml에 적어주자. judgehost-0의 JUDGEDAEMON_PASSWORD 환경변수 값을 위의 명령어로 알아낸 비밀번호로 바꾼다.

이제 아래 명령어를 입력해 judgehost를 활성화하자.

docker-compose up -d

 

judgehost가 정상적으로 활성화되었다면 http://{public_ip}:12345 페이지에 admin 계정으로 로그인한 후 judgehost 탭에 들어갔을 때 다음과 같이 status에 초록불이 들어와있다. 

여러 개의 judgehost를 사용하고 싶다면 사용하려는 judgehost의 개수만큼 Judgehost User를 생성하고, docker-compose.yml 파일에 judgehost-0과 똑같은 양식으로 judgehost-1, judgehost-2, ...를 생성한 다음 JUDGEDAEMON_USERNAME과 JUDGEHOST_PASSWORD를 각각 생성할 때 설정한 값으로 바꾸면 된다.

저작자표시

'끄적 > 끄적끄적' 카테고리의 다른 글

대학원에 갑니다  (4) 2023.09.24
[KT Cloud] 무료 체험 쿠폰으로 서버 생성하고 사용하기 + 디스크 용량 확장 방법  (3) 2022.06.06
텝린이의 텝스(10/2, 314회차) 후기 + 10/9 점수 발표  (2) 2021.10.04
[Coursera] 코세라 학생용 플랜 이용하기 (a.k.a 등록금 뽕뽑기)  (5) 2021.09.22
    '끄적/끄적끄적' 카테고리의 다른 글
    • 대학원에 갑니다
    • [KT Cloud] 무료 체험 쿠폰으로 서버 생성하고 사용하기 + 디스크 용량 확장 방법
    • 텝린이의 텝스(10/2, 314회차) 후기 + 10/9 점수 발표
    • [Coursera] 코세라 학생용 플랜 이용하기 (a.k.a 등록금 뽕뽑기)
    morijwana
    morijwana
    행복한 휴학생의 devlog

    티스토리툴바