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. 해결 방안 (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;
|
||||||
|
}
|
||||||
```
|
```
|
||||||
Loading…
x
Reference in New Issue
Block a user