OpenClaw 게이트웨이를 임대한 클라우드 Mac mini에 두면 Apple Silicon을 한 번에 사지 않고도 진짜 macOS 서비스에 가까이 갈 수 있다. 비용 감각은 하루 약 16.9달러 선에서 잡기 쉽다. 함정은 기계를 버려도 되는 Linux VPS처럼 다루는 태도다. 여러 운영자, 자동화 계정, 벤더의 「골든 이미지」가 보이지 않는 곳에서 겹친다. 이 글은 멀티테넌트 위생에 초점을 맞춘다: ~/.openclaw 또는 OPENCLAW_HOME 분리, 게이트웨이마다 고유한 LaunchAgent Label, 템플릿에서 비롯된 UID 클론 대응, TCP·UNIX 소켓 충돌 방지, 환경 변수와 키체인에 비밀을 나누는 법. 최초 구축은 게이트웨이 온보딩과 TCC와 함께 읽고, 업그레이드 뒤 작업이 어긋나면 LaunchAgent 복구와 재시작으로 맞춘다.
공유 게이트웨이 위험 지도
공유 호스트는 세 가지 실패 모드를 키운다. 상태 누설(세션이 서로 설정을 덮어씀), 스케줄러 혼선(중복된 launchd 라벨), 정체성 표류(클론 이미지가 같은 숫자 UID를 재사용하고 plist 경로는 그럴듯하지만 다른 사람을 가리킴). 아래 표는 위험과 완화를 짝지은다. 누군가 openclaw gateway install을 돌리기 전에 운영에 박아 넣는다.
| 위험 | 증상 | 완화 |
|---|---|---|
| 기본 설정 루트 공유 | SQLite 잠금, 자격 증명 혼합, 원인 불명 크래시 | 각자 OPENCLAW_HOME을 ~/Users/<짧은이름> 아래로 고정 |
| LaunchAgent Label 중복 | 실제로 도는 작업은 하나뿐 | 테넌트 접두사를 붙여 com.acme.openclaw.gateway.alice처럼 |
| 이미지 UID 클론 | plist가 /Users/build 같은 템플릿 사용자를 가리킴 | 오래된 작업 bootout 후 실사용자 첫 로그인 뒤 재설치 |
| TCP·UNIX 엔드포인트 겹침 | EADDRINUSE, 헬스 체크 깜빡임, 에이전트 재시도 루프 | 좌석마다 18789–18809 같은 블록 할당 |
| 전 세계 읽기 가능한 키 파일 | 한 번의 cat으로 SSH 세션 간 유출 | 장기 토큰은 키체인, 환경 스텁은 chmod 600 |
첫 통합 검증에는 30–45분을 잡는다: 게이트웨이 기동, 에이전트 연결, TCC 프롬프트 완료, 재부팅 뒤 자가 복구까지 한 번에 확인한다. 리허설을 건너뛰면 「내 노트북에서는 됐다」가 두 번째 계약자가 같은 mini에 들어오는 순간 야간 장애로 바뀐다.
운영자별 OPENCLAW_HOME
개인 Mac에서는 ~/.openclaw로 충분하다. 임대 공유에서는 덫이다. mkdir -p ~/.openclaw-alice처럼 디렉터리를 만들고 install·doctor보다 앞서 그 사용자의 셸 설정에서 OPENCLAW_HOME을 export한다. 경로는 내부 위키에 적어 온콜이 물결표를 모두 같은 뜻으로 오해하지 않게 한다.
그룹 ACL로 한 트리를 공유하지 않는 편이 낫다. 게이트웨이는 인증된 기기 메타데이터·로컬 캐시·단일 작성자를 가정한 IPC를 섞는다. POSIX 그룹은 논리 테넌시를 대체하지 못하고, 두 게이트웨이가 동시에 $OPENCLAW_HOME/tmp에서 UNIX 소켓을 bind하려 할 때만 지연을 준다. 백업을 모으려면 접두사별 tarball을 객체 스토리지로 보내고 한 번의 rsync 병합은 피한다.
자동화 계정도 테넌트다. CI 사용자가 헬스 체크를 돌린다면 OPENCLAW_HOME=/var/lib/openclaw-ci(소유권 올바르게)를 주고 사람 트리에 기생시키지 않는다. 감사에서 「어느 트리가 그 API 키를 가졌는가」에 바로 답할 수 있어야 한다.
데모 계정과 운영 계정의 OPENCLAW_HOME을 섞지 않는다. 캠페인용 단명 토큰이 공유 SQLite에 남으면 다음 임차인이 의도치 않게 이력을 읽는다. 체크리스트에 따라 디렉터리를 물리 삭제하거나 안전하게 지운다.
LaunchAgent Label과 경로
macOS는 Label로 LaunchAgent를 식별한다. 충돌은 정의되지 않은 동작을 부르고, 두 번째 plist는 Console 경고만 남기고 방치되기 쉽다. 역 DNS로 팀과 좌석을 박는다: com.yourorg.openclaw.gateway.designer1. 파일 이름도 라벨에 맞춰 사고 때 grep을 짧게 한다.
ProgramArguments는 그 사용자의 실제 툴체인(npm 전역, brew, 고정 tarball)에 맞는 절대 경로로 둔다. 벤더 소소 macOS 업데이트 뒤 바이너리 경로가 기대와 같은지 다시 본다. Homebrew Cellar 재배치는 심볼릭 링크를 조용히 바꾼다. 편집은 launchctl bootout → 파일 교체 → bootstrap 순이 안전하고, bootout 없는 핫스왑은 좀비 상태를 남겨 진짜 원인을 가린다.
StandardOutPath와 StandardErrorPath는 각 OPENCLAW_HOME 아래 로그로 보낸다. 공유 /tmp/openclaw.log는 chmod 다툼과 디버그 로깅 시 토큰 유출 위험을 만든다. 테넌트별 로테이션은 컴플라이언스 질의에서도 「누가 재시작했는지」를 보여 준다.
한 사용자가 카나리아와 안정판 두 게이트웨이를 쓴다면 Label과 OPENCLAW_HOME을 이중으로 갖추고 당번 런북에 라벨·포트 대역·로그 경로·담당자를 표로 적는다.
UID 클론과 이미지 리셋
클라우드 Mac 벤더는 종종 동결 이미지를 주고 템플릿 사용자가 /Users/build나 /Users/macuser를 UID 501로 쥔 채 남긴다. 새 임차인에게 클론할 때 ~/Library/LaunchAgents와 그 UID의 부트스트랩 영역을 분명히 비우지 않으면 launchd는 템플릿 계정에 등록된 작업을 다시 읽는다. 반드시 운영 사용자로 로그인해 id -u를 받고 launchctl print gui/$(id -u)에 자기 라벨만 있는지 확인한다.
호스트 이름만 바꾸고 홈을 정리하지 않은 채 짧은 이름을 재사용하지 않는다. 이전 이벤트의 com.vendor.openclaw가 스냅샷에 남아 재부팅 때 살아날 수 있다. 아래 번호 체크리스트의 bootout은 선택이 아니다.
드물게 가상화 스택 오류 이전으로 두 사람 계정이 같은 UID를 공유한다. 권한 손질로는 구하지 못하고 OpenClaw는 잘못된 키체인 항목을 읽는다. 벤더에 에스컬레이션하고, 일상적으로는 구독마다 로컬 계정 고유성을 보장하는 업체를 고른다.
글로벌 팀은 일광절약·타임존 전환이 cron·LaunchAgent 창을 밀어 「어젯밤까지 됐다」 착각을 만든다. 유지보수 창을 UTC로 고정하고 plist의 StartCalendarInterval에 명시한다.
포트와 소켓 충돌
TCP 리스너와 UNIX 도메인 소켓이 가장 시끄러운 충돌면이다. 운영자마다 문서화된 포트 대역을 할당한다——예: Alice 18789–18799, Bob 18800–18810——매핑을 인프라 저장소에 둔다. OpenClaw나 인접 프록시가 기본값을 잡을 때 설정으로 덮어 재시작 경쟁에서 이웃 포트를 빼앗지 않게 한다.
UNIX 소켓은 OPENCLAW_HOME/run 또는 tmp 아래에 두고 전역 /tmp/openclaw.sock은 피한다. 비정상 종료 뒤 오래된 소켓 파일이 남을 수 있다. 시작 스크립트는 알려진 경로를 unlink하거나 분명히 실패시키고 반쯤 bind는 남기지 않는다. 같은 mini에 nginx·Caddy가 있으면 /opt/tenants/<name>로 테넌트별 설정을 나누어 의도치 않은 include 병합을 막는다.
외부 에이전트 헬스 체크는 테넌트 포트를 명시한다. 「localhost:gateway」 일반론은 두 게이트웨이 공존에서 무너진다. 헬스 URL을 OPENCLAW_HOME과 같은 줄에 적어 Slack에서 .env를 잘못 복사하지 않게 한다.
Tailscale·WireGuard를 쓰면 가상 IP와 포트 대역을 사내 DNS에 등록해 두 사람이 같은 루프백 번호를 다른 터널에 향하는 위양성을 피한다.
환경 변수와 키체인
환경 변수는 일찍 로드되고 비대화형 SSH에 잘 맞으며 12요소와도 잘 맞는다. 다만 공유 Mac에서 chmod 600를 잊으면 도트파일이 전 세계 읽기가 될 수 있다. 여러 관리자가 동시에 ps eww를 치면 기동 직후 환경이 잠깐 노출된다는 점도 주의한다.
macOS 키체인은 로그인 사용자에 비밀을 묶고 UNIX 권한이 건전하면 테넌트 간 읽기를 일으키기 어렵다. LaunchAgent로 기동한 게이트웨이는 GUI 세션 잠금 해제 뒤 키체인을 이어받는다. 헤드리스는 최초 잠금 해제 절차를 TCC 문서와 나란히 둔다. 단명 CI 토큰은 시크릿 매니저에서 환경 주입으로 aggressive 로테이션하고 공유 .zshrc에는 쓰지 않는다.
실무 정책: 장기 개인 API 키는 운영자마다 키체인 항목. 단명 자동화 키는 자동화 plist의 EnvironmentVariables에 쓰고 plist 자체 chmod 0400. 브레이크글래스 마스터는 오프라인 보관, 임대 디스크에 두지 않는다. 분기마다 재검토한다. OpenClaw 비밀 표면은 릴리스마다 변한다.
Git으로 인프라를 관리하면 sops 등으로 암호화한 뒤 push한다. .env.example은 자리 표시자만 두고 테스트라도 실제 접두사를 올리지 않는다.
오프보딩 전 번호 매긴 체크리스트
클라우드 mini를 반납하거나 다시 이미지화하기 전에 다른 엔지니어가 지켜보는 가운데 실행한다——몰래 혼자 하지 않는다.
- 증거보내기:
OPENCLAW_HOME, plist 사본, 최근 24시간 로그를 암호 저장소로 tarball. CLI·게이트웨이 버전도 기록. - 자격 증명 폐기: OpenClaw 관련 API 키와 OAuth 리프레시를 순환하고 IdP에서 옛 식별자 무효화.
- LaunchAgent bootout: 각 테넌트 라벨에
launchctl bootout gui/$UID ~/Library/LaunchAgents/<파일>.plist실행 후launchctl print로 확인. - plist 파일 삭제:
~/Library/LaunchAgents에서 OpenClaw 항목을 제거해 클론 부활 방지. - 설정 루트 비우기: 정책에 따라 각
OPENCLAW_HOME을 shred하거나 볼륨 안전 삭제. - 키체인 정리: OpenClaw 관련 항목 삭제, 검색 히트 없음 확인.
- 포트 해제: 할당 블록에 리스너가 남지 않았는지 확인하고 해제 기록을 다음 임차인에게 전달.
- 공유 환경 조각 제거: 셸 프로필,
/etc/paths.d주입, 옛 홈을 가리키는 CI crontab 정리. - TCC 점검: 남은 프라이버시 승인을 기록. 다음 테넌트가 카메라·마이크·자동화 동의를 물려받아선 안 되면 리셋.
- 벤더 티켓: 증거 tarball 체크섬과 「우리 조직 LaunchAgent 라벨이 0건」 선언을 첨부.
어느 한 단계라도 실패하면 손을 멈춘다. 반쯤 지운 것은 반납 지연보다 나쁘다——유령 상태를 다음 고객에게 넘겨 격리 목적을 깨뜨린다.
FAQ
두 엔지니어가 같은 클라우드 Mac mini에서 ~/.openclaw를 안전하게 공유할 수 있나요?
아니요. 런타임 DB·기기 신뢰·세션 캐시가 섞이고 동일 소켓과 TCC 승인을 다툽니다. 각자 홈 아래에 OPENCLAW_HOME을 두세요.
공급자 클론 이미지가 오프보딩 뒤 LaunchAgent를 망가뜨리는 이유는?
골든 이미지는 동일한 숫자 UID와 남은 plist 경로를 자주 가집니다. launchd가 다른 테넌트 라벨을 되살리거나 Program이 삭제된 사용자를 가리킬 수 있습니다. 반드시 bootout하고 LaunchAgents를 정리한 뒤 활성 계정에서 재설치하세요.
OpenClaw API 키는 환경 파일과 macOS 키체인 중 어디에 두나요?
공유 호스트에서는 장기 개인 토큰은 키체인, 시간 단위로 도는 CI식 주입은 일반 환경 파일에 두세요. 테넌트별 권한 없이 공유 디스크에 커밋하지 마세요.
진짜 macOS 동작이 필요한 OpenClaw 게이트웨이에 Mac mini는 여전히 실용적인 거점이다. MacHTML은 SSH·VNC가 있는 클라우드 Mac mini를 임대해 하드웨어 CapEx 없이 격리 전략·LaunchAgent 위생·깨끗한 인수인계를 연습하게 한다. macOS가 필요한 프로젝트 동안만 켜 두고 전용 장비로 옮기면 전원을 내리면 된다.
클라우드 Mac에서 격리된 OpenClaw
실제 Apple Silicon에서 멀티테넌트 게이트웨이 위생을 연습: 독립 홈, 고유 라벨, 임차 종료 전 검증 가능한 제로화 절차.