← 개발 일기로 돌아가기

OpenClaw 2026: 캐나다에만 두는 원격 Mac M4 Gateway — macOS 클라이언트는 SSH·Tailnet으로, Dashboard·TCP 18789, 태평양 팀 토큰·loopback·LaunchAgent 지속 실행까지

서버 노트 / 개발 · 2026.05.15 · 약 12 분

SSH, Tailscale tailnet, 캐나다 원격 Mac M4의 OpenClaw Gateway를 연상시키는 네트워크 장비와 케이블

2026년에도 일부 팀은 OpenClaw Gateway 리전을 캐나다의 Mac mini M4 한 대로만 고정합니다. 북미를 기준 제어 평면으로 두고 도쿄·싱가포르·캘리포니아의 macOS 노트북만 붙이는 그림이죠. 제약은 단순해 보이지만, Dashboard를 열고 TCP 18789 리스너를 헬스 체크와 맞추고, 재무에 같은 gateway.remote.token이 왜 세 사람에게 필요한지 슬랙에 붙여넣지 않고 설명하려면 별도의 실행서가 필요합니다. 이 글은 한 줄기 튜토리얼입니다. Remote 접속SSHTailscale tailnet으로 어떻게 통과시키는지, 그 선택이 loopback 바인딩과 어떻게 겹치는지, 사용자 영역 LaunchAgent로 재부팅 뒤에도 Gateway가 조용히 살아나게 하는지까지 묶습니다. 설치 토폴로지를 아직 고른다면 OpenClaw 2026 캐나다 원격 Mac M4: SSH 터널 vs 직접 Gateway? gateway.remote.token, 포트 18789, PATH, launchd를 먼저 보고, 기존 노드를 옮기는 중이면 OpenClaw 2026: 로컬·구형 Mac에서 캐나다 원격 Mac M4로 옮길 때 안정적으로 — Gateway 18789, Workspace 패키징, LaunchDaemon 재구축, 태평양 SSH/VNC 검수와 롤백의 단계 게이트를 재사용하세요. 채널 쪽 첫 연결이 더 급하면 OpenClaw 2026 원격 Mac Channels 첫 연결·산선 트러블슈팅: install.sh, Gateway 18789, Telegram/Slack, 토큰·터널 자가점검, 로그·디스크, 캐나다 M4 egress와 토큰·터널 자가점검을 맞춰 두면 이후 Dashboard 점검이 수월합니다.

1
정본 Gateway 호스트(캐나다 M4)
18789
기본 Gateway 제어 포트(바인딩 검증)
2
이 글에서 다루는 주 경로(SSH, tailnet)

왜 “캐나다만”이면 네트워크 이야기가 달라지는가

제품과 보안이 APAC에 보조 Gateway 없음을 비용·데이터 상주 이유로 밀어붙이면, 모든 macOS 엔지니어는 법적 타임존이 다른 머신의 원격 운영자가 됩니다. Gateway 프로세스는 채널용 DNS, 워크스페이스 스냅샷용 디스크, 감사 가능한 리스너 표를 여전히 요구합니다. 실무에서는 세 주소를 문서화합니다. 호스트의 공급자 라우팅 IPv4(SSH, 화면 공유, 대용량 동기), 호스트의 Tailscale 100.x, 그리고 호스트 안에서 OpenClaw가 선호하는 127.0.0.1입니다. 표 없이 섞으면 “내 터널에선 된다”인데 싱가포르 동료의 브라우저는 어제 포워딩을 가리키며 Dashboard에 간헐 502를 보는 상황이 납니다.

캐나다 단일 운영은 지연 허용 범위도 다시 정의합니다. 태평양 SSH는 셸·scp에는 충분하지만, 기가바이트급 아티팩트를 반복 끌어오면 팀은 tailnet 위 rsync나 Mac 근처 객체 스토리지로 기울게 됩니다. 반면 Gateway 제어 채널은 비교적 작습니다: 킵얼리브, JSON 제어, 가끔 로그 스트림. 그래서 많은 조직은 18789를 loopback에 두고 포워딩하고, 대용량은 다른 길로 보냅니다. 다음 절에서는 그 자세를 지키는 두 클라이언트 경로를 풀어 씁니다.

