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