From 154fddf95968c407df2792cd1ee04e9defcf9fe5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EC=9D=B4=EC=86=8C=EC=9D=80?=
<144209738+saokiritoni@users.noreply.github.com>
Date: Fri, 2 Jan 2026 00:43:40 +0900
Subject: [PATCH] =?UTF-8?q?[docs]=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?=
=?UTF-8?q?=EC=9E=91=EC=84=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Added comprehensive documentation for the DGU AI LAB GPU Server Admin Backend project, including project introduction, features, technology stack, setup instructions, CI/CD pipeline, and troubleshooting guidelines.
---
README.md | 174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 174 insertions(+)
create mode 100644 README.md
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2840e6e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,174 @@
+# ๐ฅ๏ธ DGU AI LAB GPU Server Admin Backend
+
+
+
+
+
+
+
+
+> **๋๊ตญ๋ํ๊ต GPU ์๋ฒ์ค ์์ ๊ด๋ฆฌ ๋ฐ ์๋ํ ์์คํ
**
+> ์ ์ฌ์ฉ์์ ์๋ฒ ์ ์ฒญ๋ถํฐ ๊ณ์ ์์ฑ, ๋ง๋ฃ ์๋ด, ์์ ํ์(์ญ์ )๊น์ง์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฑ์๋ ์๋ฒ์
๋๋ค.
+
+
+
+## ๐ ํ๋ก์ ํธ ์๊ฐ
+๋ณธ ํ๋ก์ ํธ๋ ์ ํ๋ GPU ์๋ฒ ์์(Farm/Lab)์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ต๋๋ค.
+๊ธฐ์กด์ ์๋ ๊ด๋ฆฌ ๋ฐฉ์์ ํํผํ์ฌ **Linux ๊ณ์ ์์ฑ/์ญ์ ์๋ํ**, **๋ง๋ฃ์ผ ๊ธฐ๋ฐ ์๋ ํ์**, **Slack/Email ์๋ฆผ ์์คํ
**์ ์ ๊ณตํฉ๋๋ค.
+
+
+
+## ๐ก ํต์ฌ ๊ธฐ์ ์ ํน์ง
+* **Automated Resource Lifecycle:** ์ ์ฒญ โ ์น์ธ โ ์์ฑ โ ๋ง๋ฃ ์๋ฐ ์๋ฆผ โ ์๋ ์ญ์ (Soft/Hard) ํ๋ก์ธ์ค ๊ตฌ์ถ.
+* **Event-Driven Architecture:** DB ํธ๋์ญ์
๊ณผ ์ธ๋ถ ์๋ฆผ ๋ฐ์ก ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ณด์ฅ
+* **Non-blocking Notification:** Redis ๋ฉ์์ง ํ๋ฅผ ํ์ฉํ ๋น๋๊ธฐ ์๋ฆผ ์ฒ๋ฆฌ๋ก ๋๋ ๋ฐ์ก ์ ๋ถํ ๋ฐฉ์ง.
+* **CQS Pattern:** Command์ Query๋ฅผ ๋ถ๋ฆฌํ์ฌ UID/GID๋ฅผ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋๋ก ๊ด๋ฆฌ.
+
+
+## ๐ ์ฃผ์ ๊ธฐ๋ฅ
+
+### 0. ์ ์ ๊ด๋ฆฌ
+- ์ฌ์ฉ์๋ ๋๊ตญ๋ํ๊ต ์ด๋ฉ์ผ์ ํตํด ๊ฐ์
.
+- Spring Security & JWT ๊ธฐ๋ฐ์ ์ฌ์ฉ์/๊ด๋ฆฌ์ ๊ถํ ๊ด๋ฆฌ.
+- ๊ด๋ฆฌ์์ฉ ์๋ ํํด ๋ฐ ์๋ฆผ ๊ธฐ๋ฅ ์ง์.
+
+### 1. ์์ ์ ์ฒญ ๋ฐ ์น์ธ
+- ์ฌ์ฉ์๋ ์ํ๋ GPU ์ฉ๋, ๊ธฐ๊ฐ, ์ด๋ฏธ์ง๋ฅผ ์ ํํ์ฌ ์ ์ฒญ.
+- ๊ด๋ฆฌ์ ์น์ธ ์ **UsedId(UID/GID)** ์๋ ํ ๋น ๋ฐ **Ubuntu ๊ณ์ ์์ฑ API** ํธ์ถ.
+
+### 2. ์๋ํ๋ ์ค์ผ์ค๋ฌ (๋งค์ผ 10:00 ์คํ)
+- **๋ง๋ฃ ์๊ณ :** ๋ง๋ฃ ์ ์ ํด์ง ๋ ์ง(7, 3, 1์ผ ์ )์ ์ฌ์ฉ์์๊ฒ ์๋ฆผ ๋ฐ์ก.
+- **์๋ ํ์:** ๋ง๋ฃ์ผ ๋๋ ์ Linux ๊ณ์ ์ญ์ , DB ๋ฐ์ดํฐ ์ ๋ฆฌ(Cascade), UID ๋ฐ๋ฉ.
+
+### 3. ์๋ฆผ ์์คํ
(Slack & Email)
+- **์ฌ์ฉ์:** ์ ์ฒญ ๊ฒฐ๊ณผ, ๋ง๋ฃ ์๊ณ , ์ญ์ ์๋ฃ ์๋ด.
+- **๊ด๋ฆฌ์:** ์๋ฒ ์ค๋ฅ, ์์ ์ญ์ ๋ฆฌํฌํธ (Lab/Farm ํ๊ทธ ๊ตฌ๋ถ).
+
+
+
+## ๐ ๊ธฐ์ ์คํ
+
+| ๋ถ๋ฅ | ๊ธฐ์ | ๋น๊ณ |
+| :--- | :--- | :--- |
+| **Language** | Java 17 | |
+| **Framework** | Spring Boot 3.2 | Web, Security |
+| **Database** | MySQL 8.0 | ์ด์ DB |
+| **ORM** | Spring Data JPA | Hibernate 6.x |
+| **Message Queue** | Redis | ์๋ฆผ ๋น๋๊ธฐ ์ฒ๋ฆฌ |
+| **Infrastructure** | Docker, Linux | Ubuntu ๊ณ์ ์ฐ๋ |
+| **Build Tool** | Gradle | |
+
+
+
+## ๐ ์คํ ๋ฐฉ๋ฒ
+
+### 1. ์ฌ์ ์๊ตฌ์ฌํญ (Prerequisites)
+* Java 17+
+* Redis
+* MySQL
+
+### 2. ๋ก์ปฌ ํ๊ฒฝ ์คํ
+```bash
+# 1. Repository Clone
+git clone [https://github.com/DGU-AI-LAB/admin-be.git](https://github.com/DGU-AI-LAB/admin-be.git)
+cd admin-be
+
+# 2. Redis & DB ์คํ (Docker ํ์ฉ ์)
+docker run -d -p 6379:6379 --name redis redis
+
+# 3. ์ ํ๋ฆฌ์ผ์ด์
๋น๋ ๋ฐ ์คํ
+./gradlew clean build
+java -jar build/libs/admin-be-0.0.1-SNAPSHOT.jar
+```
+
+### 3. โ๏ธ ํ๊ฒฝ ๋ณ์ ์ค์
+`src/main/resources/application.yml` ํ์ผ์ ๋
ธ์
์ ์ ๋ฆฌ๋ ์ค์ ๊ฐ์ ํ์๋ก ์
๋ ฅํด์ผ ์ ์ ๋์ํฉ๋๋ค.
+
+### 1. ๋ธ๋์น ์ ๋ต (Branch Strategy)
+์ฐ๋ฆฌ๋ Git Flow ์ ๋ต์ ๊ธฐ๋ฐ์ผ๋ก ์ด์ํ๋ฉฐ, main ๋ธ๋์น์ ์ฝ๋๊ฐ ํตํฉ๋ ๋๋ง ์ค์ ์๋ฒ ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
+| ๋ธ๋์น ์ด๋ฆ | ์ญํ | ๋ฐฐํฌ ์ฌ๋ถ | ๋น๊ณ |
+| :--- | :--- | :---: | :--- |
+| **`main`** | **์ด์(Production) ํ๊ฒฝ** | **O (์๋)** | ๋ฐฐํฌ ์์ : PR Merge ์งํ |
+| **`develop`** | **๊ฐ๋ฐ(Development) ํตํฉ** | X | ๊ธฐ๋ฅ ๊ฐ๋ฐ ํ ํตํฉ ํ
์คํธ ์ฉ๋ |
+| `feature/*` | ๊ฐ๋ณ ๊ธฐ๋ฅ ๊ฐ๋ฐ | X | `develop`์์ ๋ถ๊ธฐํ์ฌ ์์
|
+| `hotfix/*` | ์ด์ ์ด์ ๊ธด๊ธ ์์ | O | `main`์์ ๋ถ๊ธฐ, Merge ํ ์ฆ์ ๋ฐฐํฌ (์ฌ์ฉ ๊ถ์ฅ X)|
+
+---
+
+### 2. CI/CD ํ์ดํ๋ผ์ธ (Deployment Pipeline)
+
+๋ฐฐํฌ ์๋ํ๋ **GitHub Actions**๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ค์ง `main` ๋ธ๋์น์ `push` ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์คํ๋ฉ๋๋ค.
+
+### ๐ ๋ฐฐํฌ ํ๋ฆ (Workflow)
+1. **Trigger**: `develop` โ `main`์ผ๋ก PR์ด Merge ๋๋ฉด ์ํฌํ๋ก์ฐ๊ฐ ์์๋ฉ๋๋ค.
+2. **Build & Push**:
+ * ์์ค ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค.
+ * ์ด๋ฏธ์ง ํ๊ทธ๋ `latest`์ `Git Commit Hash` ๋ ๊ฐ์ง๋ก ์์ฑ๋ฉ๋๋ค.
+ * Docker Hub์ ํ/์กฐ์ง ๋ ํฌ์งํ ๋ฆฌ๋ก Push ๋ฉ๋๋ค.
+3. **Deploy (Helm Upgrade)**:
+ * GitHub Actions๊ฐ ์ด์ ์๋ฒ(`farm8`)์ SSH๋ก ์ ์ํฉ๋๋ค.
+ * `helm upgrade` ๋ช
๋ น์ด๋ฅผ ํตํด Kubernetes ๋ฐฐํฌ๋ฅผ ์ํํฉ๋๋ค.
+ * **Key Config**: `--set image.pullPolicy=Always` ์ต์
์ ํตํด ํญ์ ์ต์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ ๋ฐ๋๋ก ๊ฐ์ ํฉ๋๋ค.
+
+---
+
+## 3. ์์
๋ฐ ๋ฐฐํฌ ๊ท์น (Workflow Rules)
+
+ํ์ ๊ฐ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์์ ์ ์ธ ๋ฐฐํฌ๋ฅผ ์ํด ์๋ ์ ์ฐจ๋ฅผ ์ค์ํด ์ฃผ์ธ์.
+
+### ๐ ๊ธฐ๋ฅ ๊ฐ๋ฐ (Feature)
+1. ๋ณธ์ธ์ด ์์ฑํ Github ์ด์ ๋ฒํธ์ ๋ง์ถฐ `develop` ๋ธ๋์น์์ `feature/#๊ธฐ๋ฅ๋ฒํธ-๊ธฐ๋ฅ๋ช
` ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค. (e.g. feat/#155-scheduler)
+3. ๋ก์ปฌ์์ ๊ฐ๋ฐ ๋ฐ ํ
์คํธ๋ฅผ ์งํํฉ๋๋ค.
+4. ์ปค๋ฐ ๋ฉ์์ง ์์: [๋ถ๋ฅ] #issue ์ค๋ช
(e.g. `[feat] #4 ๋ฉ์ธ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ`)
+6. ์์
์ด ์๋ฃ๋๋ฉด `feature` โ `develop` ๋ธ๋์น๋ก Pull Request(PR)๋ฅผ ์์ฑํฉ๋๋ค.
+
+### ๐ ์ ๊ธฐ ๋ฐฐํฌ (Release)
+1. `develop` ๋ธ๋์น์ ์ถฉ๋ถํ ๊ธฐ๋ฅ์ด ๋ชจ์ด๊ณ ํ
์คํธ๊ฐ ์๋ฃ๋๋ฉด ๋ฐฐํฌ๋ฅผ ์ค๋นํฉ๋๋ค.
+2. PR ์ ๋ชฉ: `[deploy] develop -> main (๋๋ ๋ถ๊ฐ ์ค๋ช
)` **`develop` โ `main`** ์ผ๋ก PR์ ์์ฑํฉ๋๋ค.
+3. ์ฝ๋ ๋ฆฌ๋ทฐ(Approve) ํ Merge ๋ฒํผ์ ๋๋ฅด๋ฉด, **์ฆ์ ์ด์ ์๋ฒ์ ๋ฐฐํฌ๋ฉ๋๋ค.** ์ต์ ํ ๋ช
์ด์์ Approve๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค.
+
+---
+
+## 4. API ๋ฌธ์ ๋ฐ ๋ชจ๋ํฐ๋ง
+
+์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์คํ ์ค์ผ ๋, ์๋ ์ฃผ์์์ API ๋ช
์ธ(Swagger)๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
+
+* **Swagger UI**: `http://{farm_server_ip}:{port}/apidocs/`
+* **Health Check**: `http://{farm_server_ip}:{port}/health`
+
+> **์ฐธ๊ณ **: NodePort๋ `values.yaml` ์ค์ ์ ๋ฐ๋ฆ
๋๋ค.
+
+---
+
+## 5. ํธ๋ฌ๋ธ์ํ
(Troubleshooting)
+
+๋ฐฐํฌ ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ํ์ธ ๋ฐ ์กฐ์น ๋ฐฉ๋ฒ์
๋๋ค.
+
+### 1. Pod ์ํ ํ์ธ
+```bash
+kubectl get pods -n cssh
+```
+- ์ ์: Running (READY 1/1)
+- ์ค๋ฅ: CrashLoopBackOff, ImagePullBackOff, Pending
+
+### 2. ๋ก๊ทธ ํ์ธ
+
+์๋ฒ๊ฐ ๋จ์ง ์๊ฑฐ๋ ๋์์ด ์ด์ํ ๋ ์ค์๊ฐ ๋ก๊ทธ๋ฅผ ํ์ธํฉ๋๋ค.
+```bash
+# Pod ์ด๋ฆ ํ์ธ ํ
+kubectl logs -f -n cssh
+```
+
+## 6. ํ๊ฒฝ ๋ณ์ ๋ฐ ์ํฌ๋ฆฟ
+CI/CD ์๋์ ์ํด GitHub Repository Secrets์ ๋ค์ ๋ณ์๋ค์ด ๋ฑ๋ก๋์ด ์์ต๋๋ค.
+- Docker Hub: `DOCKER_USERNAME`, `DOCKER_PASSWORD`
+- Kubernetes Access: `K8S_HOST`, `K8S_USERNAME`, `K8S_PRIVATE_KEY`, `K8S_PORT`
+> ํ์ฌ๋ username์ด toni์ {key}๋ก ๋์ด์์ผ๋ฉฐ, ๊ด๋ฆฌ์ ๋ณ๊ฒฝ ์ ์ธ์์ธ๊ณ๊ฐ ํ์ํฉ๋๋ค.
+
+## ๐ ๋ฌธ์ ๋ฐ ์ํค
+๋ ์์ธํ ๊ฐ๋ฐ ๊ฐ์ด๋์ ํธ๋ฌ๋ธ์ํ
๋ก๊ทธ๋ **GitHub Wiki**๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
+
+> ๊ด๋ จ ๋งํฌ
+> [์ธํ๋ผ ์๋ฒ](https://github.com/CSID-DGU/admin_infra)
+> [ํ๋ก ํธ์๋](https://github.com/CSID-DGU/AILab-FE)
+