Add skill-email Actions configuration troubleshooting and update robing memory issue doc

- Add Gitea Actions configuration failure troubleshooting for skill-email
- Update nginx port configuration in existing troubleshooting doc

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
happybell80 2025-07-22 17:28:10 +09:00
parent 2d1352fe18
commit 31cd7d994c
2 changed files with 190 additions and 1 deletions

View File

@ -246,10 +246,57 @@ logger.debug(f"Bot filter check - user: {event_user}, bot_user_id: {slack_servic
--- ---
## 새벽 02시 10분
### nginx 499 상태 코드 발견 - Slack 3초 타임아웃 근본 원인
**🚨 중요한 발견**:
```
44.197.111.14 - - [22/Jul/2025:02:12:33 +0900] "POST /rb10508/api/slack/events HTTP/1.1" 499 0
```
- **499 = 클라이언트가 연결을 끊음**
**종합 분석**:
1. **일부 요청이 서버에 도달하지 않음**
- "로빙 뭐하니?" (Event ID: Ev096TRNGZ2Q) - 원본 없이 retry만 존재
- nginx까지는 도달했지만 FastAPI 로그에 없음
2. **nginx 499 오류 패턴**
- Slack이 응답을 기다리다 3초 후 포기하고 연결 끊음
- 우리 앱은 요청을 처리하지만 Slack은 이미 떠남
- 결과: Slack은 응답 못 받았다고 판단하여 retry
3. **타이밍 문제**
- FastAPI가 200 OK를 반환하는데 시간이 걸림
- 앱 초기화, 라우팅, 로깅 등으로 지연 발생
- Slack은 3초 내 응답을 못받으면 연결 끊고 retry
**해결책 (내일 진행)**:
1. **즉시 200 OK 반환하는 미들웨어 추가**
- 요청 받자마자 200 OK 먼저 반환
- 실제 처리는 그 다음
2. **더 간단한 엔드포인트 구조**
- 불필요한 로깅, 체크 최소화
- 가장 빠른 경로로 200 OK 반환
3. **비동기 처리 아키텍처 재검토**
- FastAPI BackgroundTasks 대신 Celery/RQ 검토
- 완전한 비동기 분리
**현재까지 적용된 해결책**:
- ✅ event_id 기반 중복 체크
- ✅ 3초 ACK 패턴 (코드상 구현됨)
- ❌ 하지만 실제로는 여전히 499 발생 (FastAPI 자체 지연)
---
**교훈**: **교훈**:
1. "큰 그림"보다 "작동하는 코드"가 우선 1. "큰 그림"보다 "작동하는 코드"가 우선
2. 복잡한 아키텍처보다 심플한 해결책이 때로는 최선 2. 복잡한 아키텍처보다 심플한 해결책이 때로는 최선
3. 프로토타입 단계에서는 과도한 설계 지양 3. 프로토타입 단계에서는 과도한 설계 지양
4. 아키텍처 원칙을 지키는 것이 결국 더 빠른 개발 4. 아키텍처 원칙을 지키는 것이 결국 더 빠른 개발
5. 이벤트 처리에서는 공식 event_id 사용이 텍스트 기반보다 정확 5. 이벤트 처리에서는 공식 event_id 사용이 텍스트 기반보다 정확
6. 디버깅 로그는 문제 발생 시점에 미리 추가해야 효과적 6. 디버깅 로그는 문제 발생 시점에 미리 추가해야 효과적
7. **nginx 로그 확인이 앱 로그만큼 중요 - 499는 클라이언트 포기 신호**

View File

@ -0,0 +1,142 @@
# skill-email Gitea Actions 설정 실패 및 해결
**날짜**: 2025-07-22
**작업자**: happybell80 & Claude
## 오후 4시 30분
### skill-email 자동 배포를 위한 Gitea Actions 설정
**요청**: skill-email 저장소에 자동 배포 설정 필요
**첫 시도 - 잘못된 접근**:
```yaml
# ❌ 잘못된 방법 - GitHub Actions 스타일
- name: Deploy to server
uses: appleboy/ssh-action@v0.1.5 # SSH 액션 사용
with:
host: ro-being.com
username: admin
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /home/admin/projects/ivada/skill_email # 잘못된 경로
git pull origin main
docker compose up -d --build
```
**문제점들**:
1. SSH action 사용 - Gitea self-hosted runner에서는 불필요
2. 경로 오류 - `/home/admin/projects/ivada/skill_email` 존재 안함
3. GitHub 문법 사용 - `github.event_name` (Gitea에서 작동 안함)
4. runner 설정 오류 - `runs-on: ubuntu-latest` (우리는 self-hosted 사용)
## 오후 4시 45분
### 실패 원인 분석
**오류 메시지**:
```
Error: can't connect without a private SSH key or password
```
**근본 원인**:
- Gitea Actions는 self-hosted runner로 서버에서 직접 실행됨
- SSH로 접속할 필요가 없음 (이미 서버에 있음)
- 다른 프로젝트(rb10508_test, frontend-base) 참고 필요
## 오후 5시 00분
### 올바른 해결책 - rb10508_test 패턴 적용
**수정된 workflow**:
```yaml
name: Deploy Skill-Email Service
on:
pull_request:
types: [closed]
branches:
- main
jobs:
deploy:
if: gitea.event.pull_request.merged == true
runs-on: self-hosted # ✅ self-hosted 필수!
steps:
- name: Checkout source code
uses: actions/checkout@v4
- name: Stop existing container
run: |
cd /home/admin/skill_email # ✅ 올바른 경로
docker compose down || true
- name: Update source code and deploy
run: |
mkdir -p /home/admin/skill_email
cd /home/admin/skill_email
# 기존 파일 삭제 (설정 파일 제외)
find . -mindepth 1 \
! -name '.env' \
! -name 'token.json' \
! -name 'credentials.json' \
-exec rm -rf {} + 2>/dev/null || true
# Actions가 체크아웃한 코드 복사
cp -r /home/admin/.cache/act/*/hostexecutor/* /home/admin/skill_email/
# 배포
docker compose up -d --build
```
**핵심 차이점**:
1. ✅ SSH action 제거 - 직접 명령 실행
2. ✅ self-hosted runner 사용
3. ✅ git pull 대신 파일 복사
4. ✅ 올바른 경로 사용
## 오후 5시 15분
### 추가 수정사항
**문법 오류 수정**:
- `github.event_name``gitea.event` (Gitea 전용 문법)
- 불필요한 조건문 제거 (단순화)
**최종 트리거 설정**:
- PR merge 시에만 실행 (push 제거)
- 중복 실행 방지
---
## 교훈
### 1. **Gitea Actions ≠ GitHub Actions**
- Gitea는 자체 문법 사용 (`gitea.event`)
- SSH action 불필요 (self-hosted runner가 서버에서 직접 실행)
### 2. **다른 프로젝트 참고 필수**
- rb10508_test, frontend-base의 workflow 먼저 확인
- 검증된 패턴 재사용
### 3. **self-hosted runner 이해**
- `runs-on: self-hosted` 필수
- runner가 이미 서버에 있으므로 SSH 불필요
- 직접 명령 실행 가능
### 4. **경로 확인**
- 로컬: `/home/happybell/projects/ivada/`
- 서버: `/home/admin/` (projects/ivada 없음)
### 5. **Actions 코드 위치**
- 체크아웃된 코드: `/home/admin/.cache/act/*/hostexecutor/`
- git pull 대신 이 경로에서 복사
---
## 결과
- ✅ 자동 배포 성공
- ✅ PR merge 시 자동 실행
- ✅ health check 포함