906 lines
29 KiB
Markdown
906 lines
29 KiB
Markdown
# iDRAC Info Manager
|
|
|
|
Dell iDRAC 서버 관리 및 펌웨어 업데이트 자동화를 위한 Flask 기반 웹 애플리케이션
|
|
|
|
## 📋 목차
|
|
|
|
- [소개](#소개)
|
|
- [주요 기능](#주요-기능)
|
|
- [기술 스택](#기술-스택)
|
|
- [시스템 아키텍처](#시스템-아키텍처)
|
|
- [시작하기](#시작하기)
|
|
- [프로젝트 구조](#프로젝트-구조)
|
|
- [사용법](#사용법)
|
|
- [고급 기능](#고급-기능)
|
|
- [Git 사용법](#git-사용법)
|
|
- [문제 해결](#문제-해결)
|
|
- [라이선스](#라이선스)
|
|
|
|
## 📖 소개
|
|
|
|
**iDRAC Info Manager**는 Dell iDRAC(Integrated Dell Remote Access Controller) 서버를 효율적으로 관리하고 펌웨어 업데이트를 자동화하기 위한 웹 기반 도구입니다.
|
|
|
|
이 애플리케이션은 다음과 같은 시나리오에서 유용합니다:
|
|
- 여러 대의 Dell 서버를 동시에 관리해야 할 때
|
|
- 펌웨어 카탈로그를 주기적으로 업데이트하고 관리해야 할 때
|
|
- iDRAC 설정을 XML 파일로 관리하고 배포해야 할 때
|
|
- 서버 하드웨어 정보(MAC, GUID, GPU 등)를 수집하고 관리해야 할 때
|
|
- Telegram을 통해 서버 관리 알림을 받고 싶을 때
|
|
|
|
## ✨ 주요 기능
|
|
|
|
### 🖥️ iDRAC 서버 관리
|
|
- **Redfish API 통합**: Dell Redfish API를 통한 서버 정보 조회 및 제어
|
|
- **다중 IP 처리**: 여러 서버에 대한 일괄 작업 실행
|
|
- **실시간 모니터링**: SocketIO를 통한 실시간 작업 진행 상황 확인
|
|
- **작업 큐 관리**: 백그라운드 작업 스케줄링 및 상태 추적
|
|
|
|
### 📦 펌웨어 관리
|
|
- **Dell 카탈로그 동기화**: Dell 공식 펌웨어 카탈로그 자동 다운로드 및 파싱
|
|
- **DRM 통합**: Dell Repository Manager(DRM) XML 파일 지원
|
|
- **펌웨어 버전 추적**: 서버별 펌웨어 버전 비교 및 업데이트 필요 여부 확인
|
|
- **카탈로그 관리**: 여러 펌웨어 카탈로그 버전 관리 및 전환
|
|
|
|
### 📄 XML 설정 관리
|
|
- **XML 파일 업로드**: iDRAC 설정 XML 파일 업로드 및 저장
|
|
- **설정 편집**: 웹 인터페이스를 통한 XML 설정 편집
|
|
- **SCP 파일 관리**: Server Configuration Profile 파일 관리
|
|
- **자동 백업**: 파일 변경 시 자동 백업 생성
|
|
|
|
### 📊 데이터 수집 및 변환
|
|
- **MAC 주소 수집**: 서버 네트워크 인터페이스 MAC 주소 수집
|
|
- **GUID 추출**: 서버 GUID 정보 추출 및 관리
|
|
- **GPU 시리얼 수집**: GPU 하드웨어 시리얼 번호 수집
|
|
- **Excel 변환**: 수집된 데이터를 Excel 파일로 자동 변환
|
|
- **서버 리스트 관리**: 서버 목록 관리 및 매핑
|
|
|
|
### 👥 사용자 관리
|
|
- **인증 시스템**: Flask-Login 기반 보안 인증
|
|
- **사용자 승인 워크플로우**: 신규 사용자 등록 시 관리자 승인 필요
|
|
- **Telegram 승인**: Telegram 봇을 통한 사용자 승인/거부
|
|
- **비밀번호 암호화**: Argon2 해싱을 통한 안전한 비밀번호 저장
|
|
- **세션 관리**: 자동 로그아웃 및 세션 타임아웃
|
|
|
|
### 📱 Telegram 봇 통합
|
|
- **실시간 알림**: 로그인, 회원가입, 작업 완료 알림
|
|
- **인터랙티브 승인**: 인라인 버튼을 통한 사용자 승인/거부
|
|
- **봇 폴링 서비스**: 백그라운드 스레드에서 실행되는 봇 서비스
|
|
- **중복 실행 방지**: 봇 인스턴스 중복 실행 방지 메커니즘
|
|
|
|
### 🔍 실시간 파일 모니터링
|
|
- **Watchdog 통합**: 파일 시스템 변경 실시간 감지
|
|
- **자동 UI 업데이트**: 파일 변경 시 웹 인터페이스 자동 갱신
|
|
- **이벤트 로깅**: 파일 생성, 수정, 삭제 이벤트 로깅
|
|
|
|
## 🛠 기술 스택
|
|
|
|
### Backend Framework
|
|
- **Flask 3.1.2**: 경량 웹 프레임워크
|
|
- **Flask-SocketIO 5.5.1**: 실시간 양방향 통신
|
|
- **Flask-Login 0.6.3**: 사용자 인증 및 세션 관리
|
|
- **Flask-Migrate 4.1.0**: 데이터베이스 마이그레이션
|
|
- **Flask-WTF 1.2.2**: 폼 처리 및 CSRF 보호
|
|
|
|
### Database
|
|
- **SQLAlchemy 2.0.43**: ORM (Object-Relational Mapping)
|
|
- **Flask-SQLAlchemy 3.1.1**: Flask-SQLAlchemy 통합
|
|
- **Alembic 1.16.5**: 데이터베이스 마이그레이션 도구
|
|
- **SQLite**: 기본 데이터베이스 (운영 환경에서는 PostgreSQL/MySQL 권장)
|
|
|
|
### Security
|
|
- **Argon2-cffi 25.1.0**: 비밀번호 해싱
|
|
- **Flask-WTF**: CSRF 토큰 보호
|
|
- **Werkzeug 3.1.3**: 보안 유틸리티
|
|
|
|
### Data Processing
|
|
- **Pandas 2.3.3**: 데이터 분석 및 처리
|
|
- **NumPy 2.3.3**: 수치 연산
|
|
- **OpenPyXL 3.1.5**: Excel 파일 생성 및 편집
|
|
- **Chardet 5.2.0**: 문자 인코딩 자동 감지
|
|
- **Natsort 8.4.0**: 자연스러운 정렬
|
|
|
|
### Real-time Communication
|
|
- **Python-SocketIO 5.14.1**: SocketIO 서버 구현
|
|
- **Python-EngineIO 4.12.3**: EngineIO 프로토콜
|
|
- **Simple-WebSocket 1.1.0**: WebSocket 통신
|
|
|
|
### Monitoring & Notifications
|
|
- **Watchdog 6.0.0**: 파일 시스템 모니터링
|
|
- **Python-Telegram-Bot 22.5**: Telegram 봇 API
|
|
|
|
### HTTP & API
|
|
- **Requests 2.32.3**: HTTP 클라이언트
|
|
- **DNSPython 2.8.0**: DNS 조회
|
|
|
|
### Frontend
|
|
- **Bootstrap 5**: 반응형 UI 프레임워크
|
|
- **Bootstrap Icons**: 아이콘 세트
|
|
- **Socket.IO Client**: 실시간 통신 클라이언트
|
|
- **JavaScript (ES6+)**: 클라이언트 사이드 로직
|
|
|
|
### Development & Testing
|
|
- **Pytest 8.0.0**: 테스트 프레임워크
|
|
- **Pytest-Mock 3.12.0**: 모킹 라이브러리
|
|
- **Python-Dotenv 1.0.1**: 환경 변수 관리
|
|
|
|
## 🏗️ 시스템 아키텍처
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Client Browser │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ HTML/CSS │ │ JavaScript │ │ SocketIO CLI │ │
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
↕ HTTP/WebSocket
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Flask Application │
|
|
│ ┌──────────────────────────────────────────────────────┐ │
|
|
│ │ Routes Layer │ │
|
|
│ │ • auth.py (인증) • main.py (메인) │ │
|
|
│ │ • admin.py (관리) • api.py (API) │ │
|
|
│ └──────────────────────────────────────────────────────┘ │
|
|
│ ┌──────────────────────────────────────────────────────┐ │
|
|
│ │ Services Layer │ │
|
|
│ │ • redfish_client.py (iDRAC 통신) │ │
|
|
│ │ • firmware_service.py (펌웨어 관리) │ │
|
|
│ │ • watchdog_handler.py (파일 모니터링) │ │
|
|
│ │ • logger.py (로깅) │ │
|
|
│ └──────────────────────────────────────────────────────┘ │
|
|
│ ┌──────────────────────────────────────────────────────┐ │
|
|
│ │ Models Layer │ │
|
|
│ │ • user.py (사용자) • job.py (작업) │ │
|
|
│ │ • firmware.py (펌웨어) │ │
|
|
│ └──────────────────────────────────────────────────────┘ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
↕
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ External Services │
|
|
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
│ │ SQLite DB │ │ Telegram Bot │ │ Dell Redfish │ │
|
|
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
### 주요 컴포넌트
|
|
|
|
1. **Routes (라우트)**
|
|
- 사용자 요청을 받아 적절한 서비스로 전달
|
|
- 인증, 권한 검사, 입력 검증 수행
|
|
|
|
2. **Services (서비스)**
|
|
- 비즈니스 로직 구현
|
|
- 외부 API 통신 (Redfish, Telegram)
|
|
- 파일 처리 및 데이터 변환
|
|
|
|
3. **Models (모델)**
|
|
- 데이터베이스 스키마 정의
|
|
- ORM을 통한 데이터 접근
|
|
|
|
4. **SocketIO Events**
|
|
- 실시간 양방향 통신
|
|
- 진행 상황 업데이트
|
|
- 파일 변경 알림
|
|
|
|
## 🚀 시작하기
|
|
|
|
### 필수 요구사항
|
|
|
|
- **Python 3.8 이상** (Python 3.10+ 권장)
|
|
- **pip** (Python 패키지 관리자)
|
|
- **Git** (버전 관리)
|
|
- **Dell iDRAC 9 이상** (Redfish API 지원)
|
|
|
|
### 설치 방법
|
|
|
|
#### Windows
|
|
|
|
```powershell
|
|
# 1. 저장소 클론
|
|
git clone https://github.com/yourusername/idrac_info.git
|
|
cd idrac_info
|
|
|
|
# 2. 가상환경 생성 및 활성화
|
|
python -m venv venv
|
|
.\venv\Scripts\Activate.ps1
|
|
|
|
# 3. 의존성 설치
|
|
pip install -r requirements.txt
|
|
|
|
# 4. 환경 변수 설정 (.env 파일 생성)
|
|
Copy-Item .env.example .env
|
|
# .env 파일을 편집하여 필요한 값 설정
|
|
|
|
# 5. 데이터베이스 초기화
|
|
flask db upgrade
|
|
|
|
# 6. 애플리케이션 실행
|
|
python app.py
|
|
```
|
|
|
|
#### Linux / macOS
|
|
|
|
```bash
|
|
# 1. 저장소 클론
|
|
git clone https://github.com/yourusername/idrac_info.git
|
|
cd idrac_info
|
|
|
|
# 2. 가상환경 생성 및 활성화
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
|
|
# 3. 의존성 설치
|
|
pip install -r requirements.txt
|
|
|
|
# 4. 환경 변수 설정 (.env 파일 생성)
|
|
cp .env.example .env
|
|
# .env 파일을 편집하여 필요한 값 설정
|
|
|
|
# 5. 데이터베이스 초기화
|
|
flask db upgrade
|
|
|
|
# 6. 애플리케이션 실행
|
|
python app.py
|
|
```
|
|
|
|
### 환경 설정
|
|
|
|
`.env` 파일을 생성하고 다음 내용을 설정하세요:
|
|
|
|
```env
|
|
# ========================================
|
|
# Flask 기본 설정
|
|
# ========================================
|
|
SECRET_KEY=your-super-secret-key-change-this-in-production
|
|
FLASK_ENV=development
|
|
FLASK_DEBUG=true
|
|
FLASK_HOST=0.0.0.0
|
|
FLASK_PORT=5000
|
|
|
|
# ========================================
|
|
# 데이터베이스 설정
|
|
# ========================================
|
|
# SQLite (개발용)
|
|
DATABASE_URL=sqlite:///backend/instance/site.db
|
|
|
|
# PostgreSQL (운영용 - 권장)
|
|
# DATABASE_URL=postgresql://username:password@localhost:5432/idrac_info
|
|
|
|
# MySQL (운영용)
|
|
# DATABASE_URL=mysql://username:password@localhost:3306/idrac_info
|
|
|
|
# ========================================
|
|
# Redfish API 설정
|
|
# ========================================
|
|
REDFISH_TIMEOUT=15
|
|
REDFISH_VERIFY_SSL=false
|
|
|
|
# ========================================
|
|
# Telegram Bot 설정 (선택 사항)
|
|
# ========================================
|
|
# Telegram BotFather에서 봇 생성 후 토큰 입력
|
|
TELEGRAM_BOT_TOKEN=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz
|
|
# Telegram에서 본인의 Chat ID 입력
|
|
TELEGRAM_CHAT_ID=123456789
|
|
|
|
# ========================================
|
|
# 데이터 디렉토리 설정
|
|
# ========================================
|
|
APP_DATA_DIR=./data
|
|
|
|
# ========================================
|
|
# 업로드 및 파일 설정
|
|
# ========================================
|
|
MAX_CONTENT_LENGTH=10485760 # 10MB
|
|
FILES_PER_PAGE=35
|
|
BACKUP_FILES_PER_PAGE=3
|
|
|
|
# ========================================
|
|
# 작업 처리 설정
|
|
# ========================================
|
|
MAX_WORKERS=60 # 동시 처리 가능한 최대 작업 수
|
|
|
|
# ========================================
|
|
# 세션 설정
|
|
# ========================================
|
|
SESSION_MINUTES=30 # 세션 타임아웃 (분)
|
|
|
|
# ========================================
|
|
# SocketIO 설정
|
|
# ========================================
|
|
# threading (Windows 권장) / eventlet (Linux 권장)
|
|
SOCKETIO_ASYNC_MODE=threading
|
|
|
|
# ========================================
|
|
# 데이터베이스 자동 부트스트랩 (개발용만)
|
|
# ========================================
|
|
AUTO_BOOTSTRAP_DB=false
|
|
```
|
|
|
|
### 초기 관리자 계정 생성
|
|
|
|
```bash
|
|
# Flask shell 실행
|
|
flask shell
|
|
|
|
# Python 인터프리터에서 실행
|
|
>>> from backend.models.user import db, User
|
|
>>> admin = User(username='admin', email='admin@example.com', is_admin=True, is_approved=True)
|
|
>>> admin.set_password('your-admin-password')
|
|
>>> db.session.add(admin)
|
|
>>> db.session.commit()
|
|
>>> exit()
|
|
```
|
|
|
|
### 실행 방법
|
|
|
|
```bash
|
|
# 개발 서버 실행
|
|
python app.py
|
|
|
|
# 또는 Flask CLI 사용
|
|
flask run
|
|
|
|
# 특정 호스트/포트 지정
|
|
flask run --host=0.0.0.0 --port=8080
|
|
```
|
|
|
|
브라우저에서 `http://localhost:5000` 접속
|
|
|
|
## 📁 프로젝트 구조
|
|
|
|
```
|
|
idrac_info/
|
|
├── app.py # 메인 애플리케이션 엔트리포인트
|
|
├── config.py # 애플리케이션 설정
|
|
├── requirements.txt # Python 의존성 목록
|
|
├── telegram_bot_service.py # Telegram 봇 폴링 서비스
|
|
├── migrate_passwords.py # 비밀번호 마이그레이션 스크립트
|
|
├── update_db.py # 데이터베이스 업데이트 스크립트
|
|
├── update_user_approval.py # 사용자 승인 상태 업데이트 스크립트
|
|
├── check_telegram.py # Telegram 설정 확인 스크립트
|
|
│
|
|
├── .env # 환경 변수 (git에서 제외)
|
|
├── .gitignore # Git 제외 파일 목록
|
|
│
|
|
├── backend/ # 백엔드 코드
|
|
│ ├── __init__.py
|
|
│ │
|
|
│ ├── models/ # 데이터베이스 모델
|
|
│ │ ├── __init__.py
|
|
│ │ ├── user.py # 사용자 모델
|
|
│ │ ├── job.py # 작업 모델
|
|
│ │ ├── firmware.py # 펌웨어 모델
|
|
│ │ └── telegram_bot.py # Telegram 봇 모델
|
|
│ │
|
|
│ ├── routes/ # 라우트 핸들러
|
|
│ │ ├── __init__.py
|
|
│ │ ├── main.py # 메인 페이지 라우트
|
|
│ │ ├── auth.py # 인증 라우트
|
|
│ │ ├── admin.py # 관리자 라우트
|
|
│ │ ├── api.py # API 엔드포인트
|
|
│ │ ├── firmware.py # 펌웨어 관리 라우트
|
|
│ │ └── xml_routes.py # XML 파일 관리 라우트
|
|
│ │
|
|
│ ├── services/ # 비즈니스 로직
|
|
│ │ ├── __init__.py
|
|
│ │ ├── redfish_client.py # Redfish API 클라이언트
|
|
│ │ ├── firmware_service.py # 펌웨어 관리 서비스
|
|
│ │ ├── drm_parser.py # DRM XML 파서
|
|
│ │ ├── watchdog_handler.py # 파일 모니터링
|
|
│ │ ├── logger.py # 로깅 설정
|
|
│ │ ├── platform_utils.py # 플랫폼 유틸리티
|
|
│ │ └── file_utils.py # 파일 유틸리티
|
|
│ │
|
|
│ ├── forms/ # WTForms 폼
|
|
│ │ ├── __init__.py
|
|
│ │ ├── auth_forms.py # 인증 폼
|
|
│ │ └── admin_forms.py # 관리자 폼
|
|
│ │
|
|
│ ├── templates/ # Jinja2 템플릿
|
|
│ │ ├── base.html # 기본 레이아웃
|
|
│ │ ├── index.html # 메인 페이지
|
|
│ │ ├── login.html # 로그인 페이지
|
|
│ │ ├── register.html # 회원가입 페이지
|
|
│ │ ├── admin.html # 관리자 페이지
|
|
│ │ ├── admin_settings.html # 관리자 설정
|
|
│ │ ├── jobs.html # 작업 관리
|
|
│ │ ├── idrac_firmware.html # 펌웨어 관리
|
|
│ │ ├── xml_files.html # XML 파일 목록
|
|
│ │ └── edit_xml.html # XML 편집기
|
|
│ │
|
|
│ ├── static/ # 정적 파일
|
|
│ │ ├── css/
|
|
│ │ │ ├── admin.css
|
|
│ │ │ ├── admin_settings.css
|
|
│ │ │ ├── edit_xml.css
|
|
│ │ │ ├── index.css
|
|
│ │ │ └── jobs.css
|
|
│ │ ├── js/
|
|
│ │ │ ├── admin.js
|
|
│ │ │ ├── admin_settings.js
|
|
│ │ │ ├── edit_xml.js
|
|
│ │ │ ├── index.js
|
|
│ │ │ └── jobs.js
|
|
│ │ └── images/
|
|
│ │
|
|
│ ├── instance/ # 인스턴스별 데이터
|
|
│ │ └── site.db # SQLite 데이터베이스
|
|
│ │
|
|
│ └── socketio_events.py # SocketIO 이벤트 핸들러
|
|
│
|
|
├── data/ # 애플리케이션 데이터
|
|
│ ├── logs/ # 로그 파일
|
|
│ ├── uploads/ # 업로드된 파일
|
|
│ ├── temp_ip/ # 임시 IP 파일
|
|
│ ├── temp_zips/ # 임시 ZIP 파일
|
|
│ ├── xml/ # XML 설정 파일
|
|
│ ├── scripts/ # 스크립트 파일
|
|
│ ├── idrac_info/ # iDRAC 정보 파일
|
|
│ ├── mac/ # MAC 주소 파일
|
|
│ ├── guid_file/ # GUID 파일
|
|
│ ├── gpu_serial/ # GPU 시리얼 파일
|
|
│ ├── mac_backup/ # MAC 백업 파일
|
|
│ └── server_list/ # 서버 리스트 파일
|
|
│
|
|
├── migrations/ # Alembic 마이그레이션
|
|
│ ├── versions/ # 마이그레이션 버전
|
|
│ ├── alembic.ini
|
|
│ ├── env.py
|
|
│ └── README
|
|
│
|
|
├── tests/ # 테스트 코드
|
|
│ ├── __init__.py
|
|
│ ├── test_auth.py
|
|
│ ├── test_api.py
|
|
│ └── test_services.py
|
|
│
|
|
└── venv/ # 가상환경 (git에서 제외)
|
|
```
|
|
|
|
## 💡 사용법
|
|
|
|
### 1. 로그인 및 회원가입
|
|
|
|
1. 브라우저에서 `http://localhost:5000` 접속
|
|
2. 회원가입 페이지에서 계정 생성
|
|
3. 관리자 승인 대기 (Telegram 봇 설정 시 자동 알림)
|
|
4. 승인 후 로그인
|
|
|
|
### 2. iDRAC 서버 정보 수집
|
|
|
|
1. 메인 페이지에서 "IP 처리" 섹션 선택
|
|
2. 스크립트 선택 (예: `get_idrac_info.py`)
|
|
3. IP 주소 입력 (각 줄에 하나씩)
|
|
```
|
|
192.168.1.100
|
|
192.168.1.101
|
|
192.168.1.102
|
|
```
|
|
4. iDRAC 사용자명/비밀번호 입력
|
|
5. "처리" 버튼 클릭
|
|
6. 실시간 진행 상황 확인
|
|
7. 완료 후 결과 파일 다운로드
|
|
|
|
### 3. 펌웨어 카탈로그 관리
|
|
|
|
1. 관리자 페이지 접속
|
|
2. "펌웨어 관리" 섹션 선택
|
|
3. "Dell 카탈로그 동기화" 버튼 클릭
|
|
4. 카탈로그 다운로드 및 파싱 대기
|
|
5. 펌웨어 목록 확인
|
|
|
|
### 4. DRM XML 파일 업로드
|
|
|
|
1. Dell Repository Manager에서 XML 카탈로그 생성
|
|
2. 관리자 설정 페이지 접속
|
|
3. "DRM Repository 상태 확인" 클릭
|
|
4. XML 파일 업로드
|
|
5. "DRM 데이터 동기화" 클릭
|
|
|
|
### 5. XML 설정 파일 관리
|
|
|
|
1. "XML 파일" 메뉴 선택
|
|
2. XML 파일 업로드 또는 기존 파일 선택
|
|
3. "편집" 버튼 클릭하여 웹 에디터에서 수정
|
|
4. 저장 시 자동 백업 생성
|
|
5. SCP 파일 다운로드 또는 서버에 적용
|
|
|
|
### 6. MAC/GUID 데이터 수집 및 변환
|
|
|
|
#### MAC 주소 수집
|
|
1. "MAC to Excel" 섹션 선택
|
|
2. MAC 주소 데이터 입력 또는 파일 업로드
|
|
3. 서버 리스트 입력 (선택 사항)
|
|
4. "변환" 버튼 클릭
|
|
5. 생성된 Excel 파일 다운로드
|
|
|
|
#### GUID 수집
|
|
1. "GUID to Excel" 섹션 선택
|
|
2. GUID 데이터 입력
|
|
3. 서버 리스트 매핑
|
|
4. Excel 파일 생성 및 다운로드
|
|
|
|
### 7. 작업 모니터링
|
|
|
|
1. "작업 관리" 메뉴 선택
|
|
2. 실행 중인 작업 목록 확인
|
|
3. 작업 상세 정보 보기
|
|
4. 필요시 작업 취소
|
|
|
|
## 🔧 고급 기능
|
|
|
|
### Telegram 봇 설정
|
|
|
|
#### 1. Telegram 봇 생성
|
|
|
|
1. Telegram에서 [@BotFather](https://t.me/botfather) 검색
|
|
2. `/newbot` 명령어 입력
|
|
3. 봇 이름 및 사용자명 설정
|
|
4. 발급받은 토큰을 `.env` 파일의 `TELEGRAM_BOT_TOKEN`에 입력
|
|
|
|
#### 2. Chat ID 확인
|
|
|
|
1. [@userinfobot](https://t.me/userinfobot) 검색
|
|
2. 봇과 대화 시작
|
|
3. 표시되는 ID를 `.env` 파일의 `TELEGRAM_CHAT_ID`에 입력
|
|
|
|
#### 3. 봇 기능 활성화
|
|
|
|
- 애플리케이션 재시작 시 자동으로 봇 폴링 시작
|
|
- 사용자 로그인/회원가입 시 Telegram 알림 전송
|
|
- 신규 사용자 승인 요청 시 인라인 버튼으로 승인/거부 가능
|
|
|
|
### 데이터베이스 마이그레이션
|
|
|
|
#### 새로운 마이그레이션 생성
|
|
|
|
```bash
|
|
# 모델 변경 후 마이그레이션 파일 생성
|
|
flask db migrate -m "Add new column to user table"
|
|
|
|
# 마이그레이션 적용
|
|
flask db upgrade
|
|
|
|
# 마이그레이션 롤백
|
|
flask db downgrade
|
|
```
|
|
|
|
#### 기존 데이터베이스 업그레이드
|
|
|
|
```bash
|
|
# 현재 마이그레이션 상태 확인
|
|
flask db current
|
|
|
|
# 최신 버전으로 업그레이드
|
|
flask db upgrade
|
|
|
|
# 특정 버전으로 업그레이드
|
|
flask db upgrade <revision>
|
|
```
|
|
|
|
### 비밀번호 해싱 마이그레이션
|
|
|
|
기존 사용자의 비밀번호를 Argon2로 마이그레이션:
|
|
|
|
```bash
|
|
python migrate_passwords.py
|
|
```
|
|
|
|
### 사용자 승인 상태 업데이트
|
|
|
|
기존 사용자를 일괄 승인:
|
|
|
|
```bash
|
|
python update_user_approval.py
|
|
```
|
|
|
|
### 로그 관리
|
|
|
|
로그 파일 위치: `data/logs/app.log`
|
|
|
|
로그 레벨 설정 (`.env` 파일):
|
|
```env
|
|
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR, CRITICAL
|
|
```
|
|
|
|
로그 파일 로테이션:
|
|
- 자동으로 날짜별 로그 파일 생성
|
|
- 최대 30일간 보관
|
|
|
|
### 성능 최적화
|
|
|
|
#### 동시 작업 수 조정
|
|
|
|
`.env` 파일에서 `MAX_WORKERS` 값 조정:
|
|
```env
|
|
MAX_WORKERS=60 # CPU 코어 수에 따라 조정
|
|
```
|
|
|
|
#### SocketIO 모드 변경
|
|
|
|
Windows:
|
|
```env
|
|
SOCKETIO_ASYNC_MODE=threading
|
|
```
|
|
|
|
Linux (eventlet 설치 필요):
|
|
```env
|
|
SOCKETIO_ASYNC_MODE=eventlet
|
|
```
|
|
|
|
```bash
|
|
pip install eventlet
|
|
```
|
|
|
|
### 운영 환경 배포
|
|
|
|
#### Gunicorn 사용 (Linux)
|
|
|
|
```bash
|
|
# Gunicorn 설치
|
|
pip install gunicorn eventlet
|
|
|
|
# 실행
|
|
gunicorn --worker-class eventlet -w 1 --bind 0.0.0.0:5000 app:app
|
|
```
|
|
|
|
#### Nginx 리버스 프록시 설정
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name your-domain.com;
|
|
|
|
location / {
|
|
proxy_pass http://127.0.0.1:5000;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "upgrade";
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
}
|
|
|
|
location /socket.io {
|
|
proxy_pass http://127.0.0.1:5000/socket.io;
|
|
proxy_http_version 1.1;
|
|
proxy_buffering off;
|
|
proxy_set_header Upgrade $http_upgrade;
|
|
proxy_set_header Connection "Upgrade";
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Systemd 서비스 등록 (Linux)
|
|
|
|
`/etc/systemd/system/idrac-info.service`:
|
|
```ini
|
|
[Unit]
|
|
Description=iDRAC Info Manager
|
|
After=network.target
|
|
|
|
[Service]
|
|
User=www-data
|
|
WorkingDirectory=/path/to/idrac_info
|
|
Environment="PATH=/path/to/idrac_info/venv/bin"
|
|
ExecStart=/path/to/idrac_info/venv/bin/gunicorn --worker-class eventlet -w 1 --bind 127.0.0.1:5000 app:app
|
|
Restart=always
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
서비스 시작:
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable idrac-info
|
|
sudo systemctl start idrac-info
|
|
sudo systemctl status idrac-info
|
|
```
|
|
|
|
## 📚 Git 사용법
|
|
|
|
### 변경사항 커밋 및 푸시
|
|
|
|
```bash
|
|
# 변경된 파일 확인
|
|
git status
|
|
|
|
# 모든 변경사항 스테이징
|
|
git add -A
|
|
|
|
# 또는 특정 파일만 스테이징
|
|
git add backend/routes/main.py
|
|
|
|
# 커밋 메시지와 함께 커밋
|
|
git commit -m "Add new feature: firmware auto-update"
|
|
|
|
# 원격 저장소에 푸시
|
|
git push origin main
|
|
```
|
|
|
|
### 원격 저장소에서 최신 버전 가져오기
|
|
|
|
```bash
|
|
# 최신 변경사항 가져오기
|
|
git pull origin main
|
|
|
|
# 또는 fetch 후 merge
|
|
git fetch origin
|
|
git merge origin/main
|
|
```
|
|
|
|
### 브랜치 관리
|
|
|
|
```bash
|
|
# 새 브랜치 생성
|
|
git checkout -b feature/new-feature
|
|
|
|
# 브랜치 전환
|
|
git checkout main
|
|
|
|
# 브랜치 목록 확인
|
|
git branch -a
|
|
|
|
# 브랜치 병합
|
|
git checkout main
|
|
git merge feature/new-feature
|
|
|
|
# 브랜치 삭제
|
|
git branch -d feature/new-feature
|
|
```
|
|
|
|
### 원격 저장소 확인
|
|
|
|
```bash
|
|
# 원격 저장소 목록
|
|
git remote -v
|
|
|
|
# 원격 저장소 추가
|
|
git remote add origin https://github.com/username/idrac_info.git
|
|
|
|
# 원격 저장소 URL 변경
|
|
git remote set-url origin https://github.com/username/new-repo.git
|
|
```
|
|
|
|
### 변경사항 되돌리기
|
|
|
|
```bash
|
|
# 작업 디렉토리 변경사항 취소
|
|
git checkout -- filename
|
|
|
|
# 스테이징 취소
|
|
git reset HEAD filename
|
|
|
|
# 마지막 커밋 취소 (변경사항 유지)
|
|
git reset --soft HEAD~1
|
|
|
|
# 마지막 커밋 취소 (변경사항 삭제)
|
|
git reset --hard HEAD~1
|
|
```
|
|
|
|
## 🐛 문제 해결
|
|
|
|
### Telegram 봇이 응답하지 않음
|
|
|
|
**증상**: Telegram 메시지가 전송되지 않음
|
|
|
|
**해결 방법**:
|
|
1. `.env` 파일에서 `TELEGRAM_BOT_TOKEN`과 `TELEGRAM_CHAT_ID` 확인
|
|
2. Telegram 설정 확인 스크립트 실행:
|
|
```bash
|
|
python check_telegram.py
|
|
```
|
|
3. 봇 폴링 서비스 로그 확인:
|
|
```bash
|
|
tail -f data/logs/app.log | grep "텔레그램"
|
|
```
|
|
4. 중복 봇 인스턴스 확인 및 종료:
|
|
```bash
|
|
# Windows
|
|
tasklist | findstr python
|
|
taskkill /F /PID <process_id>
|
|
|
|
# Linux
|
|
ps aux | grep python
|
|
kill -9 <process_id>
|
|
```
|
|
|
|
### SocketIO 연결 실패
|
|
|
|
**증상**: 실시간 업데이트가 작동하지 않음
|
|
|
|
**해결 방법**:
|
|
1. 브라우저 콘솔에서 에러 확인
|
|
2. SocketIO 모드 변경:
|
|
```env
|
|
# Windows
|
|
SOCKETIO_ASYNC_MODE=threading
|
|
|
|
# Linux
|
|
SOCKETIO_ASYNC_MODE=eventlet
|
|
```
|
|
3. 방화벽 설정 확인
|
|
4. CORS 설정 확인 (app.py):
|
|
```python
|
|
socketio = SocketIO(app, cors_allowed_origins="*")
|
|
```
|
|
|
|
### 데이터베이스 마이그레이션 오류
|
|
|
|
**증상**: `flask db upgrade` 실행 시 오류 발생
|
|
|
|
**해결 방법**:
|
|
1. 현재 마이그레이션 상태 확인:
|
|
```bash
|
|
flask db current
|
|
```
|
|
2. 마이그레이션 히스토리 확인:
|
|
```bash
|
|
flask db history
|
|
```
|
|
3. 데이터베이스 백업 후 재생성:
|
|
```bash
|
|
# 백업
|
|
cp backend/instance/site.db backend/instance/site.db.backup
|
|
|
|
# 재생성
|
|
rm backend/instance/site.db
|
|
flask db upgrade
|
|
```
|
|
|
|
### 파일 업로드 실패
|
|
|
|
**증상**: XML 파일 업로드 시 오류 발생
|
|
|
|
**해결 방법**:
|
|
1. 파일 크기 제한 확인 (`.env`):
|
|
```env
|
|
MAX_CONTENT_LENGTH=10485760 # 10MB
|
|
```
|
|
2. 디렉토리 권한 확인:
|
|
```bash
|
|
# Linux
|
|
chmod -R 755 data/
|
|
```
|
|
3. 디스크 공간 확인:
|
|
```bash
|
|
df -h
|
|
```
|
|
|
|
### Redfish API 연결 실패
|
|
|
|
**증상**: iDRAC 서버 연결 시 타임아웃 또는 인증 오류
|
|
|
|
**해결 방법**:
|
|
1. iDRAC IP 주소 및 네트워크 연결 확인
|
|
2. iDRAC 사용자명/비밀번호 확인
|
|
3. SSL 검증 비활성화 (`.env`):
|
|
```env
|
|
REDFISH_VERIFY_SSL=false
|
|
```
|
|
4. 타임아웃 시간 증가:
|
|
```env
|
|
REDFISH_TIMEOUT=30
|
|
```
|
|
5. iDRAC Redfish 서비스 활성화 확인
|
|
|
|
### 세션 타임아웃 문제
|
|
|
|
**증상**: 로그인 후 자주 로그아웃됨
|
|
|
|
**해결 방법**:
|
|
1. 세션 타임아웃 시간 증가 (`.env`):
|
|
```env
|
|
SESSION_MINUTES=60
|
|
```
|
|
2. 쿠키 설정 확인 (`config.py`):
|
|
```python
|
|
SESSION_COOKIE_SECURE = False # HTTP 환경
|
|
REMEMBER_COOKIE_SECURE = False
|
|
``` |