# Hướng dẫn build VNOJ ở Localhost #### (Ở đây chúng ta sẽ build theo Docker Image của VNOJ, [Github](https://github.com/VNOI-Admin/vnoj-docker)) Hệ điều hành để setup: [Ubuntu 22.04 LTS](https://ubuntu.com/download/desktop) (Có thể sử dụng version khác, nhưng mình thấy 22.04 ổn hơn :v) ## Cài đặt Docker và Docker Compose - Update hệ thống ``` sudo apt-get update sudo apt-get upgrade ``` - Config để cài Docker ([Xem thêm](https://stackoverflow.com/questions/70020722/what-is-the-meaning-of-sudo-apt-get-install-ca-certificates-curl-gnupg)) ``` sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release ``` - Đến đoạn này là để cài Docker với Docker Compose rồi ``` curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 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 sudo apt update sudo apt-get install docker-ce docker-ce-cli containerd.io 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 sudo chmod +x /usr/local/bin/docker-compose ``` ## Cài đặt site thông qua Docker - Clone Git của VNOI-Admin, link đã được để ở phía trên ``` git clone --recursive https://github.com/VNOI-Admin/vnoj-docker.git cd vnoj-docker/dmoj ``` - Thay đổi logo, footer. Chỉnh sửa trong ``local_settings.py`` và nhập lệnh này trước khi setup: ``` ./scripts/initialize ``` - Chỉnh sửa những cái cần thiết ở các folder environment, Nginx (Lưu ý: Khi chỉnh sửa file trong folder environment, các file khi lưu đều phải bỏ đi đuôi ``.example``) - Build Image ``` sudo docker compose build sudo docker compose up -d site sudo ./scripts/migrate sudo ./scripts/copy_static sudo ./scripts/manage.py loaddata navbar sudo ./scripts/manage.py loaddata language_small sudo ./scripts/manage.py loaddata demo sudo docker compose up -d ``` (Sau khi build xong thì truy cập Web qua IP 127.0.0.1) ## Setup Máy chấm cho OJ Vì khi setup, OJ không đi kèm theo judge nên chúng ta cần phải tự build thôi. Ở đây mình sẽ hướng dẫn build Judge qua 2 cách: Docker và PyPI ### Docker - Build Image cho Judge ``` apt install supervisor make git clone --recursive https://github.com/VNOI-Admin/judge-server.git cd judge/.docker make judge-tiervnoj ``` - Tạo profile cho Judge ![image](https://hackmd.io/_uploads/BJ7iw8sHp.png) ![image](https://hackmd.io/_uploads/H1A2vUiST.png) ![image](https://hackmd.io/_uploads/HJB8nviHT.png) ![image](https://hackmd.io/_uploads/rJrgRDor6.png) - Tạo file Config cho Judge + Tạo <tên file>.yml ``(/home/<user>/vnoj-docker/dmoj/problems/<tên file>.yml)`` ``` id: <judge name> key: <judge authentication key> problem_storage_globs: - /problems/* ``` - Kết nối Judge tới site ``` docker run \ --name judge \ --network="host" \ -v /home/<user>/vnoj-docker/dmoj/problems:/problems \ --cap-add=SYS_PTRACE \ -d \ --restart=always \ vnoj/judge-tiervnoj:latest \ run -p 9999 -c /problems/judge.yml localhost id key ``` ### PyPI - Cũng tạo Profile cho Judge như lúc chúng ta sử dụng Docker - Cài đặt ngôn ngữ cần thiết: ``` sudo apt install -y python3-dev python3-pip build-essential libseccomp-dev pip3 install dmoj sudo apt remove -y g++-9 gcc-9 sudo mv /usr/bin/g++-11 /usr/bin/g++ && sudo mv /usr/bin/gcc-11/usr/bin/gcc sudo cp /usr/bin/g++ /usr/bin/g++-11 && sudo cp /usr/bin/gcc /usr/bin/gcc-11 sudo apt install -y fpc python ``` - Cũng tạo config Judge ở mục problems nhưng lần này sẽ khác: ``` id: <judge name> key: <judge authentication key> problem_storage_root: - /problems/* runtime: ``` - Config runtime: ``` dmoj-autoconf ``` Khi ta chạy lệnh này, tất cả các ngôn ngữ cùng với chỗ lưu sẽ hiện ra: ![image](https://hackmd.io/_uploads/HkRtUFjr6.png) Copy toàn bộ chỗ ấy, rồi qua Config Judge vừa rồi, paste ở mục runtime - Chạy máy chấm Sau khi chúng ta đã lưu config, hãy chạy lệnh này: dmoj -c <tên file>.yml localhost (Lưu ý: Khi đang chạy lệnh này, tuyệt đối không nhắn Ctrl + C, Ctrl + Z, Ctrl + X vì Judge PyPI chạy live và không thể treo mãi được)