158 lines
8.1 KiB
Markdown
158 lines
8.1 KiB
Markdown
# Gyber - 통합 자산 관리 시스템
|
|
|
|
**Gyber**는 사내 IT 자산을 효율적으로 관리하기 위한 통합 시스템입니다. Windows 클라이언트 PC의 하드웨어 정보를 PowerShell 스크립트로 자동 수집하고, Rust로 작성된 동기화 에이전트가 이를 중앙 데이터베이스에 반영합니다. 관리자는 Django로 제작된 웹 인터페이스를 통해 자산을 조회, 추가, 수정, 삭제하고, 사용자별 할당 현황 및 감사 로그를 확인할 수 있습니다.
|
|
|
|
|
|
## ✨ 주요 기능
|
|
|
|
* **💻 하드웨어 정보 자동 수집:** PowerShell 스크립트를 통해 CPU, 메모리, 디스크, VGA 등 상세 하드웨어 정보를 수집합니다.
|
|
* **⚙️ Rust 기반 데이터 동기화:** Rust로 작성된 강력하고 안정적인 에이전트가 수집된 정보를 중앙 DB와 동기화합니다.
|
|
* **🌐 웹 기반 관리 인터페이스:** Django 프레임워크를 사용하여 직관적인 웹 UI를 제공합니다.
|
|
* 자산, 사용자, 그룹(부서), 카테고리의 CRUD(생성, 읽기, 수정, 삭제) 기능
|
|
* 강력한 검색, 필터링 및 정렬 기능
|
|
* 대시보드를 통한 자산 현황 요약
|
|
* 변경 이력 추적을 위한 상세 감사 로그
|
|
* **🔒 동기화 잠금 기능:** 웹에서 수동으로 입력하거나 중요한 자산 정보를 자동 동기화로부터 보호하는 잠금 기능
|
|
* **🔐 Azure AD 기반 SSO:** OpenID Connect(OIDC)를 통한 안전하고 편리한 사용자 인증
|
|
* **🎨 다크/라이트 모드 지원:** 사용자 편의를 위한 동적 테마 전환
|
|
* **📊 데이터 내보내기:** 현재 조회 중인 목록을 CSV 파일로 내보내기
|
|
|
|
## 🛠️ 기술 스택
|
|
|
|
* **백엔드 (웹):** Python, Django
|
|
* **백엔드 (동기화 에이전트):** Rust
|
|
* **프론트엔드:** HTML, CSS, JavaScript, Bootstrap 5, Select2, Chart.js
|
|
* **데이터베이스:** MariaDB / MySQL
|
|
* **인프라:** Nginx, Gunicorn, systemd
|
|
* **인증:** Azure Active Directory (OIDC)
|
|
* **클라이언트 정보 수집:** PowerShell
|
|
|
|
## 🚀 시작하기
|
|
|
|
이 프로젝트는 크게 **웹 애플리케이션 (Django)**과 **데이터 동기화 에이전트 (Rust)**, 그리고 **DB 자격 증명 암호화 유틸리티 (Rust)**로 구성됩니다.
|
|
|
|
### 사전 준비 사항
|
|
|
|
* Ubuntu Server 22.04 LTS (또는 유사한 Linux 배포판)
|
|
* MariaDB 또는 MySQL 데이터베이스 서버
|
|
* Rust 개발 환경 (rustup 권장)
|
|
* Python 3.12+ 개발 환경
|
|
* Nginx
|
|
* Azure Active Directory 테넌트 및 앱 등록 정보 (클라이언트 ID, 시크릿, 테넌트 ID)
|
|
* (클라이언트 PC) PowerShell 5.1 이상
|
|
|
|
### 1. 데이터베이스 설정
|
|
|
|
1. MariaDB/MySQL에 `gyber` 데이터베이스와 `gyber` 사용자를 생성하고 권한을 부여합니다.
|
|
2. 제공된 DB 스키마 파일 (`schema.sql` 등)을 사용하여 테이블과 저장 프로시저를 생성합니다.
|
|
3. **시간대 정보 로드 (필수):** DB 서버에서 다음 명령을 실행하여 시간대 정보를 로드합니다.
|
|
```bash
|
|
sudo mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
|
|
```
|
|
|
|
### 2. Rust DB 자격 증명 암호화 유틸리티 (`rust_db_enc_creator`) 실행
|
|
|
|
이 유틸리티는 DB 접속 정보를 암호화하여 `db.enc` 파일을 생성합니다.
|
|
|
|
1. **`.env` 파일 생성:**
|
|
`apps/rust_db_enc_creator/` 디렉토리에 `.env` 파일을 만들고 다음 내용을 작성합니다.
|
|
```env
|
|
# apps/rust_db_enc_creator/.env
|
|
ENCRYPTION_KEY="your-strong-32-byte-encryption-key-here" # 32바이트(256비트) 키
|
|
```
|
|
2. **유틸리티 실행:**
|
|
```bash
|
|
cd apps/rust_db_enc_creator
|
|
cargo run
|
|
```
|
|
3. 실행이 완료되면 `apps/rust_db_enc_creator/` 디렉토리에 `db.enc` 파일이 생성됩니다. 이 파일을 **`apps/rust_gyber/config/` 디렉토리로 이동 또는 복사**합니다.
|
|
|
|
### 3. Rust 데이터 동기화 에이전트 (`rust_gyber`) 설정 및 실행
|
|
|
|
1. **환경 변수 설정:**
|
|
`apps/rust_gyber/` 디렉토리에 `.env` 파일을 만들고 암호화 유틸리티에서 사용한 것과 동일한 `ENCRYPTION_KEY`를 설정합니다.
|
|
```env
|
|
# apps/rust_gyber/.env
|
|
ENCRYPTION_KEY="your-strong-32-byte-encryption-key-here"
|
|
```
|
|
2. **설정 파일 확인:**
|
|
`apps/rust_gyber/config/config.json` 파일의 `json_file_path`가 PowerShell 스크립트가 정보를 저장하는 공유 폴더 경로와 일치하는지 확인합니다.
|
|
3. **컴파일 및 실행:**
|
|
```bash
|
|
cd apps/rust_gyber
|
|
cargo build --release # 프로덕션용으로 빌드
|
|
./target/release/gyber # 실행
|
|
```
|
|
* 실제 운영 시에는 이 Rust 애플리케이션도 `systemd` 서비스로 등록하여 백그라운드에서 주기적으로 실행되도록 구성하는 것이 좋습니다.
|
|
|
|
### 4. Django 웹 애플리케이션 (`web`) 설정 및 배포
|
|
|
|
이 프로젝트는 Ubuntu 22.04 서버에서 Nginx와 Gunicorn을 사용하여 프로덕션 환경에 배포하는 것을 기준으로 합니다.
|
|
|
|
1. **프로젝트 클론 및 Python 가상환경 설정:**
|
|
```bash
|
|
cd /data/gyber/apps # 예시 경로
|
|
git clone <your-repository-url> web
|
|
cd web
|
|
python3 -m venv vgyber
|
|
source vgyber/bin/activate
|
|
pip install -r requirements.txt
|
|
```
|
|
2. **환경 변수 파일 생성:**
|
|
`systemd` 서비스에서 사용할 환경 변수 파일을 생성합니다 (예: `/etc/gyber/gyber_prod.env`).
|
|
```bash
|
|
sudo mkdir -p /etc/gyber
|
|
sudo nano /etc/gyber/gyber_prod.env
|
|
```
|
|
파일 내용:
|
|
```env
|
|
DJANGO_SECRET_KEY="your_django_production_secret_key"
|
|
DB_PASSWORD="your_database_password"
|
|
OIDC_RP_CLIENT_ID="your_azure_ad_client_id"
|
|
OIDC_RP_CLIENT_SECRET="your_azure_ad_client_secret"
|
|
AZURE_TENANT_ID="your_azure_ad_tenant_id"
|
|
# 기타 필요한 환경 변수 (DB_HOST, DB_USER, OIDC_RP_POST_LOGOUT_REDIRECT_URI 등)
|
|
```
|
|
파일 권한을 설정합니다: `sudo chmod 600 /etc/gyber/gyber_prod.env`
|
|
|
|
3. **Django `settings.py` 확인:**
|
|
`apps/web/config/settings.py` 파일이 프로덕션 환경에 맞게 설정되었는지 확인합니다 (`DEBUG = False`, 환경 변수 참조 등).
|
|
|
|
4. **`collectstatic` 실행:**
|
|
```bash
|
|
# 가상 환경 활성화 상태에서
|
|
cd /data/gyber/apps/web
|
|
python manage.py collectstatic --noinput
|
|
```
|
|
5. **Gunicorn `systemd` 서비스 설정:**
|
|
* `/etc/systemd/system/gunicorn_gyber.socket` 및 `/etc/systemd/system/gunicorn_gyber.service` 파일을 생성하고 제공된 파일 내용을 복사합니다.
|
|
* 서비스 파일의 `User`, `Group`, `WorkingDirectory`, `ExecStart`, `EnvironmentFile` 경로가 실제 환경과 일치하는지 확인합니다.
|
|
* 서비스 시작 및 활성화:
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl start gunicorn_gyber.socket
|
|
sudo systemctl enable gunicorn_gyber.socket
|
|
sudo systemctl start gunicorn_gyber.service
|
|
sudo systemctl enable gunicorn_gyber.service
|
|
```
|
|
6. **Nginx 설정:**
|
|
* SSL/TLS 인증서 파일들을 안전한 위치(예: `/etc/nginx/ssl/gyber.oneunivrs.com/`)에 준비합니다.
|
|
* `/etc/nginx/sites-available/gyber_project` 설정 파일을 생성하고, `server_name`, `listen` 포트(`8438`), `ssl_certificate` 경로, `alias` 경로, `proxy_pass` 소켓 경로 등을 실제 환경에 맞게 수정합니다.
|
|
* 설정 활성화 및 Nginx 재시작:
|
|
```bash
|
|
sudo ln -s /etc/nginx/sites-available/gyber_project /etc/nginx/sites-enabled/
|
|
sudo nginx -t
|
|
sudo systemctl restart nginx
|
|
```
|
|
7. **방화벽 설정:**
|
|
```bash
|
|
sudo ufw allow 8438/tcp # HTTPS 포트
|
|
sudo ufw allow 80/tcp # HTTP->HTTPS 리디렉션 사용 시
|
|
```
|
|
|
|
### 5. 클라이언트 PC 설정 (PowerShell 스크립트)
|
|
|
|
1. `scripts/powershell/Collect-HWInfo.ps1` 스크립트를 클라이언트 PC에 배포합니다.
|
|
2. 스크립트 내의 `$saveDir` 변수를 실제 데이터가 저장될 네트워크 공유 폴더 경로로 수정합니다.
|
|
3. 이 스크립트가 각 PC에서 주기적으로 (예: 로그인 시 또는 예약된 작업으로) 실행되도록 설정합니다.
|