레드마인 이슈 통계 자동화로 완벽한 관리자에 한걸음 더 가까워지기!

레드마인 이슈 관리 사이트를 완성해서 후속 사례를 씁니다. ^^
애래 내용은 /ai-case-writer 로 클로드가 정리해준 문서에 제가 간략히 설명을 달았어요.

주요 개선사항은 페이지를 열때마다 레드마인에서 모든 이슈를 가져와서 속도가 느려서, 로컬에 가져온 이슈들을 저장해고 새로 변경되거나 추가된 이슈만 다시 가져오도록 변경했고, 매주 자동으로 이슈를 갱신하도록 만들었다가 화면에 버튼을 두고 요청할때 최종싱크일자 이후의 이슈만 가져 오도록 개선 했어요.

그리고 담당자의 주별 이슈 수량의 y축을 통일시켜서 한눈에 비교가 쉽게 했습니다.
이제 모니터링 + 갈굼 시작 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

# Redmine 대시보드 완전 가이드

## 📊 대시보드 종류 및 파일 구조

이 프로젝트에는 두 가지 Redmine 대시보드가 있습니다:

### 1️⃣ 웹 대시보드 (Flask 앱)
**주요 특징**: 실시간 웹 인터페이스, 부서별 주간 트렌드, 최근 52주 분석

| 항목 | 내용 |
|------|------|
| **파일** | `web/app.py` |
| **실행 명령** | `python3 web/app.py` |
| **접속 주소** | `http://localhost:5000` |
| **제공 기능** | 부서별 주간 트렌드, 담당자별 이슈 수, 상태 분포, 52주 시리즈 |
| **라우트** | `/` (메인), `/projects`, `/issues`, `/export.csv` |
| **데이터 소스** | Redmine API (캐시 통계는 로컬) |

**메인 라우트 (`/`)에서 표시되는 차트:**
- **최근 1주: 사용자별 등록 vs 완료** (Bar 차트) - Line 397-410
- **상태 분포** (Pie 차트) - Line 413
- **부서별 이슈 수 (최근 1주)** (Bar 차트) - Line 424
- **부서별 주간 트렌드 (최근 52주)** - Line 432-477
  - 각 부서별로 개별 담당자의 52주 트렌드 표시
  - 담당자별로 등록 vs 완료 비율

---

### 2️⃣ 정적 HTML 대시보드
**주요 특징**: 스크립트 기반, 독립 실행, 자동 스케줄 가능

| 항목 | 내용 |
|------|------|
| **파일** | `scripts/redmine_dashboard.py` |
| **실행 명령** | `python3 scripts/redmine_dashboard.py --source cache --output out/dashboard.html` |
| **출력 파일** | `out/redmine_dashboard.html` |
| **제공 기능** | 담당자별 이슈 수, 상태 분포, 프로젝트 요약, 캐시 통계 |
| **데이터 소스** | API 또는 로컬 캐시 |
| **자동 실행** | 매주 목요일 12:00 (크론/작업 스케줄러) |

---

## 🔄 데이터 파이프라인

```
Redmine API
    ↓
redmine_collector.py (증분식 수집)
    ↓
.reference/redmine/ (로컬 캐시)
    ├── config.yaml
    ├── projects.yaml
    └── issues/
        └── [project_id]/
            └── *.yaml (이슈 개별 파일)
    ↓
web/app.py (웹 대시보드) 또는 redmine_dashboard.py (HTML)
```

---

## 📝 부서 정의

**파일**: `scripts/departments.yaml`
레드마인에는 부서별로 사용자가 등록되어 있지 않음.
통계를 부서별로 보고 싶어서 부서정보를 별도의 파일로 저장해서 관리해 달라고함.

## 🚀 빠른 시작

### 1단계: 환경 설정

```bash
cd /Users/okjin/claude/gpters-20th-duwls-templates-main

# 자격증명 설정
cp scripts/credentials.example.env scripts/credentials.env
# credentials.env 파일 편집:
# REDMINE_URL=https://redmine.example.local
# REDMINE_API_KEY=your_api_key_here
```

### 2단계: 웹 대시보드 실행 (추천)

```bash
# 필수 패키지 설치 (처음 한 번만)
pip install flask pandas plotly pyyaml requests

# 웹 앱 실행
python3 web/app.py

# 브라우저에서 접속
# http://localhost:5000
```

### 3단계: 데이터 수집 (선택사항)

```bash
# 전체 프로젝트에서 이슈 수집
python3 scripts/redmine_collector.py --all

# 또는 특정 프로젝트만
python3 scripts/redmine_collector.py --project myproject
```

---

## 🔧 상세 사용법

### 웹 대시보드 페이지

#### 메인 페이지 (`/`)
- **부서별 주간 트렌드**: 최근 52주의 담당자별 이슈 생성/완료 현황
- **담당자별 통계**: 최근 1주 창출/완료 이슈 수
- **로컬 캐시 통계**: 총 캐시 이슈 수, 프로젝트 수, 마지막 동기화 시간

#### 프로젝트 목록 (`/projects`)
- Redmine 내 모든 프로젝트 조회
- 프로젝트별 세부 정보 확인

#### 이슈 목록 (`/issues`)
- 프로젝트별 이슈 필터링
- 상태, 담당자, 날짜 범위로 검색
- CSV 내보내기

---

### HTML 대시보드

#### 캐시 데이터로 생성 (빠름)
```bash
python3 scripts/redmine_dashboard.py --source cache --output out/dashboard.html
```

#### API로 생성 (최신 데이터)
```bash
python3 scripts/redmine_dashboard.py --project myproject --output out/dashboard.html
```

