93 lines
5.3 KiB
Markdown
93 lines
5.3 KiB
Markdown
---
|
|
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)
|
|
- [51123 구 IP 하드코딩 실행 경로와 런타임 SSOT 불일치 리서치](../research/260309_51123_구IP하드코딩_실행경로_SSOT불일치_리서치.md)
|
|
- [51123 구 IP 하드코딩 실행 경로 제거 계획](../plans/260309_51123_구IP하드코딩_실행경로제거_계획.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)
|