AI / 자동화 2026년 5월 8일

2026 OpenClaw MCP Node 런타임 불일치: 터미널에서는 nvm이 되는데 임대 ProxyMac Mac mini에서 MCP 하위 프로세스가 ENOENT로 죽는 이유

ProxyMac 엔지니어링 팀 2026년 5월 8일 약 12분 읽기

홍콩, 일본, 한국, 싱가포르, 미국에 퍼진 Mac mini M4 임대에서 커스텀 MCP 서버로 OpenClaw를 배포하는 팀은 /usr/bin/env: node: No such file or directory stderr를 자주 붙여 넣지만 Terminal.app에서는 Node v22가 완벽히 출력됩니다. 범인은 “OpenClaw가 고장”이 아니라 여러 Node 설치가 서로 가리며 그중 launchd가 뒷받침하는 게이트웨이만 물려받는 하나입니다. 이 문서는 (1) 업스트림 스택이 MCP 전송에 최신 Node 의미론을 점점 가정하는 방식, (2) errno 문자열을 수정에 매핑하는 증상 해시 테이블, (3) LaunchAgent 아래에서 nvm 훅이 실행되지 않는 이유, (4) PATH·Homebrew, 환경 변수, 업그레이드 롤백과 짝을 이루는 9단계 감사 사다리, (5) MCP 셸이 pnpm dlx를 호출할 때의 Corepack 모서리 사례를 가르칩니다. 정량 앵커로 Node 22 기능 게이트, 120초 재시작 폭풍, 규제 플릿에서 암시적 dotfile 의존에 대한 제로 관용이 있습니다.

런타임 분할: 대화형 셸과 LaunchAgent 세계

대화형 zsh 세션은 nvm.sh를 기꺼이 소스하고 Homebrew Apple Silicon 경로를 앞에 붙이며 Corepack 심을 노출합니다. launchd는 plist가 추가 경로를 열거하지 않는 한 종종 /usr/bin:/bin:/usr/sbin:/sbin만 가진 희박한 환경으로 OpenClaw를 띄웁니다. MCP 서버는 부모 게이트웨이가 물려받은 것을 그대로 물려받습니다. 그래서 #!/usr/bin/env node 셰뱅은 그 PATH 조각에서 envnode를 찾지 못하면 터집니다.

  • 관측 지표: 터미널과 작은 LaunchAgent 에코 잡에서 node -p process.execPath를 모두 캡처하세요—경로 구성 요소가 하나라도 어긋나면 즉시 plist를 고쳐야 합니다.
  • ABI 실패: arm64 바이너리와 Rosetta 셸을 섞으면 깔끔한 ENOENT 대신 난해한 V8 크래시로 표면화되지만 여전히 런타임 불일치입니다.
  • 병렬 설치: Homebrew /opt/homebrew/bin/node, 수동 pkg, nvm 관리 빌드가 공존할 수 있습니다. 하나만 가리키는 CI 복제 JSON은 다른 곳을 깨뜨립니다.
팁: 클라우드 미니에 배포한 모든 Node tarball에 semver·체크섬이 적힌 텍스트 파일 /etc/proxymac-node.channel을 박아 두면 운영자가 모호한 티켓을 35% 더 빨리 해결합니다.

증상 해시 테이블: MCP 운영자를 위한 errno 문자열

로그 지문유력 원인첫 교정 조치
env: node: No such filePATH에 brew/nvm 접두가 없음절대 PATH 절을 추가하거나 /usr/local/bin 아래에 심링크
Error: Cannot find module 'node:fs'현대 import 맵을 파싱하는 아주 오래된 Node플랫폼 가이던스에 따라 ≥22 LTS 채널로 업그레이드
MCP 워커 내부 MODULE_NOT_FOUND데몬에 NODE_PATH 없음명시적 workingDirectory나 의존성 번들 사용
업그레이드 뒤 spawn EBADF섞인 부분 설치롤백 플레이북으로 되돌리기

nvm.sh를 소스하는 것이 잘못된 프로덕션 계약인 이유

nvm은 Node 다운로드를 셸 함수 뒤로 미룹니다—사람에게는 훌륭하지만 자정 자동화에는 연약합니다. 대신 MCP JSON이 직접 가리키는 하나의 축복받은 인터프리터 경로를 설치하거나 주입 위험을 위협 모델링한 뒤에만 /bin/bash -lc로 감쌉니다. 키체인 가이던스의 비밀 위생과 짝지어 래퍼가 set -x로 토큰을 새지 않게 하세요.

9단계 런타임 감사 사다리

  1. 배포 동결: 진단이 끝날 때까지 CI 머지를 멈춰 launchctl kickstart를 난립하지 않습니다.
  2. 유효 PATH 덤프: LaunchAgent에 잠시 계측해 정렬된 env를 로그(보호된 파일)합니다.
  3. Node 빌드 비교: 양쪽 맥락에서 node -p "[process.version, process.arch]"를 실행합니다.
  4. MCP JSON 정규화: 상대 인터프리터 힌트를 절대 실행 경로로 바꿉니다.
  5. Corepack 맞추기: 패키지 관리자를 고정한 채 전역으로 한 번만 활성화—버전을 문서화합니다.
  6. OpenClaw 업그레이드 교차 확인: 업그레이드 매트릭스를 따릅니다.
  7. JSONL 테일: 로깅 가이드로 stderr 줄을 상관합니다.
  8. ulimit 검증: 거대 모노레포가 간혹 fd를 소진합니다—ulimit을 보세요.
  9. RCA 공개: 영향 리전(HK / JP / KR / SG / US)과 semver 엔드포인트를 기록합니다.
피하세요: plist ProgramArguments에 전체 .zshrc를 집어넣는 것—리뷰어가 보안 회귀를 합리적으로 diff할 수 없습니다.

Corepack, pnpm, 패키지 관리자를 띄우는 MCP 진입점

MCP 정의가 pnpm dlxyarn node를 부를 때 Corepack을 일관되게 켜 두어야 합니다—대화형 셸은 종종 launchd가 보지 못하는 설정 프롬프트를 끝냅니다. 비대화형 플래그를 굽고 서비스 소유 디렉터리 아래에 캐시를 미러링해 HKUS 복제본이 똑같이 동작하게 하세요.

FAQ

도커가 이 고통을 없애나요? 컨테이너는 OS 이미지를 고정해도 Node 베이스 태그는 여전히 고를 테니 같은 semver 규율입니다.

Apple 실리콘이 중요한가요? 예—Intel 노트북에서 빌드한 팻 바이너리는 arm64 미니를 잘못 겨냅니다.

SSH 세션은 어디에 놓이나요? 수동 SSH는 로그인 셸을 물려받고 게이트웨이 프로세스는 그렇지 않습니다—SSH 테스트는 힌트일 뿐 계약이 아닙니다.

엄격한 Node 고정과 맞는 ProxyMac Mac mini

HK / JP / KR / SG / US의 임대 Mac mini M4 호스트는 조달 지연 없이 결정론적 Apple 실리콘 환경을 줍니다—MCP 게이트웨이가 매달 업스트림 Node 속도를 따라야 할 때 이상적입니다. 가격 페이지의 하드웨어 임대와 도움말의 운영 문서를 짝지으세요. GUI 설치 프로그램이 대화형으로 Gatekeeper 프롬프트를 눌러야 하면 VNC를 쓰세요.

축복받은 Node 하나로 MCP 배포

OpenClaw · MCP · HK / JP / KR / SG / US