Cài đặt Judge
Hướng dẫn này giúp bạn cài đặt judge (hệ thống chấm bài) và kết nối với website. Hệ thống chỉ hỗ trợ Linux (bao gồm WSL), không hỗ trợ Windows.
Yêu cầu: Bạn cần đã cài đặt website và bridge đang chạy.
Cấu hình trên Website
Bước 1: Thêm judge mới
Truy cập trang quản trị tại /admin/judge/ và thêm judge mới:
- Đặt tên cho judge
- Tạo mã xác thực (authentication key) - có thể dùng nút
Regenerateđể tự động tạo
Bước 2: Kiểm tra địa chỉ kết nối
Trong file local_settings.py, tìm BRIDGED_JUDGE_ADDRESS. Đây là địa chỉ judge sẽ kết nối đến:
- Mặc định:
localhost:9999 - Nếu judge chạy trên máy khác, đổi
localhostthành địa chỉ IP thực - Quan trọng: Đảm bảo port này đã được mở
Bước 3: Kiểm tra bridge đang chạy
Chạy lệnh sau để kiểm tra:
supervisorctl statusBạn sẽ thấy dòng tương tự:
bridged RUNNING pid <pid>, uptime <uptime>Cài đặt Judge
Chúng tôi khuyên dùng Docker để cài đặt judge vì đơn giản và dễ quản lý.
Sử dụng Docker Image có sẵn
LCOJ sử dụng Docker image tier3 với số lượng ngôn ngữ lập trình hỗ trợ nhiều nhất:
- Python 2/3
- C/C++ (GCC)
- Java 8
- Pascal
- Và một số ngôn ngữ khác
Xem danh sách đầy đủ tại trang runtimes.
Build từ mã nguồn
Nếu muốn tự build Docker image:
git clone --recursive https://github.com/luyencode/judge-server.git
cd judge/.docker
make judge-tier3Chạy Judge
Chuẩn bị
Tạo file cấu hình judge.yml:
id: <tên judge>
key: <mã xác thực>
problem_storage_globs:
- /problems/*Lưu ý:
idphải trùng với tên judge đã tạo trên websitekeyphải trùng với mã xác thực đã tạo trên website- Thư mục
/problemschứa dữ liệu bài tập
Khởi động judge
docker run \
--name judge \
--network="host" \
-v /mnt/problems:/problems \
--cap-add=SYS_PTRACE \
-d \
--restart=always \
luyencode/judge-tier3:latest \
run -p 9999 -c /problems/judge.yml localhost -A 0.0.0.0 -a 12345Giải thích các tham số:
--name judge: Tên container-v /mnt/problems:/problems: Gắn thư mục bài tập từ máy host vào container-p 9999: Port kết nối đến bridge (phải trùng vớiBRIDGED_JUDGE_ADDRESS)-a 12345: Port API của judge
Lưu ý về port:
- Nếu đã đổi port trong
BRIDGED_JUDGE_ADDRESS, cần đổi-p 9999cho khớp - Nếu chạy nhiều judge, mỗi judge cần:
- Tên container khác nhau (
--name) - File cấu hình riêng (
judge.yml) - Port API khác nhau (
-a)
- Tên container khác nhau (
Chạy nhiều Judge
Để tăng khả năng xử lý, bạn có thể chạy nhiều judge cùng lúc:
Judge 1:
docker run --name judge1 -v /mnt/problems:/problems --cap-add=SYS_PTRACE -d --restart=always --network="host" luyencode/judge-tier3:latest run -p 9999 -c /problems/judge1.yml localhost -A 0.0.0.0 -a 12345Judge 2:
docker run --name judge2 -v /mnt/problems:/problems --cap-add=SYS_PTRACE -d --restart=always --network="host" luyencode/judge-tier3:latest run -p 9999 -c /problems/judge2.yml localhost -A 0.0.0.0 -a 12346Mỗi judge cần có file cấu hình riêng (judge1.yml, judge2.yml) với id khác nhau.
Kiểm tra
Sau khi khởi động judge, kiểm tra trên trang quản trị website (/admin/judge/). Judge sẽ hiển thị trạng thái "online" nếu kết nối thành công.
Xử lý lỗi thường gặp
Judge không kết nối được:
- Kiểm tra bridge đang chạy
- Kiểm tra port đã mở
- Kiểm tra
idvàkeytrongjudge.ymlkhớp với website
Judge bị disconnect liên tục:
- Kiểm tra kết nối mạng
- Kiểm tra log của judge:
docker logs judge
Judge không nhận bộ test cho bài tập mới:
Đây là lỗi phổ biến nhất, thường do đường dẫn đến thư mục problems không chính xác.
Nguyên nhân:
- Đường dẫn mount volume không đúng
- Thư mục problems trống hoặc không có quyền truy cập
- Cấu trúc thư mục bài tập không đúng
Cách kiểm tra:
- Kiểm tra thư mục problems trong container:
docker exec judge ls -la /problemsBạn sẽ thấy danh sách các thư mục bài tập. Ví dụ:
drwxr-xr-x 2 root root 4096 Jan 01 00:00 aplusb
drwxr-xr-x 2 root root 4096 Jan 01 00:00 hello
-rw-r--r-- 1 root root 123 Jan 01 00:00 judge.yml- Kiểm tra cấu trúc bài tập cụ thể:
docker exec judge ls -la /problems/aplusbPhải có các file:
-rw-r--r-- 1 root root 100 Jan 01 00:00 init.yml
-rw-r--r-- 1 root root 10 Jan 01 00:00 1.in
-rw-r--r-- 1 root root 10 Jan 01 00:00 1.out- Kiểm tra quyền truy cập:
docker exec judge cat /problems/aplusb/init.ymlNếu thấy lỗi "Permission denied", cần sửa quyền:
sudo chmod -R 755 /mnt/problemsCách sửa:
Nếu thư mục trống hoặc không đúng, kiểm tra lại lệnh docker run:
# Sai - mount sai thư mục
docker run -v /wrong/path:/problems ...
# Đúng - mount đúng thư mục chứa bài tập
docker run -v /mnt/problems:/problems ...Sau khi sửa, restart judge:
docker stop judge
docker rm judge
# Chạy lại lệnh docker run với đường dẫn đúngKiểm tra judge đã nhận bài tập:
Xem log của judge:
docker logs judge | grep "problem"Bạn sẽ thấy các dòng tương tự:
[INFO] Loaded problem: aplusb
[INFO] Loaded problem: helloNếu không thấy, judge chưa nhận được bài tập.
