# 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_workspaces 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 파라미터로 특정 워크스페이스 봇 재설치 가능