From d2b83dca38eb0c56e550add2e8c79f74fff43826 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Mon, 9 Mar 2026 22:25:16 +0900 Subject: [PATCH] docs: remove robeing naverworks incident from infra journey --- journey/README.md | 4 - ...΄λ©”일뢄석_μ‹€νŒ¨μ€λ‹‰_ν•΄κ²°κ³„νš.md | 108 ------------------ ...뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md | 81 ------------- ...일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md | 70 ------------ ...이메일뢄석_μ‹€νŒ¨μ€λ‹‰_1μ°¨ν•΄κ²°.md | 29 ----- 5 files changed, 292 deletions(-) delete mode 100644 journey/plans/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_ν•΄κ²°κ³„νš.md delete mode 100644 journey/research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md delete mode 100644 journey/troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md delete mode 100644 journey/worklog/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_1μ°¨ν•΄κ²°.md diff --git a/journey/README.md b/journey/README.md index 8ded21e..b2ecd27 100644 --- a/journey/README.md +++ b/journey/README.md @@ -36,7 +36,6 @@ - [260226 NAS(192.168.219.51) μ ‘μ†λΆˆκ°€ μž„μ‹œ λ°±μ—… 볡ꡬ](./troubleshooting/260226_NAS_192_168_219_51_μ ‘μ†λΆˆκ°€_μž„μ‹œλ°±μ—…λ³΅κ΅¬.md) - [260217 starsandi DNS/nginx/SSL 뢄리 적용](./troubleshooting/260217_starsandi_dns_nginx_ssl_λΆ„λ¦¬μ μš©.md) - [51123 ꡬ IP ν•˜λ“œμ½”λ”©κ³Ό λŸ°νƒ€μž„ SSOT 뢈일치 이슈](./troubleshooting/260309_51123_ꡬIPν•˜λ“œμ½”λ”©_λŸ°νƒ€μž„SSOT뢈일치_이슈.md) -- [9μ‹œ 넀이버 이메일 뢄석 미전솑과 μ‹€νŒ¨ 은닉 이슈](./troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md) - [24μ„œλ²„ μš°λΆ„νˆ¬ 터미널 λΆˆκ°€, λ„€νŠΈμ›Œν¬ λŒ€μ—­ 였λ₯˜, python3-apt 볡ꡬ 기둝](./troubleshooting/260309_24μ„œλ²„_μš°λΆ„νˆ¬ν„°λ―Έλ„λΆˆκ°€_λ„€νŠΈμ›Œν¬λŒ€μ—­μ˜€λ₯˜_python3apt볡ꡬ.md) - [Gitea git credential helper ν‘œμ€€ν™”](./troubleshooting/260309_gitea_git_credential_helper_ν‘œμ€€ν™”.md) - [23μ„œλ²„ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ 인프라 ꡬ쑰정리 이슈](./troubleshooting/260307_23μ„œλ²„_μ›Œν¬μŠ€νŽ˜μ΄μŠ€_인프라_ꡬ쑰정리_이슈.md) @@ -46,17 +45,14 @@ - [μ™ΈλΆ€ NAS -> λ‚΄λΆ€ NAS μ»΄νΌλ‹ˆμ—‘μŠ€ 동기화 λ¦¬μ„œμΉ˜](./research/260307_external_nas_companyx_sync_research.md) - [μ»΄νΌλ‹ˆμ—‘μŠ€ μ§μ›μš© λͺ¨λ°”일 파일 포털 λ¦¬μ„œμΉ˜](./research/260307_companyx_mobile_file_portal_research.md) - [51123 ꡬ IP ν•˜λ“œμ½”λ”© μ‹€ν–‰ κ²½λ‘œμ™€ λŸ°νƒ€μž„ SSOT 뢈일치 λ¦¬μ„œμΉ˜](./research/260309_51123_ꡬIPν•˜λ“œμ½”λ”©_μ‹€ν–‰κ²½λ‘œ_SSOT뢈일치_λ¦¬μ„œμΉ˜.md) -- [9μ‹œ 넀이버 이메일 뢄석 미전솑 μ‹€νŒ¨ 은닉 λ¦¬μ„œμΉ˜](./research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md) - [24μ„œλ²„ λ‘œλΉ™ 운영 자료 μˆ˜μ§‘](./research/260309_24μ„œλ²„_λ‘œλΉ™μš΄μ˜_μžλ£Œμˆ˜μ§‘.md) - [24μ„œλ²„ μ‹€μ„œλΉ„μŠ€ μš΄μ˜μ „ν™˜ λ¦¬μ„œμΉ˜](./research/260309_24μ„œλ²„_μ‹€μ„œλΉ„μŠ€μš΄μ˜μ „ν™˜_λ¦¬μ„œμΉ˜.md) - [23μ„œλ²„ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ SSOT κ΅¬μ‘°μ „ν™˜ λ¦¬μ„œμΉ˜](./research/260309_23μ„œλ²„_μ›Œν¬μŠ€νŽ˜μ΄μŠ€_SSOT_κ΅¬μ‘°μ „ν™˜_λ¦¬μ„œμΉ˜.md) - [51123 ꡬ IP ν•˜λ“œμ½”λ”© μ‹€ν–‰ 경둜 제거 κ³„νš](./plans/260309_51123_ꡬIPν•˜λ“œμ½”λ”©_μ‹€ν–‰κ²½λ‘œμ œκ±°_κ³„νš.md) - [24μ„œλ²„ μ‹€μ„œλΉ„μŠ€ μš΄μ˜μ „ν™˜ κ³„νš](./plans/260309_24μ„œλ²„_μ‹€μ„œλΉ„μŠ€μš΄μ˜μ „ν™˜_κ³„νš.md) - [23μ„œλ²„ μ›Œν¬μŠ€νŽ˜μ΄μŠ€ SSOT κ΅¬μ‘°μ „ν™˜ κ³„νš](./plans/260309_23μ„œλ²„_μ›Œν¬μŠ€νŽ˜μ΄μŠ€_SSOT_κ΅¬μ‘°μ „ν™˜_κ³„νš.md) -- [9μ‹œ 넀이버 이메일 뢄석 μ‹€νŒ¨ 은닉 ν•΄κ²° κ³„νš](./plans/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_ν•΄κ²°κ³„νš.md) - [24μ„œλ²„ ONNX λͺ¨λΈ NAS λ°±μ—… 정리](./worklog/260309_24μ„œλ²„_onnxλͺ¨λΈ_nasλ°±μ—…_정리.md) - [23μ œμ–΄λ©΄ gateway workspace-config 단일화](./worklog/260309_23μ œμ–΄λ©΄_gateway_workspace_config_단일화.md) - [51123 ꡬIP active runtime 제거 1μ°¨](./worklog/260309_51123_ꡬIP_active_runtime_제거_1μ°¨.md) - [24μ „ν™˜ λ°°ν¬λŒ€μƒκ³Ό ingress 24IP ꡐ정 1μ°¨](./worklog/260309_24μ „ν™˜_λ°°ν¬λŒ€μƒκ³Ό_ingress_24IP_ꡐ정_1μ°¨.md) - [24μ„œλ²„ NAS 마운트 볡원 및 ONNX λ°±μ—… μ‹€ν–‰](./worklog/260309_24μ„œλ²„_nasλ§ˆμš΄νŠΈλ³΅μ›_onnxλ°±μ—…μ‹€ν–‰.md) -- [9μ‹œ 넀이버 이메일 뢄석 μ‹€νŒ¨ 은닉 1μ°¨ ν•΄κ²°](./worklog/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_1μ°¨ν•΄κ²°.md) diff --git a/journey/plans/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_ν•΄κ²°κ³„νš.md b/journey/plans/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_ν•΄κ²°κ³„νš.md deleted file mode 100644 index 9cac1c3..0000000 --- a/journey/plans/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_ν•΄κ²°κ³„νš.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -tags: [infra, robeing, rb8001, skill-email, naverworks, plans] ---- - -# 260309 9μ‹œ 넀이버 이메일 뢄석 μ‹€νŒ¨ 은닉 ν•΄κ²° κ³„νš - -## μƒμœ„ 원칙 -- [Infra Project Identity](../../00_Philosophy/00_IDENTITY/Infra_Project_Identity.md) -- [Core Infrastructure Principles](../../00_Philosophy/01_PRINCIPLES/Core_Infrastructure_Principles.md) -- [Operational Guardrails](../../00_Philosophy/02_GUARDRAILS/Operational_Guardrails.md) -- 곡톡 μž‘μ„± 원칙: [0_VALUE Writing Principles](https://github.com/happybell80/0_VALUE/blob/main/02_Governance/writing-principles.md) - -## κ΄€λ ¨ λ¬Έμ„œ -- [Infra Journey](../README.md) -- [9μ‹œ 넀이버 이메일 뢄석 미전솑과 μ‹€νŒ¨ 은닉 이슈](../troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md) -- [9μ‹œ 넀이버 이메일 뢄석 미전솑 μ‹€νŒ¨ 은닉 λ¦¬μ„œμΉ˜](../research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md) -- [24μ„œλ²„ μ‹€μ„œλΉ„μŠ€ μš΄μ˜μ „ν™˜ κ³„νš](./260309_24μ„œλ²„_μ‹€μ„œλΉ„μŠ€μš΄μ˜μ „ν™˜_κ³„νš.md) - -## λͺ©ν‘œ -- 넀이버 이메일 뢄석 λΈŒλ¦¬ν•‘μ—μ„œ `메일 쑰회 μ‹€νŒ¨`와 `μ‹€μ œ 메일 0건`을 λΆ„λ¦¬ν•œλ‹€. -- `rb8001` μŠ€μΌ€μ€„λŸ¬κ°€ μ‹€νŒ¨λ₯Ό μ„±κ³΅μ²˜λŸΌ κΈ°λ‘ν•˜μ§€ μ•Šλ„λ‘ ν•œλ‹€. -- 재발 μ‹œ `auth refresh μ§€μ—°`인지 `NAVER WORKS μ™ΈλΆ€ API μ§€μ—°`인지 둜그만으둜 ꡬ뢄 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“ λ‹€. -- `expires_at` μ‹œκ°„λŒ€ μ •ν•©μ„± μœ„ν—˜μ„ 별도 νŒλ‹¨ κ°€λŠ₯ν•œ μƒνƒœλ‘œ λ§Œλ“ λ‹€. - -## 문제 μ •μ˜ -- ν˜„μž¬ `rb8001/app/services/skills/naverworks_briefing.py`λŠ” `skill-email /messages` 호좜 μ‹€νŒ¨λ₯Ό `return []`둜 삼킨닀. -- κ·Έ κ²°κ³Ό `process_briefing()`λŠ” μ‹€νŒ¨λ₯Ό `No emails in the last 24 hours`둜 μ˜€μΈν•˜κ³  μ’…λ£Œν•œλ‹€. -- 이 κ΅¬μ‘°λŠ” μƒμœ„ SSOT의 `Truth First`, `κ·Όλ³Έ 원인 직접 μˆ˜μ • μš°μ„ `, `κ΄‘λ²”μœ„ μ˜ˆμ™Έ 폴백 κΈˆμ§€` 원칙과 μΆ©λŒν•œλ‹€. - -## λ²”μœ„ κ³ μ • - -### 1μ°¨ μˆ˜μ • λŒ€μƒ -- `rb8001/app/services/skills/naverworks_briefing.py` -- `skill-email/main.py` -- `skill-email/services/naverworks_provider.py` - -### 1μ°¨ 검증 λŒ€μƒ -- `rb8001` 09:00 μŠ€μΌ€μ€„ μ‹€ν–‰ 경둜 -- `skill-email /messages?provider=naverworks` -- `auth-server /auth/naverworks/passport/refresh` - -### 2μ°¨ νŒλ‹¨ λŒ€μƒ -- `main_db.naverworks_token.expires_at` 컬럼 νƒ€μž… λ³€κ²½ ν•„μš” μ—¬λΆ€ -- μ»¨ν…Œμ΄λ„ˆ μ‹œκ°„λŒ€ 톡일 μ—¬λΆ€ λ˜λŠ” 만료 νŒλ‹¨ 둜직의 μ‹œκ°„λŒ€ λͺ…μ‹œ 처리 - -## μ‹€ν–‰ 원칙 -- μ‹€νŒ¨λ₯Ό `메일 0건`으둜 λŒ€μ²΄ν•˜μ§€ μ•ŠλŠ”λ‹€. -- `except Exception`으둜 원인성 μ‹€νŒ¨λ₯Ό 일괄 λž˜ν•‘ν•˜μ§€ μ•ŠλŠ”λ‹€. -- `timeout`, `λΉ„200 응닡`, `응닡 ꡬ쑰 이상`, `토큰 κ°±μ‹  μ‹€νŒ¨`λ₯Ό ꡬ뢄해 κΈ°λ‘ν•œλ‹€. -- μˆ˜μ • ν›„μ—λŠ” 둜그, ν—¬μŠ€μ²΄ν¬, μž¬ν˜„ ν…ŒμŠ€νŠΈλ‘œ μ‹€μ œ μ‹€νŒ¨ ν‘œν˜„μ΄ κ΅μ •λλŠ”μ§€ ν™•μΈν•œλ‹€. - -## 단계별 κ³„νš - -### 1. `rb8001`μ—μ„œ μ‹€νŒ¨ 은닉을 μ œκ±°ν•œλ‹€ -- `_fetch_recent_emails()`κ°€ `[]` λŒ€μ‹  원인성 μ˜ˆμ™Έλ₯Ό μ˜¬λ¦¬λ„λ‘ λ°”κΎΌλ‹€. -- μ΅œμ†Œ λΆ„κΈ° λŒ€μƒ: - - `httpx.ReadTimeout` - - `httpx.ConnectError` - - `λΉ„200 응닡` - - 응닡 JSON ꡬ쑰 이상 -- `process_briefing()`λŠ” `μ‹€μ œ 0건`일 λ•Œλ§Œ `No emails`둜 μ²˜λ¦¬ν•˜κ³ , 쑰회 μ‹€νŒ¨λŠ” μŠ€μΌ€μ€„λŸ¬ μ‹€νŒ¨λ‘œ λ‚¨κΈ°κ²Œ λ°”κΎΌλ‹€. - -### 2. `skill-email` 단계별 원인 둜그λ₯Ό λ³΄κ°•ν•œλ‹€ -- `/messages` κ²½λ‘œμ—μ„œ `provider=naverworks` 처리 μ‹œ λ‹€μŒ 단계 둜그λ₯Ό 남긴닀. - - DB 토큰 쑰회 μ‹œμž‘/μ’…λ£Œ - - 만료 νŒλ‹¨ κ²°κ³Ό - - refresh 호좜 여뢀와 응닡 μ½”λ“œ - - NAVER WORKS μ™ΈλΆ€ API 호좜 μ‹œμž‘/μ’…λ£Œμ™€ μ†Œμš”μ‹œκ°„ -- λ‘œκ·ΈλŠ” 성곡/μ‹€νŒ¨ λͺ¨λ‘ 같은 μš”μ²­ νλ¦„μ—μ„œ μ΄μ–΄μ„œ λŒ€μ‘° κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€. - -### 3. `expires_at` μ •ν•©μ„± μœ„ν—˜μ„ μ½”λ“œμ™€ 데이터 κΈ°μ€€μœΌλ‘œ νŒλ‹¨ν•œλ‹€ -- ν˜„μž¬ `naverworks_token.expires_at`κ°€ `timestamp without time zone`인 μƒνƒœλ₯Ό μ „μ œλ‘œ, μ‹€μ œ 만료 νŒλ‹¨μ΄ μ–΄λ–€ μ‹œκ°„λŒ€ κΈ°μ€€μœΌλ‘œ μ΄λ€„μ§€λŠ”μ§€ λͺ…μ‹œν•œλ‹€. -- `skill-email`의 만료 비ꡐ μ‹œκ°κ³Ό DB 기둝 μ‹œκ°μ΄ 같은 μ‹œκ°„λŒ€ κΈ°μ€€μœΌλ‘œ λΉ„κ΅λ˜λ„λ‘ μ •λ¦¬ν•œλ‹€. -- μ„ νƒμ§€λŠ” λ‘˜ 쀑 ν•˜λ‚˜λ‘œ κ³ μ •ν•œλ‹€. - - 컬럼 νƒ€μž…μ„ `timestamptz`둜 승격 - - 비ꡐ μ „ν›„λ₯Ό λͺ¨λ‘ λͺ…μ‹œ timezone κΈ°μ€€μœΌλ‘œ λ³€ν™˜ -- 이 λ‹¨κ³„λŠ” 폴백 μΆ”κ°€κ°€ μ•„λ‹ˆλΌ, νŒλ‹¨ 기쀀을 ν•˜λ‚˜λ‘œ κ³ μ •ν•˜λŠ” μž‘μ—…μ΄μ–΄μ•Ό ν•œλ‹€. - -### 4. μž¬ν˜„ κ²€μ¦μœΌλ‘œ λ‹«λŠ”λ‹€ -- 정상 μΌ€μ΄μŠ€: - - ν˜„μž¬μ™€ 같은 `/messages` μš”μ²­μ΄ 정상 μ‘λ‹΅ν•˜κ³  λΈŒλ¦¬ν•‘μ΄ μ‹€μ œ μ „μ†‘λ˜λŠ”μ§€ ν™•μΈν•œλ‹€. -- μ‹€νŒ¨ μΌ€μ΄μŠ€: - - λ‚΄λΆ€μ μœΌλ‘œ timeout λ˜λŠ” 비정상 응닡을 μž¬ν˜„ν–ˆμ„ λ•Œ μŠ€μΌ€μ€„λŸ¬κ°€ μ‹€νŒ¨λ‘œ λ‚¨λŠ”μ§€ ν™•μΈν•œλ‹€. -- 토큰 만료 μΌ€μ΄μŠ€: - - 만료 μƒνƒœμ—μ„œ refreshκ°€ 정상 μˆ˜ν–‰λ˜λ©΄ μ„±κ³΅μœΌλ‘œ 이어지고, refresh μ‹€νŒ¨ μ‹œ 원인성 μ‹€νŒ¨λ‘œ λ‚¨λŠ”μ§€ ν™•μΈν•œλ‹€. - -## 검증 κ³„νš - -### 1. μ½”λ“œ 검증 -- `rb8001`에 `return []` 기반 μ‹€νŒ¨ 은닉 κ²½λ‘œκ°€ 남아 μžˆμ§€ μ•Šμ€μ§€ ν™•μΈν•œλ‹€. -- `skill-email` λ‘œκ·Έκ°€ λ‹¨κ³„λ³„λ‘œ λ‚¨λŠ”μ§€ ν™•μΈν•œλ‹€. - -### 2. 둜그 검증 -- 성곡 μΌ€μ΄μŠ€μ—μ„œλŠ” `메일 0건`κ³Ό `쑰회 성곡 0건`이 κ΅¬λΆ„λœλ‹€. -- μ‹€νŒ¨ μΌ€μ΄μŠ€μ—μ„œλŠ” `No emails` λŒ€μ‹  `timeout`, `refresh failed`, `works api failed` 같은 원인 λ‘œκ·Έκ°€ λ‚¨λŠ”λ‹€. -- μŠ€μΌ€μ€„λŸ¬ λ‘œκ·Έμ—λŠ” μ‹€νŒ¨ μ‹œ `completed successfully`κ°€ 남지 μ•ŠλŠ”λ‹€. - -### 3. μ‹€ν–‰ 검증 -- `rb8001`μ—μ„œ μˆ˜λ™ λΈŒλ¦¬ν•‘ μ‹€ν–‰ μ‹œ 정상 메일 μ‘°νšŒμ™€ Slack 전솑이 ν†΅κ³Όν•œλ‹€. -- `/messages` 단건 호좜둜 성곡/μ‹€νŒ¨ 응닡 μ‹œκ°„μ΄ ν™•μΈλœλ‹€. -- `auth-server /refresh`와 `skill-email /messages`λ₯Ό 같은 μ‹œκ°λŒ€μ— λŒ€μ‘°ν•΄ 병λͺ© μœ„μΉ˜λ₯Ό ꡬ뢄할 수 μžˆλ‹€. - -## μ™„λ£Œ 쑰건 -- 넀이버 이메일 쑰회 μ‹€νŒ¨κ°€ 더 이상 `No emails`둜 ν‘œμ‹œλ˜μ§€ μ•ŠλŠ”λ‹€. -- 9μ‹œ λΈŒλ¦¬ν•‘ μ‹€νŒ¨ μ‹œ μŠ€μΌ€μ€„λŸ¬μ™€ λ‘œκ·Έκ°€ λͺ¨λ‘ μ‹€νŒ¨λ‘œ κΈ°λ‘λœλ‹€. -- `skill-email` λ‘œκ·Έλ§ŒμœΌλ‘œλ„ `DB/refresh/μ™ΈλΆ€ API` 쀑 μ–΄λŠ λ‹¨κ³„μ—μ„œ μ§€μ—°λλŠ”μ§€ ꡬ뢄 κ°€λŠ₯ν•˜λ‹€. -- `expires_at` 만료 νŒλ‹¨ 기쀀이 μ‹œκ°„λŒ€ ν˜Όμ„  없이 ν•˜λ‚˜λ‘œ μ„€λͺ… κ°€λŠ₯ν•˜λ‹€. - diff --git a/journey/research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md b/journey/research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md deleted file mode 100644 index 0a18fa9..0000000 --- a/journey/research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -tags: [infra, robeing, rb8001, skill-email, naverworks, research] ---- - -# 260309 9μ‹œ 넀이버 이메일 뢄석 미전솑 μ‹€νŒ¨ 은닉 λ¦¬μ„œμΉ˜ - -## μƒμœ„ 원칙 -- [Infra Project Identity](../../00_Philosophy/00_IDENTITY/Infra_Project_Identity.md) -- [Core Infrastructure Principles](../../00_Philosophy/01_PRINCIPLES/Core_Infrastructure_Principles.md) -- [Operational Guardrails](../../00_Philosophy/02_GUARDRAILS/Operational_Guardrails.md) -- 곡톡 μž‘μ„± 원칙: [0_VALUE Writing Principles](https://github.com/happybell80/0_VALUE/blob/main/02_Governance/writing-principles.md) - -## κ΄€λ ¨ λ¬Έμ„œ -- [Infra Journey](../README.md) -- [9μ‹œ 넀이버 이메일 뢄석 미전솑과 μ‹€νŒ¨ 은닉 이슈](../troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md) -- [24μ„œλ²„ μ‹€μ„œλΉ„μŠ€ μš΄μ˜μ „ν™˜ λ¦¬μ„œμΉ˜](./260309_24μ„œλ²„_μ‹€μ„œλΉ„μŠ€μš΄μ˜μ „ν™˜_λ¦¬μ„œμΉ˜.md) -- [51123 ꡬ IP ν•˜λ“œμ½”λ”© μ‹€ν–‰ κ²½λ‘œμ™€ λŸ°νƒ€μž„ SSOT 뢈일치 λ¦¬μ„œμΉ˜](./260309_51123_ꡬIPν•˜λ“œμ½”λ”©_μ‹€ν–‰κ²½λ‘œ_SSOT뢈일치_λ¦¬μ„œμΉ˜.md) - -## λͺ©μ  -- 였늘 09:00 넀이버 이메일 뢄석 λ―Έμ „μ†‘μ˜ 원인을 `μŠ€μΌ€μ€„ 문제`와 `μ‹€ν–‰ μ‹€νŒ¨ 은닉 문제`둜 뢄리해 νŠΉμ •ν•©λ‹ˆλ‹€. -- μ‹€μ œ μ‹€νŒ¨ 지점이 `rb8001`, `skill-email`, `auth-server`, `NAVER WORKS μ™ΈλΆ€ API` 쀑 어디인지 μ’νž™λ‹ˆλ‹€. -- 이후 κ³„νš λ¬Έμ„œκ°€ 우회 없이 원인 경둜λ₯Ό 직접 μˆ˜μ •ν•  수 μžˆλ„λ‘ μ‹€νŒ¨ ν‘œν˜„ ꡬ쑰λ₯Ό λΆ„ν•΄ν•©λ‹ˆλ‹€. - -## Facts - -### 1. μŠ€μΌ€μ€„ 등둝과 싀행은 정상이닀 -- `rb8001` λ‘œκ·Έμ—λŠ” `2026-03-09 09:00:00`에 `naverworks_daily`κ°€ μ‹€ν–‰λœ 기둝이 μžˆλ‹€. -- 같은 μ‹œκ° ν™œμ„± 작 λͺ©λ‘μ—λ„ `naverworks_daily`κ°€ ν¬ν•¨λœλ‹€. -- DB `scheduled_jobs` ν…Œμ΄λΈ”μ—λ„ `name=naverworks_daily`, `job_type=naverworks_briefing`, `cron_expression=0 9 * * mon-fri`, `enabled=true`κ°€ μ‘΄μž¬ν•œλ‹€. - -### 2. μ‹€νŒ¨λŠ” `rb8001`의 메일 쑰회 λ‹¨κ³„μ—μ„œ λ°œμƒν–ˆλ‹€ -- `rb8001/app/services/skills/naverworks_briefing.py`λŠ” `process_briefing()`μ—μ„œ `_fetch_recent_emails()`λ₯Ό λ¨Όμ € ν˜ΈμΆœν•œλ‹€. -- μ‹€μ œ 09:00 λ‘œκ·Έμ—λŠ” 메일 쑰회 νŒŒλΌλ―Έν„°κ°€ 기둝된 λ’€ `09:00:30`에 `httpx.ReadTimeout` μ˜ˆμ™Έκ°€ 남아 μžˆλ‹€. -- μ˜ˆμ™ΈλŠ” `http://localhost:8501/messages` μš”μ²­μ—μ„œ λ°œμƒν–ˆμœΌλ©°, 이 μš”μ²­μ€ `skill-email` μ»¨ν…Œμ΄λ„ˆλ₯Ό ν–₯ν•œλ‹€. - -### 3. ν˜„μž¬ κ΅¬ν˜„μ€ μ‹€νŒ¨μ™€ 0건을 κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ”λ‹€ -- [naverworks_briefing.py](https://github.com/happybell80/rb8001/blob/main/app/services/skills/naverworks_briefing.py)μ—μ„œ `_fetch_recent_emails()`λŠ” `λΉ„200 응닡`이면 `return []`, μ˜ˆμ™Έκ°€ λ‚˜λ„ `return []`λ₯Ό λ°˜ν™˜ν•œλ‹€. -- 같은 ν•¨μˆ˜μ˜ ν˜ΈμΆœλΆ€ `process_briefing()`λŠ” `if not emails:` λΆ„κΈ°μ—μ„œ λͺ¨λ‘ `No emails in the last 24 hours`둜 μ²˜λ¦¬ν•œλ‹€. -- 이 ꡬ쑰 λ•Œλ¬Έμ— `νƒ€μž„μ•„μ›ƒ`, `토큰 κ°±μ‹  μ‹€νŒ¨`, `μ‹€μ œ 메일 μ—†μŒ`이 λ™μΌν•œ κ²°κ³Όκ°’μœΌλ‘œ 합쳐진닀. - -### 4. `skill-email`의 NAVER WORKS 쑰회 κ²½λ‘œμ—λŠ” 토큰 λ§Œλ£Œμ™€ μ™ΈλΆ€ API 호좜이 ν¬ν•¨λœλ‹€ -- `skill-email/services/naverworks_provider.py`λŠ” `_get_account_context()`μ—μ„œ DB `naverworks_token`을 읽고, `expires_at < now`이면 `auth-server /auth/naverworks/passport/refresh`λ₯Ό ν˜ΈμΆœν•œλ‹€. -- κ·Έ λ’€ `list_messages()`μ—μ„œ `https://www.worksapis.com/v1.0/users/{account_id}/mail/mailfolders/0/children`λ₯Ό ν˜ΈμΆœν•΄ μ‹€μ œ 메일 λͺ©λ‘μ„ κ°€μ Έμ˜¨λ‹€. -- 즉 쑰회 κ²½λ‘œμ—λŠ” `DB -> auth-server refresh -> NAVER WORKS μ™ΈλΆ€ API` 단계가 ν¬ν•¨λœλ‹€. - -### 5. λ‹Ήμ‹œ 토큰은 μ‹€μ œλ‘œ 만료돼 μžˆμ—ˆλ‹€ -- `main_db.naverworks_token` 쑰회 κ²°κ³Ό, ν•΄λ‹Ή μ‚¬μš©μž `3550cef6-63e1-4ceb-8802-a25c9d1c6917`의 `expires_at`λŠ” 09μ‹œ 쑰사 μ‹œμ  κΈ°μ€€ `2026-03-05`μ˜€λ‹€. -- λ”°λΌμ„œ 09:00 μš”μ²­μ€ `skill-email` λ‚΄λΆ€μ—μ„œ 토큰 κ°±μ‹  경둜λ₯Ό λ¨Όμ € 탔을 κ°€λŠ₯성이 λ†’λ‹€. -- μˆ˜λ™ κ°±μ‹  ν›„ ν˜„μž¬ `expires_at`κ°€ `2026-03-09 13:59:37`둜 바뀐 것도 확인됐닀. - -### 6. ν˜„μž¬ μ‹œμ μ—λŠ” 같은 μš”μ²­μ΄ 정상 μ‘λ‹΅ν•œλ‹€ -- 같은 νŒŒλΌλ―Έν„°λ‘œ `127.0.0.1:8501/messages`λ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ `HTTP 200`, `0.612889초`둜 μ‘λ‹΅ν–ˆλ‹€. -- `127.0.0.1:9000/auth/naverworks/passport/refresh` μˆ˜λ™ ν˜ΈμΆœλ„ `HTTP 200`, `0.233118초`둜 μ„±κ³΅ν–ˆλ‹€. -- `127.0.0.1:9000/health`도 `HTTP 200`으둜 정상이닀. - -### 7. 만료 νŒλ‹¨ κ²½λ‘œμ—λŠ” μ‹œκ°„λŒ€μ™€ 컬럼 νƒ€μž… 취약성이 μžˆλ‹€ -- `rb8001` μ»¨ν…Œμ΄λ„ˆ μ‹œκ°„λŒ€λŠ” `KST +0900`이고, `skill-email`, `auth-server` μ»¨ν…Œμ΄λ„ˆ μ‹œκ°„λŒ€λŠ” `UTC +0000`이닀. -- `main_db.naverworks_token.expires_at` 컬럼 νƒ€μž…μ€ `timestamp without time zone`이닀. -- κ²€μ¦μš©μœΌλ‘œ 호슀트 SQLμ—μ„œ `expires_at = NOW() - INTERVAL '10 minutes'`λ₯Ό κΈ°λ‘ν•œ λ’€ `/messages`λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν–ˆμ„ λ•Œ, μš”μ²­μ€ `HTTP 200`, `0.253145초`둜 λ°”λ‘œ 끝났고 같은 μ‹œκ° `auth-server`μ—λŠ” refresh μš”μ²­ λ‘œκ·Έκ°€ 남지 μ•Šμ•˜λ‹€. -- 즉 `expires_at` 만료 νŒλ‹¨μ€ 기둝 μ‹œμ μ˜ μ‹œκ°„λŒ€ 해석에 따라 흔듀릴 수 μžˆλŠ” μ·¨μ•½ν•œ ꡬ쑰닀. - -### 8. ν˜„μž¬ κ·Όκ±°λ§ŒμœΌλ‘œλŠ” μ™ΈλΆ€ NAVER WORKS μ§€μ—°κ³Ό λ‚΄λΆ€ refresh 지연을 μ΅œμ’… 뢄리할 수 μ—†λ‹€ -- 09:00 λ‹Ήμ‹œ `skill-email`κ³Ό `auth-server` λ‘œκ·Έμ—λŠ” μš”μ²­ 단계별 μ„ΈλΆ€ λ‘œκ·Έκ°€ μΆ©λΆ„νžˆ 남아 μžˆμ§€ μ•Šλ‹€. -- `skill-email` 09:00 ꡬ간 λ‘œκ·Έκ°€ 거의 λΉ„μ–΄ μžˆμ–΄ `refresh`μ—μ„œ λ©ˆμ·„λŠ”μ§€, `worksapis` μ‘°νšŒμ—μ„œ λ©ˆμ·„λŠ”μ§€ 단정할 직접 λ‘œκ·Έκ°€ μ—†λ‹€. -- λ”°λΌμ„œ ν˜„μž¬ ν™•μ • κ°€λŠ₯ν•œ 직접 원인은 `skill-email /messages read timeout`, ꡬ쑰 원인은 `μ‹€νŒ¨ 은닉`, 보쑰 μœ„ν—˜ μš”μΈμ€ `만료 토큰 μƒνƒœ`κΉŒμ§€λ‹€. - -## Interpretation -- 였늘 μ‚¬κ±΄μ˜ 핡심 λ¬Έμ œλŠ” `9μ‹œ μŠ€μΌ€μ€„μ΄ μ•ˆ λŒμ•˜λ‹€`κ°€ μ•„λ‹ˆλΌ `9μ‹œ μŠ€μΌ€μ€„μ€ λŒμ•˜μ§€λ§Œ μ‹€νŒ¨κ°€ μ„±κ³΅μ²˜λŸΌ 기둝됐닀`λŠ” 점이닀. -- μš΄μ˜μƒ κ°€μž₯ λ¨Όμ € 고쳐야 ν•  뢀뢄은 `μ‹€νŒ¨ 원인 뢄리`이며, κ·Έλž˜μ•Ό κ·Έ λ‹€μŒμ— `refresh μ§€μ—°`인지 `NAVER WORKS μ™ΈλΆ€ API μ§€μ—°`인지 재발 μ‹œ ν™•μ •ν•  수 μžˆλ‹€. -- ν˜„μž¬ κ΅¬μ‘°λŠ” `κ΄€μΈ‘ λΆˆκ°€λŠ₯ν•œ μ‹€νŒ¨`λ₯Ό λ§Œλ“ λ‹€. μ΄λŠ” μƒμœ„ SSOT의 `Truth First`와 μΆ©λŒν•œλ‹€. -- `expires_at`κ°€ `timestamp without time zone`이고 μ»¨ν…Œμ΄λ„ˆ μ‹œκ°„λŒ€κ°€ μ„žμ—¬ μžˆλŠ” 점은, 였늘 μ‚¬κ±΄μ˜ 직접 원인과 λ³„κ°œλ‘œ 토큰 만료 νŒλ‹¨μ„ λΆˆμ•ˆμ •ν•˜κ²Œ λ§Œλ“œλŠ” ꡬ쑰 μœ„ν—˜μ΄λ‹€. -- λ”°λΌμ„œ μˆ˜μ • μš°μ„ μˆœμœ„λŠ” `1. μ‹€νŒ¨ 은닉 제거`, `2. 단계별 원인 둜그 μΆ”κ°€`, `3. expires_at μ‹œκ°„λŒ€ μ •ν•©μ„± ꡐ정`, `4. 토큰 만료/μ™ΈλΆ€ API μ§€μ—° 재발 μ—¬λΆ€ κ΄€μΈ‘` μˆœμ„œκ°€ λ§žλ‹€. - -## Unresolved -- 09:00 μ‹œμ  read timeout의 μ΅œμ’… λΈ”λ‘œν‚Ή 지점이 `auth-server refresh`인지 `NAVER WORKS μ™ΈλΆ€ API`μΈμ§€λŠ” 직접 λ‘œκ·Έκ°€ λΆ€μ‘±ν•΄ 아직 ν™•μ •ν•˜μ§€ λͺ»ν–ˆλ‹€. -- `skill-email`의 `/messages` κ²½λ‘œμ—μ„œ 단계별 μ†Œμš”μ‹œκ°„ λ‘œκ·Έκ°€ μ—†μ–΄, 같은 증상이 μž¬λ°œν•΄λ„ ν˜„μž¬ κ΅¬μ‘°λ§ŒμœΌλ‘œλŠ” μ¦‰μ‹œ ꡬ뢄이 μ–΄λ ΅λ‹€. -- `expires_at` μ‹œκ°„λŒ€ 취약성이 μ‹€μ œ 운영 κ²½λ‘œμ—μ„œλ„ μž¬ν˜„λ˜λŠ”μ§€, μ•„λ‹ˆλ©΄ 호슀트 SQL κ°±μ‹  같은 μ˜ˆμ™Έ κ²½λ‘œμ—μ„œλ§Œ λ“œλŸ¬λ‚˜λŠ”μ§€λ„ 별도 확인이 더 ν•„μš”ν•˜λ‹€. -- λ”°λΌμ„œ λ‹€μŒ κ³„νš λ¬Έμ„œλŠ” `μ‹€νŒ¨ 은닉 제거`와 ν•¨κ»˜ `단계별 원인 둜그 보강`, `expires_at νƒ€μž…/μ‹œκ°„λŒ€ μ •ν•©μ„± ꡐ정 μ—¬λΆ€ νŒλ‹¨`을 포함해야 ν•œλ‹€. - -## ν•œ 쀄 κ²°λ‘  -- 이번 μ‚¬κ±΄μ˜ 직접 원인은 `rb8001 -> skill-email /messages` read timeout이고, 더 큰 ꡬ쑰 λ¬Έμ œλŠ” 이 μ‹€νŒ¨κ°€ ν˜„μž¬ μ½”λ“œμ—μ„œ `No emails`둜 μ€λ‹‰λœλ‹€λŠ” 점이닀. diff --git a/journey/troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md b/journey/troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md deleted file mode 100644 index 4413af4..0000000 --- a/journey/troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -tags: [infra, robeing, rb8001, skill-email, naverworks, troubleshooting] ---- - -# 9μ‹œ 넀이버 이메일 뢄석 미전솑과 μ‹€νŒ¨ 은닉 이슈 - -## μƒμœ„ 원칙 -- [Infra Project Identity](../../00_Philosophy/00_IDENTITY/Infra_Project_Identity.md) -- [Core Infrastructure Principles](../../00_Philosophy/01_PRINCIPLES/Core_Infrastructure_Principles.md) -- [Operational Guardrails](../../00_Philosophy/02_GUARDRAILS/Operational_Guardrails.md) -- 곡톡 μž‘μ„± 원칙: [0_VALUE Writing Principles](https://github.com/happybell80/0_VALUE/blob/main/02_Governance/writing-principles.md) - -## κ΄€λ ¨ λ¬Έμ„œ -- [Infra Journey](../README.md) -- [9μ‹œ 넀이버 이메일 뢄석 미전솑 μ‹€νŒ¨ 은닉 λ¦¬μ„œμΉ˜](../research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md) -- [24μ„œλ²„ μ‹€μ„œλΉ„μŠ€ μš΄μ˜μ „ν™˜ λ¦¬μ„œμΉ˜](../research/260309_24μ„œλ²„_μ‹€μ„œλΉ„μŠ€μš΄μ˜μ „ν™˜_λ¦¬μ„œμΉ˜.md) -- [51123 ꡬ IP ν•˜λ“œμ½”λ”© μ‹€ν–‰ κ²½λ‘œμ™€ λŸ°νƒ€μž„ SSOT 뢈일치 λ¦¬μ„œμΉ˜](../research/260309_51123_ꡬIPν•˜λ“œμ½”λ”©_μ‹€ν–‰κ²½λ‘œ_SSOT뢈일치_λ¦¬μ„œμΉ˜.md) - -## 문제 μ •μ˜ -- 2026-03-09 09:00 KST에 λ‘œλΉ™μ˜ NAVER WORKS(λ„€μ΄λ²„μ›μŠ€) 이메일 뢄석 λΈŒλ¦¬ν•‘μ΄ μ „μ†‘λ˜μ§€ μ•Šμ•˜λ‹€. -- κ·ΈλŸ¬λ‚˜ μŠ€μΌ€μ€„λŸ¬ λ‘œκ·Έμ—λŠ” μž‘μ—…μ΄ `completed successfully`둜 남아 μžˆμ–΄, μ‹€μ œ μ‹€νŒ¨κ°€ μ„±κ³΅μ²˜λŸΌ λ³΄μ˜€λ‹€. -- 이번 이슈의 λ³Έμ§ˆμ€ "μŠ€μΌ€μ€„ λ―Έμ‹€ν–‰"이 μ•„λ‹ˆλΌ `rb8001 -> skill-email` 호좜 μ‹€νŒ¨κ°€ `메일 μ—†μŒ`으둜 μ€λ‹‰λ˜λŠ” μ‹€ν–‰ 경둜 λ¬Έμ œλ‹€. - -## ν™•μΈλœ 사싀 - -### 1. 9μ‹œ μŠ€μΌ€μ€„ μžμ²΄λŠ” 정상 싀행됐닀 -- `rb8001` λ‘œκ·Έμ—λŠ” `2026-03-09 09:00:00`에 `naverworks_daily`κ°€ μ‹€ν–‰λœ 기둝이 μžˆλ‹€. -- 같은 λ‘œκ·Έμ— `Running job: NAVER WORKS Daily Briefing`와 `Starting NaverWorks briefing process for info@company-x.partners`κ°€ 남아 μžˆλ‹€. -- λ”°λΌμ„œ 이번 사건은 μŠ€μΌ€μ€„ 등둝 λˆ„λ½μ΄λ‚˜ ν”„λ‘œμ„ΈμŠ€ λ‹€μš΄μœΌλ‘œ 보이지 μ•ŠλŠ”λ‹€. - -### 2. μ‹€μ œ μ‹€νŒ¨ 지점은 `skill-email /messages` 호좜 νƒ€μž„μ•„μ›ƒμ΄λ‹€ -- `rb8001` λ‘œκ·Έμ—λŠ” `2026-03-09 09:00:30` μ‹œμ  `httpx.ReadTimeout` μ˜ˆμ™Έκ°€ 남아 μžˆλ‹€. -- μ‹€νŒ¨κ°€ λ°œμƒν•œ ν˜ΈμΆœμ€ `http://localhost:8501/messages`이며, νŒŒλΌλ―Έν„°λŠ” `provider=naverworks`, `searchDateType=read`, `startSearchDate=2026-03-06T09:00:00+09:00`, `endSearchDate=2026-03-09T09:00:00+09:00`, `limit=100`이닀. -- λ”°λΌμ„œ 였늘 λ―Έμ „μ†‘μ˜ 직접 원인은 메일 쑰회 λ‹¨κ³„μ˜ 읽기 νƒ€μž„μ•„μ›ƒμ΄λ‹€. - -### 3. μ‹€νŒ¨ ν›„ μž‘μ—…μ€ μ„±κ³΅μ²˜λŸΌ 기둝됐닀 -- `rb8001/app/services/skills/naverworks_briefing.py`λŠ” `_fetch_recent_emails()`μ—μ„œ μ˜ˆμ™Έλ‚˜ 비정상 응닡을 `return []`둜 μ²˜λ¦¬ν•œλ‹€. -- 같은 파일 `process_briefing()`λŠ” 빈 리슀트λ₯Ό `No emails in the last 24 hours`둜 μ²˜λ¦¬ν•˜κ³  κ·ΈλŒ€λ‘œ μ’…λ£Œν•œλ‹€. -- κ·Έ κ²°κ³Ό μŠ€μΌ€μ€„λŸ¬ λ‘œκ·Έμ—λŠ” `NAVER WORKS Daily Briefing completed successfully`κ°€ λ‚¨λŠ”λ‹€. - -### 4. 같은 μš”μ²­μ€ ν˜„μž¬ μ‹œμ μ—λŠ” 정상 μ‘λ‹΅ν•œλ‹€ -- 같은 νŒŒλΌλ―Έν„°λ‘œ `http://127.0.0.1:8501/messages`λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν–ˆμ„ λ•Œ `HTTP 200`, 총 μ‘λ‹΅μ‹œκ°„ μ•½ `0.61초`둜 정상 μ‘λ‹΅ν–ˆλ‹€. -- λ”°λΌμ„œ ν˜„μž¬λŠ” μƒμ‹œ μž₯μ•  μƒνƒœκ°€ μ•„λ‹ˆλΌ, 09:00 μ‹œμ μ˜ λ‹¨λ°œμ„± νƒ€μž„μ•„μ›ƒ λ˜λŠ” μ™ΈλΆ€ μ˜μ‘΄μ„± 지연이 μžˆμ—ˆλ˜ κ²ƒμœΌλ‘œ μ’ν˜€μ§„λ‹€. - -### 5. λ‹Ήμ‹œ NAVER WORKS 토큰은 만료 μƒνƒœμ˜€λ‹€ -- `main_db.naverworks_token` 쑰회 κ²°κ³Ό, ν•΄λ‹Ή 계정 ν† ν°μ˜ `expires_at`λŠ” λ‹Ήμ‹œ `2026-03-05`둜 남아 μžˆμ—ˆλ‹€. -- 이후 μˆ˜λ™ 토큰 κ°±μ‹  ν˜ΈμΆœμ€ `HTTP 200`, μ•½ `0.23초`에 μ„±κ³΅ν–ˆκ³ , ν˜„μž¬ `expires_at`λŠ” `2026-03-09 13:59:37`둜 갱신됐닀. -- 즉 9μ‹œ μ‹œμ μ—λŠ” 토큰 만료 μƒνƒœκ°€ μ‹€μ œλ‘œ μ‘΄μž¬ν–ˆλ‹€. - -## μ™œ λ¬Έμ œμΈκ°€ -- μ‹€νŒ¨κ°€ μ„±κ³΅μ²˜λŸΌ 기둝되면 μš΄μ˜μžλŠ” "메일이 μ—†μ—ˆλ‹€"κ³  μ˜€μΈν•˜κ³  μ‹€μ œ μž₯μ• λ₯Ό λ†“μΉ˜κ²Œ λœλ‹€. -- μƒμœ„ SSOT의 `Truth First`, `κ΄‘λ²”μœ„ μ˜ˆμ™Έ 폴백 κΈˆμ§€`, `κ·Όλ³Έ 원인 직접 μˆ˜μ • μš°μ„ ` 원칙과 μΆ©λŒν•œλ‹€. -- 특히 μ™ΈλΆ€ μ˜μ‘΄μ„± μ§€μ—°, 토큰 만료, λ‚΄λΆ€ μ„œλΉ„μŠ€ νƒ€μž„μ•„μ›ƒμ΄ λ‹€μ‹œ λ°œμƒν•΄λ„ 같은 λ°©μ‹μœΌλ‘œ μž¬λ°œν•  수 μžˆλ‹€. - -## 직접 원인 -- `rb8001`의 NAVER WORKS λΈŒλ¦¬ν•‘ 둜직이 `skill-email` 쑰회 μ‹€νŒ¨λ₯Ό 원인별 μ‹€νŒ¨λ‘œ μ˜¬λ¦¬μ§€ μ•Šκ³  빈 메일 λͺ©λ‘μœΌλ‘œ 삼킨닀. - -## κ·Όλ³Έ 원인 -- λΈŒλ¦¬ν•‘ 둜직이 `메일이 μ‹€μ œλ‘œ 0건인 경우`와 `메일 쑰회 μžμ²΄κ°€ μ‹€νŒ¨ν•œ 경우`λ₯Ό 같은 κ°’ `[]`둜 ν‘œν˜„ν•˜λŠ” ꡬ쑰닀. - -## μš°νšŒκ°€ μ•„λ‹Œ ν•΄κ²° κΈ°μ€€ -- `timeout`, `토큰 κ°±μ‹  μ‹€νŒ¨`, `λΉ„200 응닡`, `응닡 ꡬ쑰 이상`을 `메일 0건`κ³Ό λΆ„λ¦¬ν•œλ‹€. -- μŠ€μΌ€μ€„λŸ¬ μ‹€ν–‰ κ²°κ³ΌλŠ” μ‹€νŒ¨λ©΄ μ‹€νŒ¨λ‘œ κΈ°λ‘λ˜λ„λ‘ μ˜¬λ¦°λ‹€. -- λ‘œκ·Έμ—λŠ” `No emails`κ°€ μ•„λ‹ˆλΌ μ‹€μ œ μ‹€νŒ¨ 원인과 단계가 남아야 ν•œλ‹€. - -## μ™„λ£Œ νŒλ‹¨ κΈ°μ€€ -- `rb8001` 9μ‹œ λΈŒλ¦¬ν•‘μ—μ„œ `skill-email` 쑰회 μ‹€νŒ¨ μ‹œ μŠ€μΌ€μ€„λŸ¬κ°€ μ‹€νŒ¨λ‘œ κΈ°λ‘λœλ‹€. -- μ‹€μ œ 메일 0건일 λ•Œλ§Œ `No emails` λ‘œκ·Έκ°€ λ‚¨λŠ”λ‹€. -- 토큰 만료, μ™ΈλΆ€ API μ§€μ—°, λ‚΄λΆ€ νƒ€μž„μ•„μ›ƒμ΄ λ°œμƒν•΄λ„ 각각의 원인이 λ‘œκ·Έμ—μ„œ κ΅¬λΆ„λœλ‹€. - diff --git a/journey/worklog/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_1μ°¨ν•΄κ²°.md b/journey/worklog/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_1μ°¨ν•΄κ²°.md deleted file mode 100644 index dca0867..0000000 --- a/journey/worklog/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_1μ°¨ν•΄κ²°.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -tags: [infra, robeing, rb8001, skill-email, naverworks, worklog] ---- - -# 260309 9μ‹œ 넀이버 이메일 뢄석 μ‹€νŒ¨ 은닉 1μ°¨ ν•΄κ²° - -## κ΄€λ ¨ λ¬Έμ„œ -- [9μ‹œ 넀이버 이메일 뢄석 미전솑과 μ‹€νŒ¨ 은닉 이슈](../troubleshooting/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_이슈.md) -- [9μ‹œ 넀이버 이메일 뢄석 미전솑 μ‹€νŒ¨ 은닉 λ¦¬μ„œμΉ˜](../research/260309_9μ‹œ_넀이버이메일뢄석_미전솑_μ‹€νŒ¨μ€λ‹‰_λ¦¬μ„œμΉ˜.md) -- [9μ‹œ 넀이버 이메일 뢄석 μ‹€νŒ¨ 은닉 ν•΄κ²° κ³„νš](../plans/260309_9μ‹œ_넀이버이메일뢄석_μ‹€νŒ¨μ€λ‹‰_ν•΄κ²°κ³„νš.md) - -## μž‘μ—… - -- `rb8001/app/services/skills/naverworks_briefing.py`μ—μ„œ `skill-email` 쑰회 μ‹€νŒ¨λ₯Ό `[]`둜 μ‚Όν‚€μ§€ μ•Šκ³  μ˜ˆμ™Έλ‘œ μ˜¬λ¦¬λ„λ‘ κ΅μ •ν–ˆμŠ΅λ‹ˆλ‹€. -- `rb8001/app/scheduler/jobs/naverworks_briefing.py`μ—μ„œ μŠ€μΌ€μ€„λŸ¬ λž˜νΌκ°€ μ‹€νŒ¨λ₯Ό λ‹€μ‹œ μ˜¬λ¦¬λ„λ‘ λ°”κΏ”, APSchedulerκ°€ μ‹€νŒ¨λ₯Ό μ„±κ³΅μ²˜λŸΌ κΈ°λ‘ν•˜μ§€ μ•Šκ²Œ ν–ˆμŠ΅λ‹ˆλ‹€. -- `skill-email/services/naverworks_provider.py`에 `context lookup -> token state -> refresh -> NAVER WORKS API` 단계별 λ‘œκ·Έμ™€ μ†Œμš”μ‹œκ°„ 둜그λ₯Ό μΆ”κ°€ν•˜κ³ , `expires_at` 비ꡐ 기쀀을 λͺ…μ‹œμ μΈ UTC naive μ‹œκ°μœΌλ‘œ κ³ μ •ν–ˆμŠ΅λ‹ˆλ‹€. -- `rb8001/tests/test_naverworks_briefing.py`에 μ‹€νŒ¨ μ „νŒŒμ™€ μŠ€μΌ€μ€„λŸ¬ 래퍼 μ˜ˆμ™Έ μ „νŒŒ ν…ŒμŠ€νŠΈλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. - -## 검증 - -- `docker exec -e PYTHONPATH=/code rb8001 pytest -q tests/test_naverworks_briefing.py` κ²°κ³Ό `10 passed`μ˜€μŠ΅λ‹ˆλ‹€. -- `curl http://127.0.0.1:8001/health`와 `curl http://127.0.0.1:8501/health`λŠ” λͺ¨λ‘ `HTTP 200`μ΄μ—ˆμŠ΅λ‹ˆλ‹€. -- `curl http://127.0.0.1:8501/messages?...provider=naverworks...`λŠ” `HTTP 200`, μ•½ `0.35초`에 정상 μ‘λ‹΅ν–ˆμŠ΅λ‹ˆλ‹€. -- `skill-email` λ‘œκ·Έμ—λŠ” `NAVER WORKS context lookup started`, `token state`, `API request started/finished`, `elapsed_ms`κ°€ μ‹€μ œλ‘œ λ‚¨λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. - -## ν•œ 쀄 κ²°λ‘  - -- 넀이버 이메일 뢄석 μ‹€νŒ¨κ°€ 더 이상 `No emails`둜 μ€λ‹‰λ˜μ§€ μ•Šλ„λ‘ `rb8001`κ³Ό `skill-email` μ‹€ν–‰ 경둜λ₯Ό κ΅μ •ν–ˆκ³ , ν…ŒμŠ€νŠΈμ™€ 싀응닡, 둜그둜 1μ°¨ κ²€μ¦ν–ˆμŠ΅λ‹ˆλ‹€. -