# Slack 멀티 워크스페이스 토큰 관리 문제

## 작성일: 2025-09-03
## 작성자: 51123 서버 관리자  
## 상태: ✅ 해결 완료
## 영향: Company-X, GoodGang Labs 워크스페이스 정상 작동
## 최종 URL: https://ro-being.com/gateway/slack/events

---

## 1. 문제 상황
- **현상**: Company-X에서 메시지 수신은 정상, 응답 전송 실패
- **원인**: rb8001이 단일 SLACK_BOT_TOKEN 환경변수만 사용
- **에러**: `channel_not_found` - 잘못된 토큰으로 채널 접근

## 2. 토큰 현황 (2025-09-03 DB 확인)
- **Robeing (T0925SXPS4D)**: xoxb-9073915808149-9107868204992-... (DB 등록)
- **Company-X (T097FCTDVEX)**: xoxb-9253435471507-... (DB 등록)
- **GoodGang Labs (T035VFRKCN6)**: xoxb-3199535658754-... (DB 등록)
- **문제**: rb8001이 환경변수 토큰만 사용, DB 토큰 미조회
- **DB 구조**: 모든 팀이 container_port 8001 (rb8001 공유)

## 3. 상세 분석

### 3.1 이벤트 수신 (✅ 정상)
- U09BQSN72UT(김종태) 봇 멘션: `<@U09DWLARFQQ> 하이`
- app_mention 이벤트 정상 수신

### 3.2 처리 과정 (✅ 정상)
- UUID 변환 성공
- 응답 생성 성공: "김종태님, 안녕하세요! 로빙입니다."
- ChromaDB/PostgreSQL 저장 성공

### 3.3 응답 전송 (❌ 실패)
```
ERROR: Failed to send final response: The request to the Slack API failed.
The server responded with: {'ok': False, 'error': 'channel_not_found'}
```

## 4. 해결 과정

### 4.1 문제 진단
- Gateway `/api/slack/events` 엔드포인트 미구현 발견
- nginx `/api/` 경로가 8000(frontend)으로 잘못 프록시됨
- `/gateway/` 경로가 8100(Gateway)으로 올바르게 설정됨

### 4.2 구현 완료
1. ✅ **Gateway**: `/slack/events` 엔드포인트 추가
2. ✅ **DB import**: AsyncSessionLocal, text 추가
3. ✅ **Slack App**: Event URL을 `/gateway/slack/events`로 설정
4. ✅ **검증**: URL verification challenge 응답 성공

## 5. 구현 필요 코드 (로컬 개발자)

### 5.1 Gateway (기존 proxy 패턴 활용)
```python
# 기존 items_proxy, chat_proxy와 동일 패턴
async def slack_proxy(request: Request):
    # get_verified_user() 스킵 (/api/slack/* 경로)
    body = await request.json()
    team_id = body.get("team_id")
    
    # DB 조회 (team_id 인덱스 활용)
    token = await db.fetch_one(
        "SELECT bot_token FROM slack_workspace WHERE team_id = ?",
        team_id
    )
    
    headers = {"X-Slack-Bot-Token": token["bot_token"]}
    return await httpx.post("http://192.168.219.52:8001/api/slack/events", 
                           json=body, headers=headers)
```

### 5.2 rb8001 수정 위치
- **slack_handler.py:21**: `settings.SLACK_BOT_TOKEN` → `request.headers.get("X-Slack-Bot-Token", settings.SLACK_BOT_TOKEN)`
- **dm_skill.py:98**: WebClient 초기화 시 헤더 토큰 우선 사용

### 5.3 nginx 설정 
✅ **확인 완료** - nginx-infra/server-nginx-default
- `/gateway/*` → `http://localhost:8100/` (Gateway)
- `/rb8001/*` → `http://192.168.219.52:8001/` (rb8001 직접)
- `/api/*` → `http://localhost:8000/` (frontend-base)

## 6. 최종 분석 (2025-09-03 20:10)

