diff --git a/journey/troubleshooting/2026-03-03_51123_DB5432_차단사고_복구_및_의존포트_점검.md b/journey/troubleshooting/2026-03-03_51123_DB5432_차단사고_복구_및_의존포트_점검.md new file mode 100644 index 0000000..703ee60 --- /dev/null +++ b/journey/troubleshooting/2026-03-03_51123_DB5432_차단사고_복구_및_의존포트_점검.md @@ -0,0 +1,82 @@ +# 51123 DB 5432 차단 사고 복구 및 의존 포트 점검 + +## 발생 일시 +- 장애 징후 시작: 2026-03-03 10:59 KST 전후 +- 원인 확인/복구: 2026-03-03 11:18~11:22 KST + +## 문제 요약 +- 51124의 `skill-email`이 `192.168.219.45:5432` 연결 타임아웃으로 `ReadTimeout/500`을 반환. +- 앱 로직 문제가 아니라 DB 접속 경로(포트 5432) 차단으로 인한 네트워크 레벨 장애. + +## 직접 원인 +- 2026-03-03 오전 포트 하드닝 작업 중, UFW의 `5432/tcp` 외부 허용 규칙을 제거함. +- 이때 51124(`192.168.219.52`)의 DB 직접 접근도 함께 차단됨. + +## 사실 확인 (51123) +1. PostgreSQL 리스닝: 정상 +- `ss -lntp` 결과: `0.0.0.0:5432`, `[::]:5432` LISTEN + +2. PostgreSQL 설정: 원격 수신 가능 +- `postgresql.conf`: `listen_addresses='*'`, `port=5432` +- `pg_hba.conf`: `host all all 0.0.0.0/0 scram-sha-256` + +3. 방화벽: 장애 시점 기준 5432 허용 누락 +- `ufw status`에서 `5432` 허용 규칙이 없었음 + +## 조치 +- 최소권한 원칙으로 51124 IP만 5432 허용 재개: + +```bash +sudo ufw allow from 192.168.219.52 to any port 5432 proto tcp +``` + +## 복구 검증 +1. 네트워크 +- 51124 -> 51123 포트 테스트: + - `5432 open` (복구) + - `3000 blocked`, `7474 blocked` (의도된 차단 유지) + - `7687/9000/8100/8000/9200 open` + +2. 컨테이너 내부 +- `skill-email` 컨테이너에서 `192.168.219.45:5432` TCP 연결 성공 (`tcp_ok`). + +3. 서비스 +- `rb8001 /health` 정상(`200`). +- 장애 핵심 경로였던 DB 접속 타임아웃은 네트워크 기준 해소. + +## 영향 범위 점검 결과 (51124 -> 51123 의존) +다음 서비스/환경변수들이 `192.168.219.45:5432`를 사용 중: +- `skill_email` +- `skill-calendar` +- `skill-news` +- `skill-rag-file` +- `rb8001` +- `robeing-monitor` +- 일부 `admin-dashboard` 구성(호스트 브리지 기반) + +즉, 5432 차단 시 `skill-email`만이 아니라 위 서비스 전반에서 동일 장애 가능. + +## 재발 방지 +1. 포트 하드닝 전 의존성 체크 필수 +- 51124에서 `192.168.219.45:` 참조를 `.env`/`compose`에서 선조회 + +2. 변경 절차 고정 +- `차단 전`: 의존 포트 목록 작성 +- `차단 직후`: 51124 원격 TCP 매트릭스 테스트 +- `완료 전`: 핵심 서비스 헬스 + 최근 오류로그 교차 확인 + +3. UFW 정책 원칙 +- 전면 허용(`Anywhere`) 대신 서버 단위 허용으로 운영 +- 예: `5432`는 `192.168.219.52`만 허용 + +## 명령어 체크리스트 +```bash +# 51123 +ss -lntp | grep 5432 +sudo ufw status numbered + +# 51124에서 51123 연결 점검 +for p in 5432 3000 7474 7687 9000 8100 8000 9200; do + timeout 2 bash -lc "cat < /dev/null > /dev/tcp/192.168.219.45/$p" && echo "$p open" || echo "$p blocked" +done +```