cloudflared→엣지 인증 파이프와 커밋 가능한 ingress가 계약입니다. OpenClaw를 loopback만 쓰면 MagicDNS와 SSH -R 사이 제3경로로, 공인 인바운드 없이 리전별 고정 호스트명 합성 검사가 가능합니다.
Named Tunnel은 DNS를 Cloudflare에 둔 팀이 HTTP 입구까지 리뷰 가능한 산출물로 만들 때 씁니다. config.yml ingress는 코드처럼 순서·호스트명·끝의 404 캐치올을 고정하세요. 엣지 조향이 더 필요하면 Worker·SSH p95 글을 함께 보고, 여기서는 cloudflared·loopback·프로브 병합만 다룹니다.
「ingress 고정」이 중요한 이유
프로덕션은 Named Tunnel+ingress 파일이 계약입니다. 호스트→http://127.0.0.1:PORT·캐치올을 명시하고 리전별로 호스트·포트만 바꿔 병합 로직을 단순화하세요. 유닛 템플릿 옆에 두면 revert 한 번으로 롤백됩니다. OpenClaw는 0.0.0.0 바인딩 금지—로컬 클라이언트는 cloudflared와 헬스뿐, 브라우저는 엣지 TLS 후 터널로.
재현 절차(vpshalo 리전마다 한 벌)
인벤토리 태그·실제 health 경로에 맞게 치환하세요. 아래 포트·호스트는 예시입니다.
- 1단계 — OpenClaw를 loopback에 격리.
OPENCLAW_HOME=/var/lib/openclaw/<region>등 리전별 홈을 export하고(이미지가 macOS 경로를 쓰면 그에 맞춤), 게이트웨이가127.0.0.1:18080만 리슨하도록 플래그를 명시합니다. 동일 호스트에서curl -fsS --max-time 2 http://127.0.0.1:18080/healthz가 성공할 때까지 확인합니다. - 2단계 — Named Tunnel과 DNS.
cloudflared를 설치한 뒤cloudflared tunnel create openclaw-<region>을 실행하고, Cloudflare가 요구하는 CNAME을<region>.gw.example.com등에 맞춥니다. 터널 UUID·이름을 CMDB에 남기면 로테이션 시 매핑이 분명합니다. - 3단계 — ingress 고정. 자격 증명 JSON을 참조하는 tunnel 블록이 있는
config.yml을 작성하고,ingress에서https://<region>.gw.example.com/*를http://127.0.0.1:18080에 연결합니다. 편집 실수로 첫 규칙에 떨어지지 않도록- service: http_status:404로 끝냅니다. - 4단계 — systemd로
TUNNEL_TOKEN. Zero Trust에서 해당 터널 토큰을 복사해/etc/default/cloudflared-openclaw(권한0600)에TUNNEL_TOKEN=…만 기록하고, 유닛은cloudflared tunnel run --config /etc/cloudflared/openclaw-<region>.yml를 가리킵니다.Restart=on-failure와 백오프로 제어 평면을 두드리지 않게 합니다. - 5단계 — 엣지→오리진 검증. 사무 VLAN 밖 CI 등에서 공개 HTTPS URL로 curl합니다. loopback 헬스 RTT와 비교해 엣지만 초록이면 박스 내부 버그, 둘 다 동시에 죽으면 프로세스 쪽을 의심하고 터널 인증서 탓으로 돌리지 않습니다.
# 오리진: cloudflared 전에 loopback이 먼저 살아 있어야 함
curl -fsS --max-time 2 http://127.0.0.1:18080/healthz
# DNS 전파 후: 엣지 검증(별도 클라이언트 인증서 불필요)
curl -fsS --max-time 5 https://usw.gw.example.com/healthz
TUNNEL_TOKEN이 새면 그 PoP 경로만 위험해지고 전 세계 OpenClaw 홈이 한꺼번에 열리지는 않습니다.리전 간 프로브 출력 병합
JSON에 region·lane(loopback / tunnel_origin / edge_https)·rtt_ms·http_status·error_class를 고정하고 검사마다 한 줄을 쌓은 뒤 리전 키로 5분 롤링 창에 넣습니다. 세 레인 동시 실패 시에만 리전 페이지, 두 리전 이상 edge_https 동시 실패일 때만 다중 리전 승격으로 중복 알림을 줄입니다.
- 레인 A — loopback: 비용이 가장 낮은 신호로, 모델 호스트 cron에서 1분 주기.
- 레인 B — tunnel_origin:
cloudflared가 붙는 동일 포트에127.0.0.1로 curl해 프로세스 쌍 배선을 증명. - 레인 C — edge_https: 외부 시점에서 5분마다 저빈도로 호출해 레이트 리밋과 장애를 혼동하지 않기.
FAQ: 터널 인증서·포트·토큰
Cloudflare Tunnel 뒤에서 vpshalo 호스트에 TLS 서버 인증서가 필요한가요? 대개 아니요. 사용자 TLS는 Cloudflare에서 종료되고 cloudflared는 127.0.0.1에 평문 HTTP로 붙을 수 있습니다. 규제상 오리진 구간 암호화가 필요할 때만 루프백 TLS를 추가하고, 공용 CA 와일드카드를 git에 복사하지 말고 금고의 짧은 수명 인증서로 로컬 종료하세요.
로컬 포트는 어떻게 고르고 검증하나요? 리전마다 문서화된 높은 포트(예: 18080)를 정하고 OpenClaw 플래그와 ingress에 동일 값을 넣습니다. ss -lntp로 해당 포트가 0.0.0.0에 열려 있지 않은지 확인합니다. 포트를 바꿀 때는 두 파일을 같은 커밋으로 옮겨 cloudflared가 죽은 업스트림에 매달리는 드리프트를 막습니다.
TUNNEL_TOKEN은 어떻게 다루나요? 클라우드 API 키와 같이 취급합니다. git·티켓에 넣지 않고 EnvironmentFile이나 비밀 관리자에서 주입하며, 유출 시 즉시 재발급한 뒤 그 리전 노드를 한꺼번에 재시작해 구·신 토큰이 섞인 스플릿 브레인을 피합니다.
장애 시 무엇이 먼저 깨지나요? OpenClaw 자체보다 DNS나 git에 남은 옛 ingress가 흔합니다. 온콜은 모델을 재시작하기 전에 실행 중 config.yml과 저장소 diff를 익히게 하세요.
구매 정렬: 터널 RTT·레지스트리와 맞는 PoP를 고르고 전환 후 edge_https 기준선을 ingress 문서에 같이 적어 용량을 증거에 묶으세요.