경로 A: SSH LocalForward — 브레이크 글래스와 1인 디버깅

SSH 로컬 포트 포워딩은 노트북의 포트를 암호화된 SSH 세션을 통해 원격 호스트 포트에 매핑합니다. 정석은 여전히 ssh -N -L 18789:127.0.0.1:18789 user@canada-host이고, 업그레이드 중 Dashboard 개발 서버가 로컬에서 뜨면 -L 9234:127.0.0.1:9234를 덧붙일 수 있습니다. 노트북에서는 OpenClaw macOS 클라이언트나 브라우저를 http://127.0.0.1:18789(빌드 문서의 HTTPS 변형 포함)로 향하게 하면, 트래픽은 콘솔에 앉은 것처럼 캐나다 Mac의 loopback에서 종료됩니다. 장점: 추가 VPN SKU 없이 대부분의 호텔 Wi‑Fi에서 동작하고, 데몬이 127.0.0.1만 바인딩하면 공인 인터넷에 Gateway가 드러나지 않습니다. 단점: 노트북이 잠자면 터널이 끊기고, ServerAliveInterval 조정이 팀 문화가 되며, 다섯 명이 하나의 터널을 나누려면 바스티온 패턴을 받아들여야 합니다.

태평양 세션을 오래 버티는 SSH 설정

~/.ssh/configHost hashvps-canada-gateway, Hostname, User, IdentityFile, ServerAliveInterval 30, ServerAliveCountMax 6, ExitOnForwardFailure yes를 박아 두면 포워드가 깨졌을 때 반쯤 열린 상태로 남지 않고 빨리 실패합니다. ControlMaster auto는 멀티플렉싱을 이해한 뒤에만 켜세요. Dashboard 정적 자산은 WebSocket 업그레이드를 가정할 수 있으니, 클라이언트 측 기업 HTTP 프록시가 22번은 열어도 그 경로를 깨는지 별도로 적어 둡니다.

경로 B: Tailscale tailnet으로 항상 켜 둔 팀 접속

Tailscaletailnet, 즉 등록된 장치에 안정적인 100.x를 주는 사설 메시를 만듭니다. 캐나다 Mac과 운영자 노트북에 설치하고 관리 콘솔에서 승인한 뒤, 싱가포르에서도 tailscale ip -4로 서버에 직접 닿을 수 있습니다. OpenClaw에서는 보통 여전히 Gateway를 127.0.0.1:18789에 바인딩하고, tailnet 안에서 SSH를 한 겹 더 쓰거나 tailnet IP에서 loopback으로 넘기는 작은 리버스 프록시를 둡니다. 또는 토큰 검증을 강화한 뒤 Gateway를 tailnet IP에 직접 바인딩하기도 하는데, 그때 위협 모델은 “SSH 키를 가진 자”에서 “tailnet 동료 중 침해된 피어” 쪽으로 기울어집니다. 정답은 하나가 아니라서, 아래 대조표를 온보딩 문서에 그대로 붙이는 편이 낫습니다.

재무가 Tailscale과 클라우드 Mac 벤더를 왜 둘 다 쓰냐고 물으면 지원 티켓 감소로 답하세요. tailnet은 NAT 헤어핀 퍼즐을 줄이고, 내부 위키와 맞는 MagicDNS 이름을 주며, 분실 노트북을 몇 초 만에 빼앗을 수 있습니다. 제어 트래픽은 메시를 타도, SaaS 웹훅이 요구하는 고정 출구 IP·채널 쪽 점검은 OpenClaw 2026 원격 Mac Channels 첫 연결·산선 트러블슈팅: install.sh, Gateway 18789, Telegram/Slack, 토큰·터널 자가점검, 로그·디스크, 캐나다 M4 egress의 egress·로그 체크리스트와 한 줄로 맞춰 적어 두면 감사·온콜이 같은 표를 보게 됩니다.

