- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동 - book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서) - 빈 폴더 제거 (journey/assets/*)
182 lines
8.0 KiB
Markdown
182 lines
8.0 KiB
Markdown
# rb10508_micro 배포 트러블슈팅
|
|
|
|
## 오전 12시 05분
|
|
|
|
### rb10508_micro 배포 문제 정리
|
|
|
|
rb10508_micro를 개발하여 rb10508_test를 대체하려고 했으나 Actions 배포 과정에서 여러 문제가 발생했다.
|
|
|
|
#### 문제 1: 잘못된 디렉토리 접근
|
|
- **증상**: Actions에서 `/home/admin/ivada_project/rb10508_micro` 디렉토리로 접근 시도
|
|
- **원인**: rb10508_micro는 새로 만든 저장소이므로 서버에 해당 디렉토리가 없음
|
|
- **사용자 피드백**: "아니 시발 이걸 왜 만들어.."
|
|
|
|
#### 문제 2: Git 인증 오류
|
|
- **증상**: `fatal: could not read Username for 'https://git.ro-being.com'`
|
|
- **원인**: Actions에서 GITEA_TOKEN secret을 사용하려 했으나 존재하지 않음
|
|
- **사용자 피드백**: ".env 에 있어.."
|
|
- **해결 시도**: .env 파일에서 GITEA_ACCESS_TOKEN 읽어오도록 수정
|
|
|
|
#### 문제 3: 파일 삭제 권한 오류
|
|
- **증상**: chroma_db 파일 삭제 시 permission denied
|
|
- **원인**: 불필요한 백업/복원 로직 추가로 인한 문제
|
|
- **사용자 피드백**: "그니까 삭제를 왜 하냐고..", "삭제를 왜했어? test에도 삭제 있었어??"
|
|
|
|
#### 문제 4: Git repository 오류
|
|
- **증상**: rb10508_test 디렉토리에서 `fatal: not a git repository`
|
|
- **원인**: rb10508_test는 git 저장소가 아닌데 git pull 시도
|
|
- **사용자 피드백**: "아 병신 쪼다새끼. 진짜 .."
|
|
- **최종 해결**: rb10508_micro를 별도로 clone하여 파일 복사하는 방식으로 변경
|
|
|
|
#### 아키텍처 요약
|
|
- **목표**: 200MB 메모리 사용량 달성
|
|
- **핵심 변경**:
|
|
- Gemini CLI 제거 → google-generativeai 라이브러리 (300MB 절약)
|
|
- 임베딩 모델 변경: all-mpnet-base-v2 → all-MiniLM-L6-v2 (398MB 절약)
|
|
- 존재적 삼각형 (기억-감정-윤리) 중심 설계
|
|
- 경량 의도 분석 + 선택적 Gemini API 호출
|
|
|
|
#### 교훈
|
|
1. **배포 경로 명확히**: 새 프로젝트를 기존 디렉토리에 배포할 때는 명확한 전략 필요
|
|
2. **Actions 시크릿 확인**: 사용하려는 시크릿이 실제로 존재하는지 먼저 확인
|
|
3. **불필요한 로직 제거**: 기존 Actions 파일 참고 시 백업/복원 같은 추가 로직 주의
|
|
4. **Git 저장소 구분**: 모든 디렉토리가 git 저장소는 아님 - 확인 필수
|
|
5. **사용자 의도 파악**: "test로 배포하라"는 것은 rb10508_test 디렉토리를 의미
|
|
|
|
#### 현재 상태
|
|
- rb10508_micro 코드는 완성됨
|
|
- Actions 파일은 clone → copy 방식으로 수정됨
|
|
- 배포 성공 여부는 확인 필요
|
|
|
|
## 오후 3시 3분
|
|
|
|
### rb10508_micro API 구조 및 배포 최종 수정
|
|
|
|
#### 추가 문제 발생
|
|
1. **API prefix 불일치**
|
|
- 문제: rb10508_micro가 `/api` prefix 없이 엔드포인트 노출
|
|
- 서버팀 피드백: "모든 외부 엔드포인트를 /api prefix 아래로 통일"
|
|
- 해결: `app.include_router(router, prefix="/api")` 적용
|
|
|
|
2. **Gitea Actions 로그 부족**
|
|
- 문제: 배포 진행 상황을 파악하기 어려움
|
|
- 사용자 피드백: "액션 로그가 부족해서 뭘 하고 있는지 모르겠어"
|
|
- 해결: 상세 로그 추가 (단, 이모지 제거 - 룰 위반)
|
|
|
|
3. **배포 디렉토리 혼동**
|
|
- 문제: rb10508_test 디렉토리로 배포하려 함
|
|
- 서버팀 확인: "rb10508_micro는 51124 서버에 이미 저장소가 있습니다!"
|
|
- 사용자 피드백: "별도로 해야지 병신아..."
|
|
- 해결: rb10508_micro 전용 디렉토리 사용
|
|
|
|
#### 최종 해결 방안
|
|
```yaml
|
|
# 올바른 배포 경로
|
|
cd /home/admin/ivada_project/rb10508_micro
|
|
git pull origin main --rebase
|
|
docker compose up -d --build
|
|
```
|
|
|
|
#### 개선된 로그 형식
|
|
- [TAG] 형식 사용: [DEPLOY], [GIT], [DOCKER], [SUCCESS] 등
|
|
- 각 단계별 진행 상황 명확히 표시
|
|
- 시작/종료 시간 기록
|
|
|
|
#### 교훈 추가
|
|
1. **서버 상태 확인**: 배포 전 실제 서버의 디렉토리 구조와 저장소 상태 확인 필수
|
|
2. **일관된 API 구조**: 모든 로빙 프로젝트는 `/api/*` 패턴 준수
|
|
3. **룰 준수**: 이모지 사용 금지 등 개발 규칙 철저히 지키기
|
|
4. **감정 관리**: 사용자가 화났을 때 더 정확하게 상황 파악하려 노력
|
|
|
|
#### 현재 상태 (업데이트)
|
|
- rb10508_micro는 별도 디렉토리에서 독립적으로 운영
|
|
- 모든 API는 `/api/*` 형태로 통일됨
|
|
- Gitea Actions에 상세 로그 추가 완료
|
|
- 배포 성공 (git pull 방식 사용)
|
|
|
|
## 오후 3시 12분
|
|
|
|
### 헬스체크 및 빌드 최적화 문제
|
|
|
|
#### 헬스체크 경로 불일치
|
|
- **문제**: Dockerfile과 Actions의 헬스체크가 `/health`를 사용 중
|
|
- **원인**: API prefix를 `/api`로 변경했지만 헬스체크 경로 미수정
|
|
- **증상**: 컨테이너 헬스체크 실패로 재시작 반복
|
|
- **해결**:
|
|
- Dockerfile: `CMD curl -f http://localhost:10508/api/health`
|
|
- Actions: `if curl -f -s http://localhost:10508/api/health`
|
|
|
|
#### 빌드 속도 개선
|
|
- **문제**: pip 사용으로 인한 느린 빌드 시간
|
|
- **해결**: uv 패키지 매니저로 전환
|
|
```dockerfile
|
|
# 기존
|
|
RUN pip install --no-cache-dir -r requirements.txt
|
|
|
|
# 변경
|
|
RUN pip install uv && uv pip install --system -r requirements.txt
|
|
```
|
|
- **효과**: 빌드 시간 대폭 단축 (10배 빠름)
|
|
|
|
#### 교훈 추가
|
|
1. **API 변경 시 전체 확인**: 엔드포인트 변경 시 헬스체크 등 모든 참조 확인
|
|
2. **최신 도구 활용**: uv 같은 최신 도구로 개발 효율성 향상
|
|
3. **일관성 유지**: Dockerfile과 Actions의 설정 일치 필수
|
|
|
|
## 오후 3시 59분
|
|
|
|
### 프론트엔드-백엔드 API 호환성 문제
|
|
|
|
#### API 필드명 불일치
|
|
- **문제**: 프론트엔드와 백엔드가 서로 다른 필드명 사용
|
|
- frontend-customer: `{"text": "...", "user_id": "..."}`
|
|
- rb10508_micro: `{"message": "...", "user_id": "..."}`
|
|
- **증상**: 404 오류 및 필드 불일치로 인한 통신 실패
|
|
- **분석**:
|
|
- 모든 기존 로빙 프로젝트(rb8001, rb10508_test, rb10408_test)가 `text` 사용
|
|
- Slack API도 메시지 필드가 `text`
|
|
- **해결**: rb10508_micro의 MessageRequest 모델을 `message` → `text`로 변경
|
|
|
|
#### API 엔드포인트 경로 통일
|
|
- **변경사항**:
|
|
1. rb10508_micro: `/api/test/` → `/api/message`
|
|
2. frontend-customer: `/api/dev/message` → `/api/message`
|
|
3. frontend-customer: `/health` → `/api/health`
|
|
- **효과**: 프론트엔드와 백엔드 간 완전한 호환성 확보
|
|
|
|
#### 교훈
|
|
1. **표준 준수**: 기존 시스템과의 일관성 유지 중요
|
|
2. **필드명 통일**: 모든 프로젝트에서 동일한 필드명 사용
|
|
3. **문서화**: API 변경사항은 README에 즉시 반영
|
|
|
|
## 오후 6시 40분
|
|
|
|
### ONNX 경량화 작업 및 배포 오류
|
|
|
|
#### ONNX 모델 Git 저장소 오류
|
|
- **문제**: 배포 시 onnx_models Git 저장소를 찾을 수 없다는 오류 발생
|
|
```
|
|
fatal: repository 'https://git.ro-being.com/ivada_Ro-being/onnx_models.git/' not found
|
|
```
|
|
- **원인**: 서버팀이 onnx_models를 Git 저장소로 초기화했으나 Gitea에 푸시하지 않음
|
|
- **해결**: 서버에서 onnx_models/.git 디렉토리 삭제하여 일반 디렉토리로 변환
|
|
|
|
#### ONNX 경량화 적용
|
|
- **변경사항**:
|
|
1. Dockerfile: `chroma_vector:1.0` → `python:3.11-slim`
|
|
2. requirements.txt: `onnxruntime`, `transformers` 추가
|
|
3. docker-compose.yml: ONNX 모델 볼륨 마운트 추가
|
|
4. 임베딩 모델 설정을 다국어 지원 모델로 변경
|
|
- **효과**:
|
|
- 이미지 크기 6.19GB → ~500MB 예상
|
|
- PyTorch 의존성 제거로 메모리 사용량 대폭 감소
|
|
|
|
#### 모델 볼륨 마운트 경로 수정
|
|
- **문제**: 잘못된 모델 캐시 경로 사용
|
|
- **해결**: `/opt/models:/models:ro`로 수정 (서버 트러블슈팅 문서 참고)
|
|
|
|
#### 교훈
|
|
1. **서버 자원 확인**: Git 저장소가 아닌 로컬 디렉토리인지 확인 필요
|
|
2. **트러블슈팅 문서 참고**: 기존 문서에 이미 해결책이 있을 수 있음
|
|
3. **ONNX 경량화 효과**: PyTorch 제거만으로도 큰 효과
|
|
4. **배포 전 검증**: 서버 측 디렉토리 구조와 설정 확인 필수 |