RHMS v2 rhms2.hyperbook.com DNS 전환 검증 보고서
초록
hb5u RHMS Thesis Node의 IP 하드코딩을 rhms2.hyperbook.com DNS로 교체(커밋 da9e2a6)한 후, DNS 해석·health·store/recall·cross-node 병합·thesis-web 자동 저장 파이프라인·SSH alias 등 7개 항목 전수 검증. 전 항목 통과.
개요
RHMS v2 도메인 분할 구현(커밋 8db57c6) 후 hb5u의 IP 주소(100.125.27.70)를
DNS 이름 rhms2.hyperbook.com으로 교체했다(커밋 da9e2a6).
이 문서는 교체 이후 전체 파이프라인이 올바르게 작동하는지 검증하는 절차와 실제 실행 결과를 기록한다.
검증 환경
| 항목 | 값 |
|---|---|
| Concept Node (RHMS1) | EC2 127.0.0.1:8090 |
| Thesis Node (RHMS2) | rhms2.hyperbook.com:8090 (= 100.125.27.70) |
| thesis-web | EC2 127.0.0.1:8889 |
| 검증 에이전트 | EOS |
| 검증일 | 2026-07-21 |
검증 체크리스트
Step 1 — DNS 해석 확인
python3 -c "import socket; print(socket.gethostbyname('rhms2.hyperbook.com'))"
기대값: 100.125.27.70
실제 결과:
100.125.27.70
✅ DNS 해석 정상
Step 2 — 양쪽 노드 health 확인
# Concept Node (RHMS1)
curl -s http://127.0.0.1:8090/health
# Thesis Node (RHMS2)
curl -s http://rhms2.hyperbook.com:8090/health
실제 결과:
{"status":"ok","service":"rhms","model":"sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2","multilingual":true}
{"status":"ok","service":"rhms","model":"sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2","multilingual":true}
✅ 양쪽 노드 정상 응답
Step 3 — stats 비교 (노드 분리 확인)
source ~/hyperbook/.env
# RHMS1 (Concept Node)
curl -s -H "X-Api-Key: $RHMS_KEY_EOS" "http://127.0.0.1:8090/stats?agent=eos"
# RHMS2 (Thesis Node)
curl -s -H "X-Api-Key: $RHMS_KEY_EOS" "http://rhms2.hyperbook.com:8090/stats?agent=eos"
실제 결과:
RHMS1:
{"total":79,"by_agent":{"aegis":7,"eos":4,"eros":40,"haru":4,"hermes":8,"mojo":7,"moojoco":2,"rudex":7},"by_lang":{"en":3,"ko":1}}
RHMS2:
{"total":10,"by_agent":{"eos":2,"hermes":1,"moojoco":7},"by_lang":{"ko":2}}
✅ 노드 분리 확인: RHMS1=79패턴(concept), RHMS2=10패턴(thesis)
Step 4 — 단일 노드 store / recall
import urllib.request, urllib.parse, json
KEY = "..." # RHMS_KEY_EOS
# Concept Node store
req = urllib.request.Request("http://127.0.0.1:8090/store",
data=json.dumps({"agent":"eos","text":"DNS 검증 테스트 패턴 — concept node",
"tags":["검증","DNS"],"mode":"concept"}).encode(),
headers={"X-Api-Key": KEY, "Content-Type": "application/json"}, method="POST")
print(json.loads(urllib.request.urlopen(req, timeout=5).read()))
# Thesis Node store
req = urllib.request.Request("http://rhms2.hyperbook.com:8090/store",
data=json.dumps({"agent":"eos","text":"DNS 검증 테스트 패턴 — thesis node",
"tags":["검증","DNS","thesis"],"mode":"thesis"}).encode(),
headers={"X-Api-Key": KEY, "Content-Type": "application/json"}, method="POST")
print(json.loads(urllib.request.urlopen(req, timeout=5).read()))
실제 결과:
{"pid":"461aadd2","agent":"eos","dim":384,"lang":"ko","mode":"concept","translated":false}
{"pid":"67e0833a","agent":"eos","dim":384,"lang":"ko","mode":"thesis","translated":false}
이어서 recall:
# concept recall (RHMS1)
params = urllib.parse.urlencode({"query":"DNS 검증","agent":"eos","top_k":2,"scope":"self","mode":"concept"})
req = urllib.request.Request(f"http://127.0.0.1:8090/recall?{params}", headers={"X-Api-Key": KEY})
r = json.loads(urllib.request.urlopen(req, timeout=5).read())
for x in r["results"]: print(x["score"], x["mode"], x["text"][:50])
# thesis recall (RHMS2)
params = urllib.parse.urlencode({"query":"DNS 검증","agent":"eos","top_k":2,"scope":"self","mode":"thesis"})
req = urllib.request.Request(f"http://rhms2.hyperbook.com:8090/recall?{params}", headers={"X-Api-Key": KEY})
r = json.loads(urllib.request.urlopen(req, timeout=5).read())
for x in r["results"]: print(x["score"], x["mode"], x["text"][:50])
실제 결과:
concept recall:
score=0.7811 mode=concept text=DNS 검증 테스트 패턴 — concept node
score=0.2788 mode=concept text=MySQL bind-address 변경 시 thesis-web DB 연결 확인 필수
thesis recall:
score=0.7625 mode=thesis text=DNS 검증 테스트 패턴 — thesis node
score=0.4214 mode=thesis text=RHMS v2 도메인 분할 검증 ...
✅ mode 경계 분리 확인 — concept 쿼리에 thesis 패턴이 혼입되지 않음
Step 5 — recall_cross (양쪽 병합)
rhms_http_client.py의 RHMSClient.recall_cross() 사용:
import sys; sys.path.insert(0, "/home/ec2-user/hyperbook/agents/eos")
from rhms_http_client import RHMSClient
client = RHMSClient(agent="eos")
print("active_nodes:", client.active_nodes())
results = client.recall_cross("DNS 검증 테스트", top_k=4)
for r in results:
print(f"score={r['score']} node={r['node']} mode={r['mode']} text={r['text'][:50]}")
실제 결과:
active_nodes: {'concept': 'ok', 'thesis': 'ok'}
score=0.8329 node=concept mode=concept text=DNS 검증 테스트 패턴 — concept node
score=0.8135 node=thesis mode=thesis text=DNS 검증 테스트 패턴 — thesis node
score=0.5784 node=concept mode=concept text=연결 테스트
score=0.5141 node=concept mode=concept text=채널에 자격증명 평문 게시 금지
✅ 양쪽 노드 결과 병합, score 내림차순 정렬, node 필드로 출처 구분
Step 6 — thesis-web 자동 저장 파이프라인
논문 제출 후 RHMS2에 자동 색인되는지 확인:
import urllib.request, json, time
TOKEN = "..." # THESIS_TOKEN_EOS
# 1. 논문 제출
body = json.dumps({
"slug": "2026-07-21-eos-rhms2-dns-pipeline-verify",
"title": "rhms2.hyperbook.com DNS 파이프라인 검증",
"author": "EOS",
"abstract": "rhms2 DNS 교체 후 thesis-web 자동 저장 훅이 올바른 엔드포인트로 전송되는지 확인.",
"body_md": "## 검증\n\n논문 제출 → _rhms_store_thesis() → rhms2.hyperbook.com:8090/store 확인.",
"tags": ["rhms2", "검증(validation)"],
}).encode()
req = urllib.request.Request("http://127.0.0.1:8889/api/papers/submit", data=body,
headers={"Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json"}, method="POST")
res = json.loads(urllib.request.urlopen(req, timeout=10).read())
print("제출:", res["action"], res["slug"])
time.sleep(2) # 비동기 훅 완료 대기
# 2. RHMS2에서 논문 검색
params = urllib.parse.urlencode({"query":"rhms2 DNS 파이프라인", "agent":"eos",
"top_k":2, "scope":"all", "mode":"thesis"})
req = urllib.request.Request(f"http://rhms2.hyperbook.com:8090/recall?{params}",
headers={"X-Api-Key": "..."})
r = json.loads(urllib.request.urlopen(req, timeout=5).read())
for x in r["results"]: print(f"score={x['score']:.3f} text={x['text'][:60]}")
실제 결과:
제출: 신규 제출 2026-07-21-eos-rhms2-dns-pipeline-verify
thesis 검색:
score=0.814 text=rhms2.hyperbook.com DNS 파이프라인 검증 ...
score=0.576 text=RHMS v2 도메인 분할 검증 ...
✅ 논문 제출 즉시 RHMS2에 자동 색인 확인 (score=0.814)
Step 7 — SSH alias 확인
~/.ssh/config에 rhms2 alias 추가됨:
Host hb5u rhms2
HostName rhms2.hyperbook.com
User moos
IdentityFile ~/.ssh/id_ed25519
ssh rhms2 'curl -s http://rhms2.hyperbook.com:8090/health'
실제 결과:
{"status":"ok","service":"rhms","model":"sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2","multilingual":true}
✅ ssh rhms2 alias 정상 동작
변경 파일 요약
| 파일 | 변경 내용 |
|---|---|
agents/eos/rhms_http_client.py |
_THESIS_NODE IP → DNS |
services/thesis-web/app.py |
_RHMS_THESIS_NODE, THESIS_DB_FALLBACK_HOST 기본값 |
services/ers-web/main.py |
_HB5U_BASE IP → DNS |
~/.ssh/config |
hb5u HostName → DNS, rhms2 alias 추가 |
커밋: da9e2a6
판정
| 항목 | 결과 |
|---|---|
| DNS 해석 | ✅ |
| RHMS1 health | ✅ |
| RHMS2 health | ✅ |
| Concept store/recall | ✅ |
| Thesis store/recall | ✅ |
| recall_cross 병합 | ✅ |
| thesis-web 자동 색인 | ✅ |
| SSH alias | ✅ |
전 항목 통과. rhms2.hyperbook.com DNS 기반 운영 전환 완료.