Dashboard와 Gateway 포트
Dashboard UI18789의 Gateway RPC/WebSocket 면은 연관되지만 동일한 배포 단위는 아닐 수 있습니다. 어떤 빌드는 Gateway 옆에서 정적 자산을 서빙하고, 어떤 빌드는 프록시합니다. 역할별로 북마크 URL을 기록하고, 18789/이 마케팅 랜딩이라고 가정하지 마세요.

Dashboard와 18789를 끝에서 끝으로 잇기

먼저 캐나다 호스트 자기 자신에서 curl -fsS http://127.0.0.1:18789/health(문서화된 헬스 경로)를 돌립니다. 노트북을 끼우기 전에 실패하면 Tailscale ACL을 고쳐도 소용없습니다. loopback 헬스가 녹색이면 클라이언트 경로를 쌓습니다. SSH라면 터널이 살아 있는 동안 노트북에서 nc -vz 127.0.0.1 18789로 포워드를 확인하고, Tailscale이면 Mac의 100.x나 MagicDNS 이름에 대해 같은 검사를 반복합니다. 그다음에야 Safari나 Chrome으로 Dashboard URL을 엽니다. Gateway 버전 문자열과 빌드 해시 스크린샷을 변경 로그에 넣으면, 태평양 팀이 사건 채널에 같은 두 줄만 붙여도 디버깅이 빨라집니다.

loopback이 아닌 리스너를 tailnet 직접 접속용으로 노출했다면, 재부팅과 brew upgrade로 Node 런타임이 바뀐 뒤마다 lsof -nP -iTCP:18789 -sTCP:LISTEN을 다시 실행하세요. 리스너가 둘이면 잊은 tmux 안의 수동 openclaw gateway start같은 라벨 패밀리를 쥐려는 LaunchAgent가 동시에 도는 경우가 많습니다. 여분을 끄고 plist 하나로 합쳐야 메트릭과 로그 로테이션이 단일 PID 트리에 붙습니다.

대조: SSH 포워드 vs tailnet 직접 vs loopback 전용 운영

모드 적합한 경우 18789 가시성 운영 주의
SSH LocalForward 온콜 브레이크 글래스, tailnet 좌석 없는 외주 터널을 통해서만 노트북 loopback 노트북 수면과 터널 수명이 묶임; ServerAliveInterval 교육
Tailscale 100.x + loopback 프록시 분산 팀, tailnet 피어에서 오는 CI 100.x(또는 서브넷 라우터의 localhost) 채용마다 ACL 검토; 장치를 역할 태그로 구분
loopback 전용 + 물리 콘솔 업그레이드 안정화 기간의 최대 잠금 캐나다 Mac의 127.0.0.1 수리엔 원격 데스크톱·공급자 시리얼 등 대체 경로 필요
공인 라우팅 바인딩(기본 비권장) VPN 경로 없는 레거시 연동 방화벽 없으면 인터넷 전체 토큰 순환, WAF/IP 허용, 감사 로그 필수

태평양을 가로지르는 gateway.remote.token 거버넌스

대양을 건너는 공유 비밀은 사무실 한 채의 비밀보다 빨리 썩습니다. 노트북이 국경을 넘기고, 슬라이드에 스크린샷이 새며, 외주는 주 단위로 바뀝니다. gateway.remote.token은 프로덕션 DB 비밀번호처럼 다루세요. 회사 금고(1Password, Vault, KMS 뒤 파일)에 두고, 배포 시 plist의 EnvironmentVariables나 데몬이 읽는 설정에 주입하며, 채팅 붙여넣기를 금지합니다. 순환할 때는 토큰 두 개를 겹치는 창을 두고, Gateway가 정의된 시간 동안 둘 다 받게 한 뒤 대륙별로 클라이언트를 갱신하고, 예전 값을 폐기합니다. 레거시 토큰을 뺀 정확한 시각을 문서에 적어 두면 APAC 엔지니어가 조용한 롤백으로 오해하지 않습니다.

