CMS는 Contest Management System의 약자로, 공식 Competitive Programming 대회 에서 자주 사용되는 대회 진행 시스템이라고 볼 수 있겠다. 애초에 IOI에서 사용할 목적으로 개발되었고, IOI 2012에서 최초로 쓰였다. 요즘엔 (전)KOI, APIO 등등의 대회에서 사용되고도 있다. 아무튼, CP 대회를 여는데 있어서 상당히 유용한 시스템이다.

작년인가 재작년에는 노트북에 세팅을 해서 돌렸었는데, 이번에는 AWS에서 세팅을 하게 됐다. 또 그때는 정식 튜토리얼이 없어서 엄청 해멨는데, 이번에는 공식 튜토리얼(홈페이지 - Related에 있다)이 있어서 좀 더 편하게 했다.


환경 설정

AWS EC2같은걸 쓰려면 부담스럽기도 하고 귀찮기도 한 관계로 이번에도 LightSail을 써서 했다. 다만 블로깅때와는 다르게 당연히 App 설정을 하지 않고 OS 설정에 가서 그냥 우분투16.04만 있는걸 사용했다.

참고로, 512MB 플랜을 사용하면 CMS의 모든 서비스는 작동하지 않는다. 어떻게든 잘 해야4MB정도의 여분이 있는 정도… 그마저도 위태롭다. 그래서 나는 2GB 플랜으로 돌리게 되었다. 이정도면 256MiB 문제정도를 수십명정도까지는 버틸 수 있을듯 하다.

그리고 그냥 튜토리얼을 따라하면 된다. (중간에 cmsInitDB가 있는데, 이 명령어는 DB안이 아니라, Ctrl + D를 쳐서 나온 다음에 그냥 터미널에 쳐야 한다. 그렇지 않으면 권한이 없어 에러가 난다.)

끝나고 나서, 나는 nginx세팅이 필요한줄 알았는데 그냥 LightSail 제어판에서 포트를 열어주기만 하면 바로 작동한다.

Lightsail 포트 설정 스샷인스턴스 이름 - 네트워킹 탭에 있는 방화벽 설정을 바꿔주면 된다.

DNS 설정 및 도메인 연결은 블로깅때와 마찬가지로 무료 .ga 도메인을 얻어서 연결했다. 역시 Nameserver 세팅도 해줘야 된다.

끝나고 나면, <도메인>:8888 로 접속하면 대회 서버로 연결된다. 참고로 <도메인>만 쳐서 접속하면 자동으로 HTTP포트인 80번 포트로 접속하니, 포트 번호인 8888을 붙여줘야 한다. 80번 포트를 닫고 싶으면 위에서 규칙을 제거해주면 된다.

사실 나는 80번 포트를 열어두고 기본 페이지를 바꿔쳐서 넣었다. 만약 그렇게 하고 싶다면,  /var/www/html에 있는 관리자 권한으로 html파일을 바꿔주면 된다. 이렇게 하면 그냥 포트 정보 없이 도메인만 쳤을 때도 페이지를 보여줄 수 있게 된다.


실행 / 랭킹 설정

랭킹 서버는 CMS 보안상(본인들이 주장하기를) 따로 돌아간다. 데이터 저장 위치 및 서버 연결 방법 모두 완전 별개니까, 따로 열어 주어야 한다.

나는 tmux (Screen 처럼 추가 세션을 만들어주는 것이다. SSH 연결을 끊어도 세션을 직접 끄기 전까지는 지속된다.) 를 써서 서비스를 돌렸다.

tmux ls : 지금 존재하는 tmux 세션들을 보여준다.

tmux new -s "이름" : “이름”(따옴표 있이 쳐야됨)인 세션을 하나 만들고 거기에 연결한다.

Ctrl + b, d : 현재 연결된 세션에서 빠져나온다. (세션을 유지된다)

따라서 전체 서비스는 다음과 같이 돌린다.

tmux new -s "Main_Services"<br /> cmsResourceService -a  (실행할 대회 번호)

Ctrl + b, d

하면 랭킹을 제외한 모든 작업이 돌아가고, 원래 화면으로 돌아온다.

랭킹도 비슷하게 하면 된다.

tmux new -s "Ranking_Server"<br /> cmsRankingWebServer

Ctrl + b, d

하면 <도메인>:8890 포트에서 랭킹이 보이게 된다.

참고로, 랭킹의 데이터 저장 위치는 <span class="pre">/var/local/lib/cms/ranking</span> 이 기본인 듯 하다. 나도 저 위치에 있었다. (한번 cmsRankingWebServer를 실행해주어야 생긴다.)

만약 저기에 없다면 config 파일 (이 파일은 /usr/local/etc/ 이나 /etccms.ranking.conf라는 이름으로 있다 고 한다.)<span class="pre">lib_dir</span>값을 찾아보면 된다.

랭킹의 데이터 저장 위치에 가면 대회 로고나 참가자들의 나라 국기 세팅같은 것들을 할 수 있는데, 나는 로고 세팅만 해 보았다. 그냥 위에서 말한 그 위치 (나의 경우는 <span class="pre">/var/local/lib/cms/ranking</span>)에 logo.png 파일을 만들어 주면 된다. 픽셀 수는 알아서 적당히 조절해야 한다. 대략 너비, 높이 200px까지는 괜찮아 보이는 듯.


여기까지가 환경 세팅이고, 대회 세팅은 일단 공식 Documentation을 읽어 보면 되고 딱히 복잡하지는 않다. 혹시 필요하게 된다면 따로 올리겠다.