docs: skill-news 좀비 프로세스 및 Gitea Actions 배포 문제 해결
- Chrome headless 좀비 67개 → 1개 (init: true) - YAML heredoc 파싱 오류 해결 - SSH 배포 방식 구현 - Health check exit code 문제 해결
This commit is contained in:
parent
ad52d3df36
commit
56e8543199
@ -0,0 +1,142 @@
|
||||
# skill-news 좀비 프로세스 및 Gitea Actions 배포 문제 해결
|
||||
|
||||
**날짜**: 2025-09-04
|
||||
**작업자**: admin
|
||||
**관련 서비스**: skill-news, Gitea Actions
|
||||
**서버**: 51124 (192.168.219.52)
|
||||
|
||||
## 문제 1: Chrome headless 좀비 프로세스 67개 발생
|
||||
|
||||
### 증상
|
||||
```bash
|
||||
ps aux | grep defunct | wc -l
|
||||
# 67
|
||||
```
|
||||
- headless_shell 프로세스가 좀비로 남음
|
||||
- 부모 프로세스: skill-news 컨테이너 (PID 3024266)
|
||||
|
||||
### 원인
|
||||
- Docker 컨테이너에서 PID 1 프로세스(Python)가 자식 프로세스 정리 못함
|
||||
|
||||
### 해결
|
||||
```yaml
|
||||
# skill_news/docker-compose.yml
|
||||
services:
|
||||
skill-news:
|
||||
init: true # 좀비 프로세스 정리용
|
||||
build: .
|
||||
container_name: robeing-skill-news
|
||||
```
|
||||
|
||||
### 결과
|
||||
- 컨테이너 재시작 후 좀비 프로세스 67개 → 1개로 감소
|
||||
- 1개는 claude 관련 git 프로세스(무관)
|
||||
|
||||
## 문제 2: Gitea Actions YAML 문법 오류
|
||||
|
||||
### 증상
|
||||
```
|
||||
Workflow config file is invalid. Please check your config file:
|
||||
yaml: line 76: could not find expected ':'
|
||||
```
|
||||
|
||||
### 원인
|
||||
- heredoc 사용시 YAML 파서가 내용을 YAML로 해석
|
||||
|
||||
### 첫 번째 시도 (실패)
|
||||
```yaml
|
||||
# .gitea/workflows/cicd.yml
|
||||
sudo tee .env > /dev/null << 'ENVFILE'
|
||||
NEWS_SERVICE_PORT=8505
|
||||
ENVFILE
|
||||
```
|
||||
- `sudo tee` → `cat`으로 변경했으나 여전히 오류
|
||||
|
||||
### 최종 해결
|
||||
```yaml
|
||||
# heredoc 대신 echo 명령어 사용
|
||||
echo "NEWS_SERVICE_PORT=8505" > .env
|
||||
echo "NEWS_SERVICE_HOST=0.0.0.0" >> .env
|
||||
# ... 나머지 환경변수들
|
||||
```
|
||||
|
||||
## 문제 3: 51124 서버 SSH 배포 실패
|
||||
|
||||
### 증상
|
||||
- Actions runner(51123)가 로컬 경로 `/home/admin/ivada_project/skill-email` 접근 시도
|
||||
- "그런 파일이나 디렉터리가 없습니다" 오류
|
||||
|
||||
### 해결
|
||||
```yaml
|
||||
# .gitea/workflows/cicd.yml 전면 재작성
|
||||
- name: Setup SSH
|
||||
run: |
|
||||
mkdir -p ~/.ssh
|
||||
echo "${{ secrets.SSH_PRIVATE_KEY_51124 }}" > ~/.ssh/deploy_key
|
||||
chmod 600 ~/.ssh/deploy_key
|
||||
ssh-keyscan -p 51124 -H ${{ secrets.SSH_HOST_51124 }} >> ~/.ssh/known_hosts
|
||||
|
||||
- name: Deploy to 51124 Server
|
||||
run: |
|
||||
ssh -p 51124 -i ~/.ssh/deploy_key admin@${{ secrets.SSH_HOST_51124 }} << 'DEPLOY_SCRIPT'
|
||||
cd /home/admin/ivada_project/skill_news
|
||||
git pull origin main --rebase
|
||||
docker compose down
|
||||
docker compose up -d --build
|
||||
DEPLOY_SCRIPT
|
||||
```
|
||||
|
||||
### 필요한 시크릿
|
||||
- `SSH_PRIVATE_KEY_51124`: SSH 개인키
|
||||
- `SSH_HOST_51124`: 192.168.219.52
|
||||
|
||||
## 문제 4: Health check 성공해도 Actions 실패 표시
|
||||
|
||||
### 증상
|
||||
```
|
||||
✅ Service is healthy!
|
||||
# Actions는 빨간 X 표시 (exit status 1)
|
||||
```
|
||||
|
||||
### 원인
|
||||
- heredoc 내부 `exit 0`이 SSH 세션 전체를 종료
|
||||
|
||||
### 해결
|
||||
```bash
|
||||
# 변경 전
|
||||
if curl -f http://localhost:8505/health; then
|
||||
echo "✅ Service is healthy!"
|
||||
exit 0 # SSH 세션 종료됨
|
||||
fi
|
||||
|
||||
# 변경 후
|
||||
if curl -f http://localhost:8505/health; then
|
||||
echo "✅ Service is healthy!"
|
||||
break # 반복문만 종료
|
||||
fi
|
||||
```
|
||||
|
||||
## 최종 상태
|
||||
|
||||
### 배포 확인 (2025-09-04 14:47)
|
||||
```bash
|
||||
docker ps | grep robeing-skill-news
|
||||
# cfcdb2a7221e skill_news-skill-news Up 54 seconds (healthy)
|
||||
|
||||
ps aux | grep defunct | wc -l
|
||||
# 3 (skill-news 관련 없음)
|
||||
|
||||
curl http://localhost:8505/health
|
||||
# {"status":"healthy"}
|
||||
```
|
||||
|
||||
### 커밋 이력
|
||||
- d96d040: docker-compose.yml에 init: true 추가
|
||||
- 1e843dd: YAML heredoc을 echo로 변경
|
||||
- 9abd417: SSH 배포 방식 전면 재작성
|
||||
- 1dfa735: Health check exit 0 → break 변경
|
||||
|
||||
## 참고 문서
|
||||
- 250820_happybell80_skill-email_DB통합및Actions배포.md (SSH 배포 구조)
|
||||
- 250819_happybell80_GmailItem구현및GitActions설정.md (heredoc 문제)
|
||||
- 250728_happybell80_nginx프록시및CI배포문제해결.md (exit 0 문제)
|
||||
Loading…
x
Reference in New Issue
Block a user