LaunchAgent는 macOS에서 GUI 사용자 도메인에서 돌기 때문에, 금고에서보낸 파일은 해당 uid만 읽을 수 있는 경로에 두고, 누구나 읽는 /tmp 드롭은 피합니다. 규정이 팀 토큰 대신 엔지니어당 자격 증명을 요구하면, OpenClaw 빌드가 클라이언트별 키를 지원하는지 평가하고, 애플리케이션 레이어가 여전히 베어러를 검사하더라도 네트워크 레이어에서 role:gateway-client 태그만 18789에 닿게 분리하는 방안을 검토하세요.

Gateway용 LaunchAgent 지속 실행(사용자 도메인)

LaunchAgent는 사용자별 launchd 도메인(gui/$uid)에 로드되며, 임대 Mac의 주 사용자 계정으로 OpenClaw Gateway를 로그인 시점에 띄우되 루트 소유 LaunchDaemons까지 끌고 가지 않을 때 기본값으로 적합합니다. ~/Library/LaunchAgents/com.openclaw.gateway.plist를 만들고, 고유 역 DNS 라벨, ProgramArguments의 절대 경로, PATH와 토큰 키를 위한 명시적 EnvironmentVariables, ~/Library/Logs/ 아래의 StandardOutPath / StandardErrorPath를 넣어 원격 SSH로 tail 할 수 있게 하세요. 수정 후에는 macOS Ventura 이상에서 launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.openclaw.gateway.plist 다음 launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.openclaw.gateway.plist(구 시스템은 unload/load)를 사용합니다. launchctl print gui/$(id -u)/com.openclaw.gateway로 확인하고, 대화형 셸이 아닌 도구와 동일한 환경을 프로세스가 물려받는지 검증하세요. 대화형 터미널은 거짓말을 합니다.

LaunchAgent plist 예시(경로·라벨은 반드시 조정)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.openclaw.gateway</string>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/Users/your-lease-user</string>
  <key>EnvironmentVariables</key>
  <dict>
    <key>PATH</key>
    <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
    <key>OPENCLAW_GATEWAY_TOKEN_FILE</key>
    <string>/Users/your-lease-user/.openclaw/gateway.token</string>
  </dict>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/homebrew/bin/openclaw</string>
    <string>gateway</string>
    <string>start</string>
  </array>
  <key>StandardOutPath</key>
  <string>/Users/your-lease-user/Library/Logs/openclaw-gateway.log</string>
  <key>StandardErrorPath</key>
  <string>/Users/your-lease-user/Library/Logs/openclaw-gateway.err.log</string>
</dict>
</plist>

위 plist는 예시입니다. 실제 which openclaw 경로를 넣고, 설치된 OpenClaw 버전의 서브커맨드와 맞추며, 비밀은 가능하면 루트 또는 사용자 전용 파일에서 읽게 하세요. 공급자가 유지보수로 재부팅해도 RunAtLoad가 Gateway를 다시 올리므로 VNC로 들어가 터미널을 열기를 기다릴 필요가 줄어듭니다. 지리별 CI에서 가벼운 HTTP 합성 점검을 돌려 월요 스탠드업 전에 라우팅 회귀를 잡으세요.

“끝났다”고 말하기 전 검증 매트릭스

점검 명령 또는 동작 합격 기준
loopback 헬스 캐나다 호스트 SSH에서 curl 헬스 URL HTTP 200, 버전 JSON이 릴리스 노트와 일치
단일 리스너 lsof -nP -iTCP:18789 -sTCP:LISTEN 재부팅 후 소유 PID가 정확히 하나
SSH 포워드 경로 포워드 + 노트북에서 nc 2초 안에 TCP 연결 성공, Dashboard 로드
tailnet 경로 100.x 또는 MagicDNS로 ping + 동일 curl TLS 경고를 제외하면 loopback과 동일 행동
LaunchAgent 환경 비로그인 프로브 스크립트로 토큰 파일 존재 출력 경로 읽기 가능, stderr에 Permission denied 없음
토큰 순환 리허설 스테이징 Mac에서 이중 토큰 창 테스트 겹치는 동안 어느 대륙도 접속을 잃지 않음

FAQ

Tailscale이 이미 암호화하는데 왜 18789를 loopback에 두나요?

