DOCS/troubleshooting/250903_slack_multi_workspace_token_issue.md
happybell80 97e0888ce0 Fix more incorrect table names in documentation
- users → user in SQL contexts (94 occurrences)
- robeings → robeing in SQL contexts
- user_preferences → user_preference (14 files)
- slack_workspaces → slack_workspace in SQL contexts (17 files)

All table names now correctly match PostgreSQL schema
2025-09-26 00:52:15 +09:00

6.1 KiB

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 패턴 활용)

# 기존 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_TOKENrequest.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 문제 원인

  1. 원인: Company-X 토큰 대신 기본 토큰 사용 (100%)
  2. Gateway가 X-Slack-Bot-Token 헤더 전달 중 (100%)
  3. rb8001이 헤더 토큰 무시하고 환경변수만 사용 (100%)
  4. rb8001 코드 수정 필요 (라인 21, 98) (100%)
  5. 로컬 개발자가 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 파라미터로 특정 워크스페이스 봇 재설치 가능