เพื่อให้การติดตั้งและรัน CMS แนะนำให้เตรียมเครื่องเซิร์ฟเวอร์ขั้นต่ำตามสเปคนี้:
- OS: Ubuntu Server 24.04 LTS (แนะนำเวอร์ชั่นนี้เพราะมี Python 3.12 เป็นค่าเริ่มต้น ติดตั้งแบบ Live Server ไม่ต้องลง GUI)
- Platform: เครื่อง Bare Metal หรือ Virtual Machine (VM) ก็ได้ เช่น Proxmox, VMware, VirtualBox
(หมายเหตุ: ไม่แนะนำให้ใช้ LXC Container เพราะอาจจะมีปัญหาเรื่อง Permission ของ
cgroupที่ต้องใช้ทำ Sandbox ตรวจโค้ด แนะนำให้สร้าง VM ใหม่ จะเป็นทางที่ดีที่สุด) - User: บัญชีใช้งานธรรมดาที่มีสิทธิ์
sudo
- CPU: 2 Cores ขึ้นไป (แนะนำ 4-8 Cores: เพราะระบบจะสร้าง Worker ตรวจโค้ดตามจำนวน Core CPU ยิ่งเยอะยิ่งตรวจข้อสอบพร้อมกันได้ไว)
- RAM: 4 GB ขั้นต่ำ (แนะนำ 8 GB ขึ้นไป เพื่อรองรับการทำงานของ Database, Web Server และเผื่อให้ Sandbox คอมไพล์โค้ดแบบไม่ค้าง)
- Storage: 30 GB ขึ้นไป (แนะนำ SSD เผื่อพื้นที่ให้ OS, ฐานข้อมูล PostgreSQL และไฟล์ซอร์สโค้ดของคนส่ง)
- อินเทอร์เน็ตที่เสถียร
- หากตั้งใจจะเปิดให้คนภายนอกเข้าใช้งาน ต้องสามารถเข้าถึง / Forward Port
8888(หน้าผู้เข้าแข่งขัน),8889(หน้าแอดมิน) และ8890(หน้าคะแนน) ได้
sudo apt-get update
sudo apt-get install build-essential openjdk-11-jdk-headless fp-compiler \
postgresql postgresql-client python3.12 cppreference-doc-en-html \
cgroup-lite libcap-dev zip python3.12-dev libpq-dev libcups2-dev \
libyaml-dev libffi-dev python3-pip python3.12-venv nginx-full- โคลนโฟลเดอร์มาก่อน:
git clone --recursive https://github.com/cms-dev/cms.git - เข้าไปในโฟลเดอร์:
cd cms - ย้อน commit
git checkout v1.5.1
git submodule update --init- รันสคริปต์:
sudo python3 prerequisites.py install(สคริปต์นี้จะจัดการสร้างกลุ่มcmsuser, คอมไพล์ sandbox และจัดการเรื่องภาษาให้ แค่ตอบ Y ตอนมันถาม) - แอดตัวเองเข้ากลุ่ม: พิมพ์คำสั่ง
sudo usermod -a -G cmsuser $(whoami)เพื่อแอดตัวเองเข้ากลุ่ม แล้ว Logout / Login VM ใหม่ 1 รอบ
- สร้าง venv:
python3 -m venv ~/cms_venv - เปิดใช้งาน venv:
source ~/cms_venv/bin/activate(จะมี(cms_venv)โผล่มาหน้า terminal) - ติดตั้ง Dependencies ใน venv:
pip install -r requirements.txt - ติดตั้งตัว CMS:
pip install .
- เข้าไปสร้าง DB:
sudo -u postgres psql - พิมพ์คำสั่ง SQL ทีละบรรทัด:
CREATE ROLE cmsuser WITH LOGIN PASSWORD 'ตั้งรหัสผ่านตรงนี้';
CREATE DATABASE cmsdb OWNER cmsuser;
ALTER SCHEMA public OWNER TO cmsuser;
GRANT SELECT ON pg_largeobject TO cmsuser;
\q- ไปแก้ไฟล์
cms.conf(หรือcms.tomlในเวอร์ชั่นใหม่) ให้ชี้ url มาที่ DB ตัวนี้ Path จะอยู่ที่/usr/local/etc/cms.confแล้วรันcmsInitDB(ต้องทำตอน activate venv อยู่) จุดที่แก้
"database": "postgresql+psycopg2://cmsuser:your_password_here@localhost:5432/cmsdb",ถ้าติดปัญหา cmsInitDB ถอยกลับ version setuptools
pip uninstall setuptools -y
pip install "setuptools<70"
cmsInitDB- สร้าง Admin:
source ~/cms_venv/bin/activate
cmsAddAdmin <admin_username> -p <admin_password>- ทดสอบรัน จอที่ 1 เปิด Log Service รอรับข้อมูล:
source ~/cms_venv/bin/activate
cmsLogServiceจอที่ 2 เปิด Resource Service เพื่อปลุกทุกระบบของ CMS:
source ~/cms_venv/bin/activate
cmsResourceService -a ALLลองเข้าหน้าเว็บ
-
หน้า Admin:
http://<IP_ของ_VM>:8889(ลองล็อกอินด้วยรหัสที่สร้างไว้) -
หน้า Contest:
http://<IP_ของ_VM>:8888 -
หน้า Ranking:
http://<IP_ของ_VM>:8890
sudo nano /etc/systemd/system/cms-log.serviceใส่โค้ดนี้:
[Unit]
Description=CMS Log Service
Requires=postgresql.service
After=postgresql.service
[Service]
Type=simple
User=singto1597
ExecStart=/home/singto1597/cms_venv/bin/cmsLogService
Restart=on-failure
[Install]
WantedBy=multi-user.targetsudo nano /etc/systemd/system/cms-resource.serviceใส่โค้ดนี้:
[Unit]
Description=CMS Resource Service
Requires=cms-log.service postgresql.service
After=cms-log.service postgresql.service
[Service]
Type=simple
User=singto1597
ExecStart=/home/singto1597/cms_venv/bin/cmsResourceService -a ALL
Restart=on-failure
[Install]
WantedBy=multi-user.targetsudo nano /etc/systemd/system/cms-ranking.serviceใส่โค้ดนี้:
[Unit]
Description=CMS Ranking Service
Requires=cms-log.service postgresql.service
After=cms-log.service postgresql.service
[Service]
Type=simple
User=singto1597
ExecStart=/home/singto1597/cms_venv/bin/cmsRankingWebServer
Restart=on-failure
[Install]
WantedBy=multi-user.targetsudo nano /etc/systemd/system/cms-proxy.serviceใส่โค้ดนี้:
[Unit]
Description=CMS Proxy Service
Requires=cms-log.service cms-ranking.service
After=cms-log.service cms-ranking.service
[Service]
Type=simple
User=singto1597
ExecStart=/home/singto1597/cms_venv/bin/cmsProxyService -c ALL
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetพอสร้างเสร็จ 4 ไฟล์ รันคำสั่งนี้เพื่อเปิดใช้งานตอนเปิดเครื่อง:
sudo systemctl daemon-reload
sudo systemctl enable cms-log cms-resource cms-ranking cms-proxy
sudo systemctl start cms-log cms-resource cms-ranking cms-proxyเนื่องจากอาจารย์มหาวิทยาลัยเชียงใหม่ มีการแก้ไขระบบหลังบ้าน (ดึงคะแนน) และแสดงผลที่ Overview จึงเอาไฟล์ของอาจารย์มาอัปเดตใส่ CMS ของเรา เพื่อให้การดูคะแนนง่ายขึ้น
เข้าไปที่โฟลเดอร์ ~/cms แล้วเอาไฟล์ของอาจารย์ overview_score_patch_cms1.5_CSCMU ไปวางทับตาม Path นี้:
~/cms/cms/server/contest/handlers/main.py~/cms/cms/server/contest/templates/overview.html~/cms/cms/server/contest/static/cws_style.css
เพื่อให้ระบบรู้จักโค้ดใหม่ที่เพิ่งเอาไปทับ ต้องรันคำสั่งติดตั้งซ้ำอีกรอบใน venv:
cd ~/cms
source ~/cms_venv/bin/activate
pip install .sudo systemctl restart cms-resource(หมายเหตุ: หากหน้าเว็บสียังไม่เปลี่ยน ให้กด Ctrl + F5, Shift + F5 หรือ Ctrl + Shift + R เพื่อเคลียร์แคชบนเบราว์เซอร์)
ระบบนี้จะใช้สคริปต์ดึงไฟล์ข้อสอบจาก CMS มาตรวจการลอกโค้ด และสร้างหน้าเว็บ Dashboard สรุปผลให้ที่พอร์ต 8000
นำโฟลเดอร์ parse_subs มาวางไว้ที่ ~/parse_subs
rsync -avz /full_path/parse_subs user@ip_addr:/home/user/parse_subs/จากนั้นติดตั้งเครื่องมือที่จำเป็น (ทำใน venv):
source ~/cms_venv/bin/activate
pip install copydetect psycopg2-binaryแก้ password ที่ใส่ไปก่อนหน้านั้นในไฟล์ cms.conf (ของ parse_subs ไม่ใช่ของ cms)
"database": "postgresql://cmsuser:yourpassword@localhost:5432/cmsdb"เมื่อต้องการตรวจ ให้รันสคริปต์ตัวหลัก (Master Script):
cd ~/parse_subs
./master_check.shสคริปต์นี้เป็นของอาจารย์มหาวิทยาลัยเชียงใหม่ เช่นเคย ซึ่ง ผมได้นำมาเขียนสคริปต์เพิ่มเติมบางส่วน เพื่อให้การตรวจสอบสามารถแยกโจทย์ได้