docs: Slack 멀티워크스페이스 해결책 - 실제 코드 위치 반영

This commit is contained in:
happybell80 2025-09-03 18:56:50 +09:00
parent 3e28ef2cab
commit 85434e54c6

View File

@ -38,50 +38,46 @@ The server responded with: {'ok': False, 'error': 'channel_not_found'}
## 4. 해결 방안 (2025-09-03 확정) ## 4. 해결 방안 (2025-09-03 확정)
### 4.1 Gateway 경유 방식 채택 ### 4.1 기존 코드 활용
- Slack Event URL을 Gateway(8100)로 변경 - **Gateway**: items_proxy, chat_proxy 패턴 재사용
- Gateway에서 team_id별 토큰 조회 및 주입 - **rb8001**: 최소 수정 (라인 21, 98만)
- rb8001은 헤더에서 토큰 읽어 사용 - **skill-slack**: 제거 (8/12 이후 미사용)
### 4.2 구현 상세 ### 4.2 구현 단계
1. **nginx 설정**: `/api/*` → Gateway(8100) 프록시 1. **nginx**: `/api/` location 추가
2. **Slack App**: Event URL을 `https://ro-being.com/api/slack/events`로 변경 2. **Gateway**: slack_proxy 함수 (get_verified_user 스킵)
3. **Gateway**: team_id로 DB 조회, 헤더에 토큰 추가 3. **rb8001**: 헤더 토큰 읽기 추가
4. **rb8001**: 헤더 우선, 환경변수 폴백 4. **Slack App**: Event URL 변경
## 5. 구현 필요 코드 (로컬 개발자) ## 5. 구현 필요 코드 (로컬 개발자)
### 5.1 Gateway 추가 (robeing-gateway) ### 5.1 Gateway (기존 proxy 패턴 활용)
```python ```python
@app.post("/api/slack/events") # 기존 items_proxy, chat_proxy와 동일 패턴
async def handle_slack_event(request: Request): async def slack_proxy(request: Request):
# Slack 서명 검증 # get_verified_user() 스킵 (/api/slack/* 경로)
verify_slack_signature(request)
# team_id별 토큰 조회
body = await request.json() body = await request.json()
team_id = body.get("team_id") team_id = body.get("team_id")
result = await db.fetch_one( # DB 조회 (team_id 인덱스 활용)
"SELECT bot_token FROM slack_workspaces WHERE team_id = :team_id", token = await db.fetch_one(
{"team_id": team_id} "SELECT bot_token FROM slack_workspaces WHERE team_id = ?",
team_id
) )
# rb8001로 전달 headers = {"X-Slack-Bot-Token": token["bot_token"]}
headers = { return await httpx.post("http://192.168.219.52:8001/api/slack/events",
"X-Slack-Bot-Token": result["bot_token"] if result else None, json=body, headers=headers)
"Content-Type": "application/json"
}
return await forward_to_rb8001("/api/slack/events", body, headers)
``` ```
### 5.2 rb8001 수정 (slack_handler.py) ### 5.2 rb8001 수정 위치
```python - **slack_handler.py:21**: `settings.SLACK_BOT_TOKEN``request.headers.get("X-Slack-Bot-Token", settings.SLACK_BOT_TOKEN)`
# 기존: 환경변수만 사용 - **dm_skill.py:98**: WebClient 초기화 시 헤더 토큰 우선 사용
slack_token = os.environ.get("SLACK_BOT_TOKEN")
# 수정: 헤더 우선, 환경변수 폴백 ### 5.3 nginx 설정 추가
slack_token = request.headers.get("X-Slack-Bot-Token") \ ```nginx
or os.environ.get("SLACK_BOT_TOKEN") location /api/ {
proxy_pass http://localhost:8100;
proxy_set_header X-Real-IP $remote_addr;
}
``` ```