← 목록
기타 2026-06-13 3KB 읽기 4분

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.jsIPv4 *: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을 소유하면 안 됨.

    조치 (근본 수정)

    1. server-docs.js 443/80 바인딩을 명시적 opt-in으로 변경 (기본 OFF):
    if (process.env.DOCS_SSL === '1' && ...)DOCS_SSL=1을 명시하지 않는 한 443/80 안 잡음.
    1. 가로챈 인스턴스(76779) 종료 → IPv4 443/80 해제.
    2. 게이트웨이 재기동 → 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 자체는 별도 점검 대상.