2026 OpenClaw MeshMac 실전: 다중 노드 환경 변수 템플릿·시크릿 분환경 주입(dev/staging/prod)
다중 노드 오케스트레이션 팀은 OpenClaw·MeshMac에서 종종 “같은 스택인데 한 노드만 키가 다르다”는 사고를 겪습니다. 본문은 환경 변수 단일 템플릿 배포와 시크릿 격리(dev/staging/prod)를 재현 가능한 단계·표·체크리스트로 묶습니다. OpenClaw 허브, 스킬 락·환경 템플릿, 최소 권한 시크릿과 함께 보세요.
왜 드리프트가 나는가
- 템플릿 이중화: 노드마다 수동
export가 쌓이면 동일 이미지도 결과가 갈립니다. - 시크릿 과잉 공유: 한 파일에 prod 키까지 넣으면 스테이징이 프로덕션을 건드릴 수 있습니다.
- 감사 공백: 누가 언제 렌더했는지 없으면 롤백·컴플라이언스 대응이 느립니다.
환경별 결정 매트릭스
| 항목 | dev | staging | prod |
|---|---|---|---|
| 템플릿 소스 | Git 단일 openclaw.env.tpl |
동일 리비전 고정 | 태그·서명된 번들만 |
| 시크릿 저장 | 로컬 금고·짧은 TTL | 팀 금고·읽기 전용 토큰 | HSM/금고·이중 승인 |
| 파일 퍼미션 | 600·단일 유저 |
서비스 계정만 | 마운트 ro·감사 로그 |
노드 공통 설치 흐름은 클러스터 설치·설정 동기화 가이드와 맞춥니다.
HowTo 단계·검증
① 저장소 레이아웃·슬롯
단일 템플릿과 환경 슬롯만 Git에 둡니다.
mkdir -p deploy/templates
cat > deploy/templates/openclaw.env.tpl <<'EOF'
MESH_ENV={{MESH_ENV}}
MESH_NODE_ID={{MESH_NODE_ID}}
OPENCLAW_QUEUE_URL={{OPENCLAW_QUEUE_URL}}
API_TOKEN={{API_TOKEN}}
EOF
검증
grep -E '^\{\{[A-Z0-9_]+\}\}$' deploy/templates/openclaw.env.tpl || echo "OK: 플레이스홀더만 존재"
② 금고에서 렌더·최소 권한
환경별 시크릿 경로를 분리하고 렌더 산출물은 좁게 둡니다.
export MESH_ENV=staging
vault kv get -field=api_token secret/openclaw/${MESH_ENV} > /run/openclaw/.api_token
envsubst < deploy/templates/openclaw.env.tpl > /etc/openclaw/env
chmod 600 /etc/openclaw/env /run/openclaw/.api_token
chown openclaw:openclaw /etc/openclaw/env
검증
stat -f "%Sp %Su" /etc/openclaw/env | grep '^-rw------- openclaw'
③ 노드 오버레이
역할·디스크 차이만 YAML로 덮습니다.
cat > /etc/meshmac/node.yaml <<'EOF' node_id: mac-worker-03 disk_cache_gb: 120 ingress_bind: "127.0.0.1:8443" EOF
검증
yq '.node_id' /etc/meshmac/node.yaml | grep -q 'mac-worker'
④ 캐너리·롤백
한 노드에서 헬스 통과 후 확장하고 실패 시 Git 리비전을 되돌립니다.
git tag deploy/openclaw-env-$(date +%Y%m%d%H%M) # 문제 시 git checkout deploy/openclaw-env-이전태그 -- deploy/templates/openclaw.env.tpl ./scripts/render-env.sh staging && sudo systemctl restart openclaw
검증
curl -sf http://127.0.0.1:8080/healthz | jq -e '.ok==true'
⑤ 감사·추적
렌더·접근 이벤트에 템플릿 리비전·노드 ID를 남깁니다.
logger -t openclaw-env "render template_rev=${GIT_SHA} env=${MESH_ENV} node=${MESH_NODE_ID}"
grep openclaw-env /var/log/system.log | tail -n 5
검증
grep openclaw-env /var/log/system.log | grep -q "template_rev="
운영 체크리스트
- ☐Git 템플릿에 리터럴 시크릿 없음(
git secrets·CI 스캔) - ☐prod 키는 prod 노드 마운트에만 존재·읽기 전용
- ☐노드 오버레이에 비밀이 없고 구조적 차이만 포함
- ☐롤백 태그·런북 링크가 팀 위키에 고정
- ☐감사 로그 보존 기간(예: 90일) 합의
인용 가능 기준
- 렌더 산출 env 파일 권한: 600·소유 서비스 계정 단일.
- 캐너리: 전체 노드의 10~20% 또는 최소 1대에서 스모크 후 확장.
- 템플릿 변수명: 대문자 스네이크·누락 시 기동 실패가 나도록 설계.