# Deploying bkndOJ.v2 | 2023/06/07 version
# bkdnOJ v2 - Cài đặt
Cập nhập hệ thống:
```
sudo apt update && sudo apt upgrade
```
# 1. Database:
- Chúng ta sẽ cài đặt Database trước, hệ DB được sử dụng ở đây là Postgresql.
## 1.a Cài đặt DB (Postgres 14):
* Tham khảo: [Techviewleo](https://techviewleo.com/how-to-install-postgresql-database-on-ubuntu/)
```
sudo apt -y install gnupg2 wget vim
sudo apt-cache search postgresql | grep postgresql
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt -y install postgresql-14
```
Lúc này, nếu không có thông báo lỗi, hệ thống đã cài đặt thành công Postgresql v.14. Chạy lệnh sau để confirm DB đang hoặc động (Active):
```
systemctl status postgresql
```

Postgres sau khi cài chỉ mặc định chỉ chạy local, không mở cổng ra ngoài internet.
## 1.b Edit user DB:
Postgresql mặc định có user DB là `postgres`, xác thực với DB không sử dụng mật khẩu. Ta sẽ đổi về lại xác thực với mật khẩu để dễ thiết lập cho Backend và DB nói chuyện với nhau.
Kết nối tới DB:
```
sudo -u postgres psql
```

Tại giao diện như trên, nhập lệnh `\password postgres` để đổi mật khẩu cho user `postgres`:
```
\password postgres
Enter new password: <db-password>
Enter it again: <db-password>
```
Với `<db-password>` sẽ là mật khẩu mới của user `postgres`. Thoát khỏi giao diện với:
```
\q
```
Mở file cấu hình DB bằng:
```
sudo nano /etc/postgresql/14/main/pg_hba.conf
```
Tìm dòng
```
local all postgres peer
```
Edit lại thành
```
local all postgres md5
```
Lưu và khởi động lại postgres với câu lệnh:
```
sudo service postgresql restart
```
Để confirm, chạy lệnh:
```
sudo -u postgres psql
```
Lúc này, Postgres sẽ yêu cầu mật khẩu, nhập `<db-password>` như đã tạo:

## 1.c Tạo DB:
Xong bước trước, ta đang ở giao diện CLI của DB, chạy lệnh:
```
CREATE DATABASE <db-name>;
```
Để tạo ra DB tên là `<db-name>`. Sau đó chạy lệnh thoát khỏi CLI của DB:
```
\q
```
## 1.d Tổng kết:
- DB User: `postgres`
- DB User Password: `<db-password>`
- Tên DB sử dụng: `<db-name>`
# 2. Backend
Tại phiên bản hiện tại, bkdnOJ.v2 đang dần chuyển sang Docker để deploy, nên bạn sẽ cần phải cài đặt nó. Follow tutorial install Docker trên OS của bạn (Ubuntu: https://docs.docker.com/engine/install/ubuntu/)
Nếu cài đặt thành công, thì khi chạy
```
sudo docker -v
```
Cho ra output như: `Docker version 24.0.2, build cb74dfc` thì OK. Có thể tùy cách cấu hình mà bạn cần phải thêm `sudo` ở trước câu lệnh docker.
## Khởi chạy Redis service
Redis về cơ bản cũng tương tự như DB, nhưng lưu những data tạm thời và không quan trọng.
```
sudo docker run -d --name bkndoj_v2_redis \
-p 6379:6379 redis/redis-stack-server:latest
```
## Khởi chạy API service
### 1. File môi trương `.env`:
Để chạy được, bạn cần phải tạo một file `.env` trước. Hãy copy file dưới đây và chỉnh sửa thông số lại phù hợp, rồi lưu tại `~/backend`:
```shell
POSTGRES_NAME=bkdnoj2
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
REDIS_HOST=localhost
REDIS_PORT=6379
DJANGO_SECRET_KEY=FGtgyURFGtGHCDFTYJUHDRGTHFDgthjKUYTGFGW345678I9OJDfghuTREDfGHjkW3456789OPokY65RFGESX
DJANGO_DEBUG=1
DJANGO_ALLOWED_HOST=localhost
BKDNOJ_JUDGE_ADDRESS=localhost
BKDNOJ_JUDGE_PORT=9999
```
Lưu ý:
- Mục `POSTGRES_xxx` phải tương ứng với phần cài đặt DB ở trên.
- Mục `REDIS_xxx` tương ứng với bước khởi chạy Redis. Nếu không chỉnh gì thì giữ nguyên
- Mục `DJANGO_xxx` có thể giữ nguyên. Nếu deploy real thì phải để `DJANGO_DEBUG=0`. Nếu deploy lên site `example.com` thì phải set `DJANGO_ALLOWED_HOST=example.com`.
- Mục `BKDNOJ_JUDGE_xxx` liên quan đến chấm bài. Hiện chưa có tutorial viết cách setup ở phiên bản mới nên tạm thời bỏ qua (TBU).
### 2. Chạy service
Chạy lệnh sau:
```shell
docker run -d --rm --name api --env-file .env \
--net=host nvat/bkdnoj-v2_api:latest
```
Check trạng thái của service
```shell
docker container list -a
```
Chú ý cột **STATUS**, nếu nó ghi là `Exit...` thì đã có lỗi xảy ra. Nếu không, thì nó nên là `Up x minutes`.
Sẽ run bkdnoj API server ở chế độ ngầm. Có thể check logs của nó bằng câu lệnh:
```
docker logs -follow api
```
Sẽ chạy console để đọc logs xuất ra từ server API. Nhấn `Ctrl+C` để thoát.
### 3. Tạo các bảng trong DB:
Access vào container và chạy lệnh sau, lệnh này sẽ tạo các table cần thiết cho db:
```
docker exec -it api sh
cd /app
python manage.py migrate
```
Rồi `Ctrl+D` vài lần để out.
### 4. Tạo tài khoản Admin:
Access vào container với lệnh sau:
```
docker exec -it api sh
cd /app
python manage.py createsuperuser
```
Rồi tạo tài khoản admin theo hướng dẫn
# 3. Frontend
Nếu bạn chạy web chỉ với mục đích test một mình, chỉ cần kéo image dành riêng cho localhost:
```
docker run --rm -d -p 3000:80 nvat/bkdnoj-v2_web:localhost
```
Câu lệnh trên sẽ chạy web server ở cổng `3000`. Truy cập vào `localhost:3000` để xem. Image trên sẽ gửi API request đến `locahost:8000/api`, nghĩa là server API ở trên nếu bạn follow như cài đặt.
Còn nếu phải deploy lên internet thì ta buộc phải build một image riêng cho bản thân với URL thích hợp. (TBU)
# 4,5,6. To be updated