crowny.org 접속 복구 — CrownyDoc가 443/80 가로챈 사고
개요
crowny.org 접속 시 크라우니AI(ai.crowny.org, :9852)가 아니라
CrownyDoc 독스 허브가 떴다.
근본 원인은 CrownyDoc 서버(
server-docs.js)가 백엔드 포트(4100) 외에
443/80을 직접 바인딩해
외부 IPv4 트래픽을 게이트웨이보다 먼저 가로챈 것.
진단 경로
DNS/HTTPS 정상(200)이나 외부 응답이 <title>CrownyDoc — 크라우니독 허브</title>.
gateway.yaml line 34: crowny.org → 9852 설정은 정상. 로컬 8443 SNI도 → 크라우니AI 정상.
포트 443에 두 프로세스 공존:
node 76779 = /Users/ef/CrownyDoc/server-docs.js → IPv4 *:443 + *:80 (가로챈 범인)
게이트웨이 = IPv6 *:443만 (게이트웨이 시작 시 IPv4:443이 이미 점유돼 IPv6-only로 떨어짐)
외부 IPv4 접속 → IPv4 리스너(CrownyDoc)로 가서 독스가 뜸.
server-docs.js는 4100 바인딩 실패(EADDRINUSE, 9100 인스턴스가 선점) 후에도 443/80은 잡고 살아있었음.근본 원인
server-docs.js의 SSL 블록이 cert 파일만 있으면 무조건 443/80을 직접 바인딩:
jsif (!process.env.NO_SSL && fs.existsSync(SSL_CERT) && fs.existsSync(SSL_KEY)) {
httpsServer.listen(443, HOST, ...) // 게이트웨이 소유 포트 침범
httpRedirect.listen(80, HOST, ...)
}
CrownyDoc는 게이트웨이 뒤의 4100 백엔드일 뿐, 443/80을 소유하면 안 됨.
조치 (근본 수정)
- server-docs.js 443/80 바인딩을 명시적 opt-in으로 변경 (기본 OFF):
if (process.env.DOCS_SSL === '1' && ...) —
DOCS_SSL=1을 명시하지 않는 한 443/80 안 잡음.
- 가로챈 인스턴스(76779) 종료 → IPv4 443/80 해제.
- 게이트웨이 재기동 → 443/80이 빈 상태에서 dual-stack(
::, v6only=0)으로 IPv4까지 확보.
- health-monitor.sh의 restart_gateway(pkill→sleep3→start)가 클린 재기동 수행.
검증 결과 (GREEN)
- crowny.org / www.crowny.org / ai.crowny.org → 크라우니AI ✓
- docs.crowny.org → CrownyDoc (정상 분리) ✓
- IPv4 명시 접속(127.0.0.1:443) → 크라우니AI ✓ (dual-stack 확인)
- 443 점유 = 게이트웨이 1개만, CrownyDoc 4100 백엔드 200 생존 ✓
관련 파일
/Users/ef/CrownyDoc/server-docs.js (line ~4974~5013, 443/80 바인딩 게이트)
/Users/ef/crowny-gateway/gateway.yaml (crowny.org → 9852 라우팅)
/Users/ef/crowny-gateway/lib/gateway.js (line 267~280 직접 443 best-effort 바인딩, 에러 무시)
/Users/ef/crowny-gateway/scripts/health-monitor.sh (restart_gateway)
잔여 이슈 / 주의
- 게이트웨이의 직접 443 바인딩(lib/gateway.js:280
on('error',()=>{}))은 재기동 순간 443이 잠깐 점유돼 있으면 조용히 실패한다. 깨끗한 순서(443 free 후 start) 필요.
- health-monitor가
pkill -f "node bin/cli.js start"로 모든 게이트웨이를 잡으므로, 수동 nohup 게이트웨이는 모니터와 경쟁한다. 게이트웨이 생명주기는 모니터에 맡길 것.
- CrownyDoc 인스턴스가 health-monitor에 의해 중복 spawn될 수 있음(9100=4100 정상 / 76779=443 침범). DOCS_SSL 게이트로 침범은 차단됐으나 중복 spawn 자체는 별도 점검 대상.