#### 여러 프로젝트
```bash
python3 scripts/redmine_dashboard.py --project proj1,proj2,proj3 --output out/dashboard.html
```

---

## ⚙️ 자동 실행 설정

### macOS / Linux (크론)

1. 크론 설정 열기:
   ```bash
   crontab -e
   ```

2. 다음 라인 추가 (매주 목요일 12:00):
   ```bash
   0 12 * * 4 /path/to/repo/scripts/run_weekly_dashboard.sh
   ```

3. 스크립트 권한 설정:
   ```bash
   chmod +x scripts/run_weekly_dashboard.sh
   ```

### Windows (작업 스케줄러)

1. PowerShell 관리자 모드 열기

2. 다음 명령 실행:
   ```powershell
   schtasks /Create /SC WEEKLY /D THU /TN "RedmineDashboardWeekly" /TR "C:\path\to\repo\scripts\run_weekly_dashboard.bat" /ST 12:00 /F
   ```

3. 확인:
   ```powershell
   schtasks /Query /TN "RedmineDashboardWeekly"
   ```

---

## 🐛 문제 해결

### 문제: "부서별 주간 트렌드"에 2026년 데이터만 표시

**원인**: API에서 가져오는 이슈 개수가 너무 적음 (제한된 이슈만 로드)

**해결책**:
- `web/app.py` 라인 341에서 `limit=2000`으로 설정됨 (수정완료)
- `fetch_issues` 함수에 pagination 추가됨 (수정완료)

확인:
```bash
# 캐시 이슈 개수 확인
find .reference/redmine/issues -name "*.yaml" | wc -l
```

### 문제: 로컬 캐시 통계가 실제 데이터와 맞지 않음

**원인**: YAML 파일 개수를 센 것 vs 실제 로드된 이슈 개수

**해결책**:
- `get_cache_statistics()` 함수에서 `projects.yaml`의 메타데이터 사용으로 변경됨 (수정완료)

### 문제: Redmine API 인증 실패

**확인**:
```bash
python3 scripts/redmine_workload.py --test-auth
```

**해결**:
1. `scripts/credentials.env` 파일 확인
2. API 키 또는 사용자명/비밀번호 확인
3. REDMINE_URL 올바른지 확인

---
막대그래프가 표시된 한국 웹사이트 스크린샷
한국어와 영어 텍스트가 포함된 그래프 스크린샷
다양한 데이터를 보여주는 대시보드의 스크린샷


## 📊 주요 수정 사항

### 2026-01-29 수정

#### 1. 웹 대시보드 이슈 데이터 부족 해결
- **파일**: `web/app.py`
- **라인 287-294**: `fetch_issues` 함수에 pagination 추가
- **효과**: 52주 트렌드에서 최근 1-2년 데이터 모두 표시 가능

#### 2. 캐시 통계 정확도 개선
- **파일**: `web/app.py`
- **Line 147-182**: `get_cache_statistics()` 함수 수정
  - YAML 파일 개수 대신 `projects.yaml`의 `total_issues` 메타데이터 사용
  - 효과: 로컬 캐시 통계 정확성 향상

#### 3. 정적 HTML 대시보드 통계 수정
- **파일**: `scripts/redmine_dashboard.py`
- **Line 199**: 로드된 실제 이슈 개수 사용
- **효과**: 캐시 통계 박스에 표시되는 이슈 개수 정확성 향상

---

## 📋 파일 위치 정리

| 용도 | 파일 | 위치 |
|------|------|------|
| 웹 대시보드 | Flask 앱 | `web/app.py` |
| 웹 대시보드 | HTML 템플릿 | `web/templates/index.html` |
| HTML 대시보드 | 스크립트 | `scripts/redmine_dashboard.py` |
| 이슈 수집 | 수집 스크립트 | `scripts/redmine_collector.py` |
| 워크로드 분석 | 분석 스크립트 | `scripts/redmine_workload.py` |
| 부서 정의 | YAML 설정 | `scripts/departments.yaml` |
| 캐시 저장소 | 로컬 데이터 | `.reference/redmine/` |
| 자동 실행 | Unix 스크립트 | `scripts/run_weekly_dashboard.sh` |
| 자동 실행 | Windows 배치 | `scripts/run_weekly_dashboard.bat` |
| 자격증명 | 환경 설정 | `scripts/credentials.env` |

---

## 🎯 트러블슈팅 가이드

### 대시보드가 느림
→ 데이터 수집 후 캐시 사용하기
```bash
python3 scripts/redmine_collector.py --all
python3 scripts/redmine_dashboard.py --source cache --output out/dashboard.html
```

### 담당자 이름이 "기타"로 표시됨
→ `scripts/departments.yaml`에 담당자 이름 추가

### 부서 데이터가 안 보임
→ 부서 정의 파일 확인:
```bash
cat scripts/departments.yaml
```

### 52주 트렌드에 데이터가 너무 적음
→ 이슈 수집 범위 확인:
```bash
# 캐시 이슈 개수
find .reference/redmine/issues -name "*.yaml" | wc -l

# 수집되지 않은 프로젝트가 있는지 확인
python3 scripts/redmine_collector.py --all
```

---

## 📞 추가 정보

- **Redmine API 문서**: https://www.redmine.org/projects/redmine/wiki/Rest_Issues
- **Flask 문서**: https://flask.palletsprojects.com/
- **Plotly 문서**: https://plotly.com/python/

윈도우 환경의 개발 서버로 옮겨서 서비스를 올려 보려고,
윈도우에 서비스 올릴 수 있게 꼭 필요한 파일들 따로 모아주고, 올리는 방법 가이드 해달라고 했어요.
이제 윈도서버에 올려보면 제대로 만들어 줬는지 알 수 있겠죠? ^^
2
3개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요