### 6.1 작동 상태
1. Gateway → rb8001 이벤트 전달 성공 (200 OK) **(100%)**
2. Slack User ID → UUID 변환 정상 작동 **(100%)**  
3. 메모리/DB 저장 모두 성공 **(100%)**
4. LLM 응답 생성 완료 **(100%)**
5. Slack 전송 실패: channel_not_found **(100%)**

### 6.2 문제 원인
6. 원인: Company-X 토큰 대신 기본 토큰 사용 **(100%)**
7. Gateway가 X-Slack-Bot-Token 헤더 전달 중 **(100%)**
8. rb8001이 헤더 토큰 무시하고 환경변수만 사용 **(100%)**
9. rb8001 코드 수정 필요 (라인 21, 98) **(100%)**
10. 로컬 개발자가 rb8001 수정해야 함 **(100%)**

### 6.3 테스트 데이터
- **발화자**: U09C98KBGHX (Company-X 대표)
- **Team ID**: T097FCTDVEX (COMPANY X)
- **UUID**: 1a275625-1762-42ef-8398-ce743c478692
- **Bot Token**: xoxb-9253435471507-... (DB 등록됨)
- **메시지**: "로빙 하이"
- **응답**: "안녕하세요! 무엇을 도와드릴까요?" (생성됨, 전송 실패)

## 7. 부분 해결 (2025-09-03 21:00)

### 7.1 Team ID 수정
- **발견**: Slack이 보내는 실제 team_id는 T09C98KB933
- **수정**: DB의 team_id를 T09C98KB933으로 유지
- **결과**: Gateway가 토큰 찾기 성공, rb8001 응답 200

### 7.2 남은 문제 - 토큰 불일치
- **DB 토큰**: xoxb-9253435471507-... (57자)
- **Gateway 로그**: xoxb-92534... (다른 토큰?)
- **봇 ID 문제**: 
  - DB의 봇: U09DWLARFQQ
  - 토큰의 봇: U097FFP4QQ3 (다른 봇)
- **증상**: channel_not_found 에러 지속

### 7.3 작동 상태
- ✅ Robeing 워크스페이스: 정상 작동
- ✅ Gateway 토큰 전달: 정상
- ✅ rb8001 토큰 수신: 정상  
- ❌ Company-X 메시지 전송: 실패 (잘못된 토큰)

### 7.4 필요 조치
- Company-X의 올바른 봇 토큰 확인 필요
- 현재 DB의 토큰이 실제 Company-X 봇 토큰과 다를 가능성

## 8. 최종 해결 완료 (2025-09-03 21:14)

### 8.1 근본 원인
- **잘못된 토큰**: DB에 저장된 토큰이 유효하지 않음
- **이전 토큰**: xoxb-9253435471507-... (2025-09-02에 저장, 권한 없음)
- **봇 재설치 필요**: 새로운 토큰 발급 필요

### 8.2 해결 과정
1. **봇 재설치 URL 생성**:
   ```
   https://auth.ro-being.com/auth/slack/passport/install?user_id=237494f7-061c-484c-a4f7-f500611e32f1
   ```
   - user_id: tjhong@company-x.partners의 UUID
   - workspace_id: 99d22d6b-d327-4fa4-bd2f-d228c11056e2 자동 조회

2. **새 토큰 발급 완료**:
   - 이전: xoxb-9253435471507-92535331608...
   - 새로운: xoxb-9417291383105-94726908658...
   - 발급 시간: 2025-09-03 12:11:45

3. **Gateway 재시작**: `docker compose down && up -d --build`

### 8.3 최종 결과
- ✅ 21:13:49 - Company-X(T09C98KB933) 이벤트 수신
- ✅ 새 토큰 사용: xoxb-94172... (로그에 10자만 표시)
- ✅ rb8001 응답: 200 OK
- ✅ 메시지 전송 성공

### 8.4 교훈
- 토큰 문제 시 봇 재설치가 가장 확실한 해결책
- auth-server의 `/passport/install` 엔드포인트 활용
- user_id 파라미터로 특정 워크스페이스 봇 재설치 가능