리눅스, 그 두 번째 이야기 | 알고리즘 대회 운영을 위한 CMS 설치
이 글은 문제해결 프로그래밍 대회 운영을 위한 시스템인 cms-dev를 설치하고 운영하는 방법에 대해 소개하는 글이다. 먼저 이전 글을 읽고 오기를 바란다.
DB 구성
cms를 비롯한 많은 사이트들은 데이터를 저장하고 관리하기 위해 이미 만들어져 있는 database를 이용한다. cms-dev는 poetgresql을 이용하므로 이를 구성하도록 하자. (이미 이전 설치 과정에서 같이 설치되었을 것이다.)
먼저 db 사용자로 로그인한다.
sudo su - postgres
이후 다음 명령어를 이용해 cmsuser를 만든다. 이때의 암호를 기억하도록 하자.
createuser --username=postgres --pwprompt cmsuser
다음 명령어를 이용해 cmsuser가 주인인 cmsdb를 만든다.
createdb --username=postgres --owner=cmsuser cmsdb
이제 권한을 설정한다.
psql --username=postgres --dbname=cmsdb --command='ALTER SCHEMA public OWNER TO cmsuser'
psql --username=postgres --dbname=cmsdb --command='GRANT SELECT ON pg_largeobject TO cmsuser'
CMS에 DB 연결
이제 우리는 cms와 db를 연결하기 위한 connection string을 손봐야 한다. 먼저 다음 명령어를 통해 cms.conf가 있는 곳으로 이동해야 한다.
cd /usr/local/etc
아마 cms.conf.sample 파일이 있을 것이다. 먼저 뒤에 .sample을 제거하여 cms.conf로 만들어 주자. 이후 이 파일을 열고 다음과 같이 connection string을 수정해야 한다.
59번 줄을 보자.
"database": "postgresql+psycopg2://cmsuser:your_password_here@localhost:5432/cmsdb",
여기서 your_password_here 부분에 앞서 DB구성에서 만들었던 cmsuser의 암호를 입력한다.
그리고, 만약 현재 cms를 돌리려고 하는 환경이 저사양이라면 worker의 수를 줄이는 것이 권장된다.
27번 줄을 보자.
"Worker": [["localhost", 26000],
["localhost", 26001],
["localhost", 26002],
["localhost", 26003],
...
["localhost", 26014],
["localhost", 26015]],
현재 26000~26015로 총 16개의 worker가 가동되도록 되어 있다. cpu 하나 당 worker 2개가 권장되므로 worker를 줄이도록 하자. 코어 수가 2개라면, 다음과 같이 수정하면 된다.
"Worker": [["localhost", 26000],
["localhost", 26001],
["localhost", 26002],
["localhost", 26003]],
이외에도 cms.conf를 보면 cms 전반에 대한 옵션들이 숨어 있음을 확인할 수 있다. 심화된 구성에 대해서는 나중에 다루도록 하겠다.
만약 지금까지 아무런 문제가 없었다면, 다음 명령어를 통해 cms와 db를 연결할 수 있다.
cmsInitDB
CMS 시작
cms는 총 3개의 front-end page로 구성된다. 각각 contestWebServer, adminWebServer, rankingWebServer이다. 이 페이지들은 각각 8888, 8889, 8890번 포트에서 운영되며 이는 cms.conf를 수정하여 바꿀 수 있다.
각설하고, 우리는 먼저 관리자 계정을 만들어야 한다. 다음 명령어를 통해 관리자를 만들자.
cmsAddAdmin -p <계정 암호> <계정 이름>
이 계정은 관리자 페이지, 즉 adminWebServer에서만 쓰이는 계정임에 유의하라. 이제 다음 명령어를 통해 관리자 페이지를 시작하면 된다.
cmsAdminWebServer
만약 정상적으로 실행되었다면, 인터넷을 통해 127.0.0.1:8889 또는 <아이피 주소>:8889로 들어가 확인할 수 있다. 만들어 놓은 관리자 계정으로 로그인한 후, create new contest를 이용해 빈 contest를 하나 만들도록 하자.
이제 cmsAdminWebServer를 실행시켰던 shell에서 Ctrl+C를 눌러 종료하고, 다음 명령어를 입력하라.
cmsResourceService -a
이후 contest 목록에서 ID를 선택하면, cmsContestWebServer와 cmsAdminWebserver, cmsWorker 등 대회 운영에 필요한 모든 서비스가 함께 실행된다. (cmsRankingWebServer는 별도로 실행해야 하므로 다음에 다루도록 하겠다.)
이제 대회를 운영하면 된다.