캐나다에 임대한 Mac mini M4에 OpenClaw를 올린 뒤에는 단순한 취향 문제가 아닙니다. 로컬 Gateway(TCP 18789)에 SSH 터널로 닿을지, 호스트를 작은 엣지 노드처럼 두고 공급자가 안내하는 URL로 직접 붙을지에 따라 방화벽 규칙, gateway.remote.token 보관 방식, launchd가 PATH를 얼마나 풍부히 물려줘야 하는지, 그리고 현지 새벽 3시에 로그에 무엇이 찍히는지까지 갈립니다. 이 글은 의사결정 요약, 단계별 런북, 증상 대조표를 한 번에 팀 위키에 붙여 넣기 좋게 정리했습니다. 온보딩·doctor 전체 흐름은 OpenClaw 2026 원격 Mac 설치·배포와 트러블슈팅: openclaw onboard, Gateway 데몬과 캐나다 M4 자원 계획과 함께 보세요.
SSH 터널이 유리한 경우와 직접 Gateway가 유리한 경우
SSH 로컬 포트 포워드(예: ssh -L 18789:127.0.0.1:18789 user@canada-mac)는 서버 쪽 Gateway를 루프백에 묶은 채 노트북은 localhost:18789로 말하게 합니다. 1인 운용, 짧은 디버깅, 에이전트 포트를 라우팅 가능 인터페이스에 노출하면 안 되는 정책에 맞습니다. 대신 운영 부담이 있습니다. 터널은 SSH 세션과 함께 끊기고, 재연결이 헬스체크와 레이스를 일으키며, SSH 자체가 안정적이어야 합니다. 그래서 팀 런북에서는 터널 워크플로와 더 넓은 SSH/VNC 예산을 2026 원격 Mac 팀 예산·성능: 캐나다 노드·SSH/VNC·M4에서 함께 짜는 경우가 많습니다.
직접 Gateway는 제어 플레인이나 다른 서비스가 SSH로 감싸지 않고 Mac의 Gateway 엔드포인트를 부릅니다. 보통 18789 앞 TLS 역프록시, 또는 공급자 관리 경로입니다. 상시 에이전트, 다중 클라이언트, 대화형 셸을 열어둘 수 없는 자동화에 더 잘 맞습니다. 동시에 인프라 관점이 강해집니다. 고정 이그레스 기대, 장비가 물리 네이티브 IP: Mac 클라우드에서도 ‘1기기 1주소’가 필요한 이유에 맞는 허용 목록용 주소인지, 개발자 노트북이 꺼져도 돌아가는 토큰 순환인지까지 문서화해야 합니다.
launchd가 프로세스를 소유하고 7×24 클라이언트가 필요해지면 직접 Gateway + 적절한 토큰으로 옮기세요.
gateway.remote.token과 반드시 둘 위치
현행 OpenClaw 구성에서 gateway.remote.token(또는 온보딩된 프로필의 동등 키)은 원격 클라이언트와 Gateway 사이의 공유 비밀입니다. Gateway를 실행하는 사용자 맥락—보통 openclaw onboard를 완료한 계정—과 동일하게 읽혀야 하며, 대화형 셸 프로필에만 있어서는 안 됩니다. 데몬이 읽는 설정 파일에 두거나, 보안 모델이 허용하면 plist의 EnvironmentVariables에서보내세요. 변경 뒤에는 비로그인 프로브(예: launchctl로 짧게 호출하는 스크립트)로 프로세스가 변수를 실제로 보는지 확인하세요. 대화형 SSH만 성공하는 것은 plist 환경 누락을 가릴 수 있습니다.
포트 18789: 바인드 주소, 방화벽, 이중 리스너
많은 빌드는 원격 접속을 명시적으로 넓히기 전까지 Gateway를 127.0.0.1:18789에 둡니다. 터널 우선 구성에는 맞습니다. 직접 접속으로 바꾸면 리스너를 역프록시 뒤 루프백에 둘지 LAN 주소로 옮길지 문서화하세요. 재부팅·업그레이드 후 lsof -iTCP:18789 -sTCP:LISTEN을 실행합니다. 프로세스가 두 개면 openclaw gateway stop으로 중복을 멈추고, 오래된 LaunchAgent를 제거한 뒤 plist 하나만 다시 켜 헬스체크 요동을 막습니다.
PATH와 launchd: 헤드리스 Mac 단계별
launchd 작업은 최소 환경만 물려줍니다. Terminal.app에서와 같이 openclaw가 해석되지 않을 수 있습니다. 캐나다 호스트에서 아래 순서를 권장합니다.
1) 데몬 사용자와 동일한 SSH 세션에서 which openclaw로 CLI 절대 경로를 확인합니다.
2) LaunchAgent plist의 ProgramArguments에는 셸 래퍼 대신 바이너리 절대 경로를 우선합니다.
3) /bin/zsh -lc로 감쌀 경우 명령 문자열에 PATH 접두를 넣습니다. 예: PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin;/opt/homebrew/bin/openclaw gateway start처럼 Node와 보조 도구를 ~/.zshrc 없이 찾게 합니다.
4) launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/your.openclaw.gateway.plist로 로드(패턴이 다르면 도메인 조정)한 뒤, launchctl print gui/$(id -u)/your.label에서 실행 중인지 확인합니다.
5) 빌드 문서의 로그 경로를 tail하면서 클라이언트 요청을 한 번 보냅니다. 공개 인터페이스로 리스너를 넓히기 전에 PATH·토큰 오류를 먼저 정리합니다.
ssh -N -L 18789:127.0.0.1:18789 -i ~/.ssh/id_ed25519 [email protected]
스펙·디스크·RAM을 Gateway 모드에 맞추려면 2026 캐나다 원격 Mac M4 심층 분석: 24GB RAM 및 1TB 확장의 실전 가치를 참고하세요.
증상 → 원인 → 조치 대조표
| 증상 | 가능한 원인 | 우선 조치 |
|---|---|---|
| SSH 셸에서는 되는데 재부팅 후 실패 | PATH나 토큰이 대화형 프로필에만 있음 | 절대 경로 + plist EnvironmentVariables; LaunchAgent 재로드 |
| 터널은 살아 있는데 클라이언트가 끊김 | SSH 유휴 타임아웃 또는 TCP keepalive 부재 | SSH 설정에 ServerAliveInterval; 또는 직접 Gateway로 이전 |
| 직접 모드: Gateway 401 | gateway.remote.token 불일치 또는 잘못된 헤더 |
클라이언트·서버 설정의 토큰 정렬; 유출 시 순환 |
18789에서 EADDRINUSE |
중복 gateway 또는 남은 Node 프로세스 | openclaw gateway stop; lsof; 중복 plist 제거 |
| 공인 IP에서 connection refused | 리스너가 여전히 127.0.0.1 전용 | 역프록시 추가 또는 공급자 문서에 맞게 바인드 조정; 무분별한 raw 포트 노출 금지 |
한 줄로 정리
2026 OpenClaw를 캐나다에 두었다면, 127.0.0.1:18789로 안전한 임시 파이프가 필요할 때는 SSH 터널을 쓰고, 자동화가 절전·재부팅·다중 호출자를 견뎌야 할 때는 토큰과 네트워크 정책을 명시한 직접 Gateway로 옮기세요. gateway.remote.token은 launchd와 같은 맥락에 넣고, PATH는 단순·절대 경로로 고정하며, 위 대조표를 온콜 런북 첫 페이지로 두면 야간 대응이 빨라집니다.