심층 방어입니다. tailnet 피어 하나가 침해되었을 때 모든 인터페이스에 평문 리스너가 바로 열리지 않게 합니다. loopback과 명시적 프록시 또는 태그된 ACL이 폭발 반경을 줄이고, 대부분의 상류 OpenClaw 예제와도 맞습니다.

macOS “원격 로그인(SSH)”를 영원히 켜 두어야 하나요?

승인된 경로에 SSH 포워드가 있다면 그 워크플로에는 그렇습니다. tailnet 전용 조직은 공급자 방화벽에서 SSH를 막고 Tailscale SSH에만 의지하기도 합니다. 환경마다 문서화된 자세 하나를 고르지, 둘을 무작위로 섞지 마세요.

OpenClaw에는 LaunchAgent와 LaunchDaemon 중 무엇이 맞나요?

LaunchAgent는 로그인한 사용자 세션을 따릅니다. LaunchDaemon은 부팅 초기에 루트로 뜹니다. 임대 계정이 워크스페이스를 소유하고 사람 주 사용자와 같은 Keychain 패턴을 원하면 LaunchAgent가 맞습니다. 기업 정책이 루트 소유 서비스와 중앙 로깅을 요구하면 LaunchDaemon을 검토하세요.

Dashboard는 뜨는데 WebSocket만 실패합니다

리버스 프록시와 기업 SSL 검사를 확인하세요. WebSocket은 종단 간 호환이 필요하고, tailnet 경로가 스플릿 터널 VPN에서 실패하는 경우를 자주 줄여 줍니다. Dashboard가 HTTPS인데 18789가 로컬 HTTP면 혼합 콘텐츠 규칙도 점검합니다.

APAC 엔지니어가 SSH 터널 하나를 나눠 써도 되나요?

안 됩니다. 공용 바스티온이나 tailnet을 쓰세요. 개인 포워드를 공유하면 폐기 비용만 곱해집니다.

토큰 순환 중에 캐나다 Mac이 재부팅되면?

LaunchAgent는 새 토큰 파일로 다시 올라와야 합니다. plist가 옛 환경을 가리키면 Gateway는 종료되고 인증 오류가 로그에 남습니다. 프로덕션에서 자동 재시작이 한 번 성공할 때까지 겹치는 토큰을 유지하세요.

Dashboard를 18789와 다른 포트에 바인딩할 수 있나요?

일부 빌드는 설정 플래그나 환경 변수로 덮어씁니다. 기본값을 바꾸면 런북의 모든 행, 헬스 체크, 보안 스캔 템플릿을 함께 갱신해 팀 절반이 옛 북마크에 남지 않게 하세요.

안정적인 캐나다 메탈에서 이 토폴로지를 돌리기

캐나다에 임대한 Mac mini M4는 OpenClaw와 Xcode 사이드카에 네이티브 macOS와 예측 가능한 Apple Silicon 성능을 주고, 대기 전력이 낮아 LaunchAgent 아래 Gateway를 상시 두어도 게이밍 PC로 옷장을 데우는 느낌이 들지 않습니다. macOS의 Unix 도구, launchd, SSH는 이 글의 운영 모델과 맞고 WSL 같은 예고 없는 깨짐이 적으며, Gatekeeper와 FileVault 친화적 기본값은 임시 Windows 점프 호스트보다 악성코드 표면을 줄입니다.

리전마다 하드웨어를 사지 않고도 같은 SSH·tailnet 워크플로를 쓰고 싶다면 Hashvps 클라우드 Mac mini M4가 실용적인 출발점입니다. 요금·플랜을 확인하고 캐나다 단일 Gateway를 북미 사용자에게 밀리초 단위 지연으로 두기 시작해 보세요.

Hashvps · Mac 클라우드

OpenClaw Gateway와 24시간 제어 경로를 위한 캐나다 M4

SSH·tailnet 이그레스와 장시간 LaunchAgent에 맞는 전용 컴퓨팅과 네이티브 IPv4. 티어 비교와 온보딩은 홈페이지에서 이어서 확인하세요.

홈으로
한정 특가