diff --git a/journey/README.md b/journey/README.md index 6cfae36..948fcde 100644 --- a/journey/README.md +++ b/journey/README.md @@ -19,6 +19,8 @@ - 실행 중 문제가 생기면 `worklog`가 아니라 `troubleshooting`으로 기록합니다. ## 현재 문서 +- [51123 구 IP 하드코딩과 런타임 SSOT 불일치 이슈](./troubleshooting/260309_51123_구IP하드코딩_런타임SSOT불일치_이슈.md) +- [24서버 우분투 터미널 불가, 네트워크 대역 오류, python3-apt 복구 기록](./troubleshooting/260309_24서버_우분투터미널불가_네트워크대역오류_python3apt복구.md) - [23서버 워크스페이스 인프라 구조정리 이슈](./troubleshooting/260307_23서버_워크스페이스_인프라_구조정리_이슈.md) - [외부 NAS -> 내부 NAS 컴퍼니엑스 파일 동기화 아이디어](./ideas/260307_external_nas_companyx_sync_아이디어.md) - [컴퍼니엑스 직원용 모바일 파일 포털 아이디어](./ideas/260307_companyx_mobile_file_portal_아이디어.md) diff --git a/journey/troubleshooting/260309_51123_구IP하드코딩_런타임SSOT불일치_이슈.md b/journey/troubleshooting/260309_51123_구IP하드코딩_런타임SSOT불일치_이슈.md new file mode 100644 index 0000000..1d12aff --- /dev/null +++ b/journey/troubleshooting/260309_51123_구IP하드코딩_런타임SSOT불일치_이슈.md @@ -0,0 +1,90 @@ +--- +tags: [infra, 51123, ip, ssot, runtime, troubleshooting] +--- + +# 51123 구 IP 하드코딩과 런타임 SSOT 불일치 이슈 + +## 상위 원칙 +- [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) +- 공통 작성 원칙: `/home/admin/0_VALUE/02_Governance/writing-principles.md` + +## 관련 문서 +- [Infra Journey](../README.md) +- [23서버 워크스페이스-인프라 구조정리 이슈](./260307_23서버_워크스페이스_인프라_구조정리_이슈.md) +- [24서버 우분투 터미널 불가, 네트워크 대역 오류, python3-apt 복구 기록](./260309_24서버_우분투터미널불가_네트워크대역오류_python3apt복구.md) + +## 문제 정의 +- 2026-03-09 현재 23 서버(51123)의 실제 운영 IP는 `192.168.0.100/24`이다. +- 그러나 일부 운영 설정과 코드 기본값에는 과거 IP `192.168.219.45`가 아직 남아 있다. +- 이 상태는 "문서가 오래됨" 수준의 문제가 아니라, 환경변수 누락 또는 fallback 경로 진입 시 서비스가 과거 주소로 접속을 시도할 수 있는 런타임 SSOT 불일치다. + +## 확인된 사실 +### 1. 현재 23 서버 실주소 +- 호스트명: `robeing-brains` +- NIC: `enp6s0` +- IPv4: `192.168.0.100/24` +- 기본 게이트웨이: `192.168.0.1` + +### 2. 현재 SSOT에 반영된 운영 기준값 +- `/home/admin/infra-config/runtime.env` + - `HOST_51123=192.168.0.100` + - `ROBEING_DEFAULT_HOST=192.168.0.100` + - `MONITOR_URL=http://192.168.0.100:9024` +- `/home/admin/infra-config/secrets.env` + - `ROBEING_MONITOR_DATABASE_URL=postgresql://robeings:robeings@192.168.0.100:5432/main_db` + +### 3. 과거 IP `192.168.219.45`가 남아 있는 실행 경로 +- `auth-server/app/providers/gmail_passport.py` + - `DATABASE_URL` 기본값이 `192.168.219.45:5432` +- `robeing/skill-email/docker-compose.yml` + - `AUTH_SERVER_URL` fallback이 `http://192.168.219.45:9000` +- `robeing/skill-calendar/docker-compose.yml` + - `DATABASE_URL` fallback이 `192.168.219.45:5432` +- `robeing/skill-calendar/services/google_calendar_service.py` + - `DATABASE_URL` 기본값이 `192.168.219.45:5432` +- `fluent-bit/data-prepper/pipelines.yaml` + - OpenSearch 호스트가 `http://192.168.219.45:9200` +- `robeing/admin-dashboard/backend/services/system_service.py` + - 서버 간 fallback 주소가 `192.168.219.45` +- `ivada_project/robeing-monitor/*` + - 구 경로 쪽 `DATABASE_URL` 기본값이 여전히 `192.168.219.45:5432` + +## 왜 문제인가 +- 현재는 일부 서비스가 `runtime.env`를 먼저 읽어 우연히 정상 동작할 수 있다. +- 그러나 새 컨테이너, 누락된 env, 임시 실행, 개별 스크립트, 테스트 경로에서는 과거 IP fallback이 다시 살아날 수 있다. +- 즉 장애가 "지금은 안 보이는 상태"일 뿐이고, 재배포나 복구 시점에 같은 문제가 재발할 조건이 남아 있다. + +## 직접 원인 +- 23 서버 IP 기준이 `infra-config/runtime.env`로 단일화되기 전에, 서비스별 코드 기본값과 compose fallback에 과거 주소가 개별적으로 박혀 있었다. + +## 근본 원인 +- 서버 주소를 코드/컨테이너/문서마다 별도로 들고 있던 구조 때문에, SSOT가 생긴 뒤에도 기존 fallback과 하드코딩이 제거되지 않았다. + +## 근본 해결 기준 +- 51123 주소는 `/home/admin/infra-config/runtime.env`의 `HOST_51123=192.168.0.100`만 기준값으로 사용한다. +- 코드 기본값과 compose fallback에 IP literal을 직접 넣지 않는다. +- 서비스는 `HOST_51123`, `DATABASE_URL`, `AUTH_SERVER_URL`, `MONITOR_URL`처럼 의미 있는 환경변수만 참조한다. +- 과거 IP `192.168.219.45`는 운영 실행 경로에서 0건이어야 한다. + +## 우회가 아닌 해결 조건 +- `192.168.219.45`를 새 값과 병행 허용하지 않는다. +- "안 되면 과거 IP로 재시도" 같은 폴백을 추가하지 않는다. +- 남아 있는 하드코딩/기본값을 제거하고, SSOT 값만 주입되도록 구조를 정리한다. + +## 우선 정리 대상 +1. 런타임 env 없이도 실행될 수 있는 코드 기본값 +2. `docker-compose.yml`의 fallback 주소 +3. 서버 간 호출 URL, DB URL, Neo4j/OpenSearch 같은 인프라 의존값 +4. 구 경로(`ivada_project`)처럼 현재 운영과 분리되지 않은 잔존 실행본 + +## 완료 판단 기준 +- 실행 경로 파일에서 `192.168.219.45` 검색 결과가 0건이다. +- 23 서버 기동 서비스가 모두 `192.168.0.100` 또는 명시 env만 참조한다. +- 24 서버에서 23 서버 DB/인증/모니터 호출을 실제로 재검증해 과거 IP 경로가 다시 나오지 않는다. + +## 상위 원칙/근거 문서 연결 +- [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)