# Gemini CLI, Slack 연결, 네트워크 통합 문제 해결

**날짜**: 2025-07-16  
**작업자**: Claude & happybell

## 개요

rb8001과 rb10508_test 컨테이너에서 발생한 여러 문제들을 해결하는 과정

---

## 업데이트 (2025-09-19): Gemini CLI 타임아웃 관련 최종 정리 — 해결

- 기본 동작을 CLI→API 폴백이 아닌 API 우선으로 전환
  - 설정: `rb8001/app/core/config.py` 에서 `GEMINI_USE_CLI = False` 기본값 유지
  - 핸들러: `rb8001/app/llm/gemini_handler.py`
    - CLI 경로 점검 후 미존재 시 자동으로 API 모드로 전환
    - CLI 사용 시 15초 타임아웃 발생하면 프로세스 종료 후 API로 폴백
- 결과: CLI 타임아웃으로 인한 응답 지연이 제거되어 안정적인 응답 시간 확보

참고: 필요 시 서버에 설치된 CLI (`/usr/local/node/bin/gemini`)를 지정해 테스트할 수 있으나, 운영에서는 API 우선 권장.

## 1. Gemini CLI 실행 문제

### 증상
- rb8001: "Gemini CLI가 설치되지 않았습니다" 에러
- rb10508_test (test-api-container): 정상 작동
- 에러: `exec: "gemini": executable file not found in $PATH`

### 원인 분석
- Docker 컨테이너는 Python 기반으로 Node.js가 포함되지 않음
- 서버에는 이미 설치되어 있지만 컨테이너 내부에서 접근 불가
- test-api-container는 Node.js를 마운트하여 사용 중

### 해결 방법

#### 1. docker-compose.yml에 Node.js 마운트 추가
```yaml
volumes:
  # 기존 볼륨들...
  # Node.js 및 Gemini CLI 마운트
  - /home/admin/.nvm/versions/node/v24.4.0:/usr/local/node:ro

environment:
  # 기존 환경변수들...
  # Node.js PATH 추가
  - PATH=/usr/local/node/bin:$PATH
```

#### 2. gemini_service.py에서 절대 경로 사용
```python
# 기존
cmd = ["gemini", "-m", "gemini-2.5-flash", "-p", full_prompt]

# 수정
cmd = ["/usr/local/node/bin/gemini", "-m", "gemini-2.5-flash", "-p", full_prompt]
```

## 2. Slack 연결 문제

### 증상
- rb10508_test 컨테이너 시작은 성공하지만 Slack 대화 불가
- 에러: `AttributeError: 'Settings' object has no attribute 'USE_ASYNC_RESPONSE'`

### 원인
- app/api/slack.py에서 settings.USE_ASYNC_RESPONSE 참조
- app/core/config.py의 Settings 클래스에 해당 속성 미정의

### 해결 방법

config.py의 Settings 클래스에 추가:
```python
# Application Configuration
DEBUG: bool = True
LOG_LEVEL: str = "INFO"
MAX_MEMORY_SIZE: int = 1000
USE_ASYNC_RESPONSE: bool = True  # 추가
```

## 3. 네트워크 통합 문제

### 배경
- 로빙들이 frontend-backend와 상태를 주고받아야 함
- Docker 네트워크 격리로 인해 통신 불가

### 현황
- frontend-backend-1: appnet 네트워크
- rb8001: host 네트워크 (보안 취약)
- rb10508_test: 자체 bridge 네트워크 (격리됨)

### 해결 방법

#### rb10508_test/docker-compose.yml
```yaml
services:
  test-api:
    # ...
    networks:
      - default
      - appnet

networks:
  appnet:
    external: true
```

#### rb8001/docker-compose.yml
```yaml
services:
  rb8001:
    # network_mode: host 제거
    networks:
      - appnet
    ports:
      - "8001:8001"

networks:
  appnet:
    external: true
```

### 장점
- 보안 향상 (host 네트워크 제거)
- 선택적 컨테이너 간 통신
- backend와 안전한 상태 공유 가능

## 4. CI/CD 경로 문제

### 증상
- GitHub Actions 실패: `/home/admin/test_api: 그런 파일이나 디렉터리가 없습니다`

### 원인
- 디렉토리 구조 변경: test_api → rb10508_test
- CI/CD 워크플로우가 구 경로 참조

### 해결 방법

.gitea/workflows/cicd.yml 수정:
- `/home/admin/test_api` → `/home/admin/rb10508_test`
- 코드 복사 경로를 rb8001과 동일하게 변경:
  ```bash
  cp -r /home/admin/.cache/act/*/hostexecutor/* /home/admin/rb10508_test/
  ```

## 적용 순서

1. 로컬에서 코드 수정 및 푸시
2. 서버에서 .env 파일 확인/생성
3. 기존 컨테이너 정리:
   ```bash
   docker stop test-api-container
   docker rm test-api-container
   ```
4. 새 컨테이너 시작:
   ```bash
   cd /home/admin/rb8001
   docker-compose down && docker-compose up -d
   
   cd /home/admin/rb10508_test
   docker-compose up -d
   ```

## 검증

```bash
# Gemini CLI 확인
docker exec rb8001 /usr/local/node/bin/gemini --version
docker exec rb10508_test /usr/local/node/bin/gemini --version

# 네트워크 확인
docker network inspect appnet

# Slack 대화 테스트
# Slack에서 @Ro-being, @Ro-being_test로 대화
```

## 교훈

1. **컨테이너 환경 고려**: 서버에 설치된 도구가 컨테이너에서는 없을 수 있음
2. **설정 동기화**: 새 기능 추가 시 모든 관련 파일 업데이트 필요
3. **네트워크 설계**: 초기부터 컨테이너 간 통신 고려
4. **경로 일관성**: CI/CD 설정 시 디렉토리 구조 변경 반영
