# 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




- 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:

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)