배포 가이드 2026-04-22 10 분

2026년 OpenClaw 인바운드 채널 거버넌스: Slack/Discord DM 페어링·groupPolicy·원격 물리 Mac 재현 Runbook—미수신·페어링 만료·채널·대화 모델 덮어쓰기 트리아지 (openclaw.json 조각 + FAQ)

ZoneMac 원격 물리 MacOpenClaw를 쓰는 팀이 SlackDiscord를 같이 쓰려면 인바운드 한 줄에 DM 페어링(인간·정책 주체 바인딩), 멀티파티는 groupPolicy, 비용·지연은 대화·채널별 모델 오버라이드로 맞춰야 합니다. 사용자에게는 무반응, 페어링 만료, 특정 스레드만 다른 모델처럼 보이는 사고에 대한 의사결정 표, 붙여 넣을 수 있는 openclaw.json 뼈대, 7단계 런북, 검증 수치, FAQ를 정리했습니다. 게이트웨이 전반이 궁금하면 다채널 doctor·Telegram/Discord 런북(2026), 롱 폴링/웹훅·역프록시 흐름은 OpenClaw 텔레그램(HTTPS·409/TLS) Runbook과 짝을 이루면 읽기 쉽습니다.

2026 OpenClaw Slack Discord DM 페어링과 groupPolicy 원격 물리 Mac

1. 범위·한 줄 요약

DM 페어링(페어링 코드·OAuth)은 “이 사용자가 봇/도구/시크릿이 돌기 전에 사적인 대화에 대한 정당한 주체인가”를 증명하는 단계입니다. groupPolicy는 다자 공간(채널·스레드·길드) allowlist—열거된 id만 도구·고비용 모델을 씁니다. 헤드리스 물리 Mac에서는 밴더 UI는 정상인데 OpenClaw만 무반응이 되는 경우가 많고, 흔한 원인은 서명/URL 불일치, 미완료·만료된 페어링, 누락된 의도·이벤트, 정책(모델 선행 포함) 드롭입니다.

이 글은 openclaw.json을 백업·편집·재적재할 수 있다는 전제입니다. openclaw update·채널 전환·7×24 doctor는 배포 런북에서 별도로 잠그면 됩니다.

2. “아무 일도 없음”이 되는 이유(세 가지)

  1. 채팅 “전달”을 곧 “앱이 처리”로 착각하는 경우. 밴더가 200을 주어도 서명·엔드포인트·중복 앱 URL 때문에 이벤트는 도달하지 않을 수 있습니다. 검증 가능한 HMAC(또는 동등) + 공개 엣지에 능동 앱 URL 하나가 있어야 합니다.
  2. DM을 페어링 없이 “허용”된 것으로 보는 경우. user id내부 정책 주체를 매핑하려는 목적이 있습니다. 워크스페이스 재설치·봇 퇴장·만료 코드면 게이트웨이가 드롭·no-op하는 것이 맞을 수 있습니다.
  3. groupPolicy와 모델 매트릭스의 상호작용 누락. 채널이 대화용으로는 허용돼도 엄한 모델 정책이 가벼운 프로필로 라우팅하면, 운영자는 “거절”이 아니라 엉뚱한 모델로 인지합니다. 선행 규칙(우선순위)과 id별 명시적 오버라이드가 있어야 합니다.

3. Slack vs Discord: 동일 Mac 게이트웨이에 쓰는 기본값(표)

원격 물리 Mac 노드에 하나의 OpenClaw를 둘 때, 표면(Events API·Gateway) 차이에 맞게 기본값을 고릅니다.

차원 Slack Discord
정체·엔터프라이즈 가드레일 워크스페이스+앱 모델, 감사·승인 경로 서버(길드) 모델, 의도·권한 비트를 정확히
DM·스레드 이벤트·앱 멘션이 잘 정의돼 있음 스레드 id·Gateway·MESSAGE_CONTENT에 유의
페어·바인딩 슬래시·봇 DM 등 운영 패턴 다양 자주 OAuth+DM·user id 스노우플레이크
ZoneMac 기본 태도 이미 Slack 쓰는 사내팀 커뮤니티·개발자 Discord 위주

4. openclaw.json 조각(참고용·예시)

구조적 예시뿐이며, 키 이름·깊이는 사용 중인 OpenClaw 빌드에 맞춥니다. 프로덕션에서는 SecretRef·환경 간접, 기존 gateway와 병합, 적용 전 백업을 권장합니다.

4.1 Slack: 서명 + DM 페어 + groupPolicy

{
  "channels": {
    "slack": {
      "enabled": true,
      "appIdRef": "env:SLACK_APP_ID",
      "clientIdRef": "env:SLACK_CLIENT_ID",
      "clientSecretRef": "env:SLACK_CLIENT_SECRET",
      "botTokenRef": "env:SLACK_BOT_TOKEN",
      "signingSecretRef": "env:SLACK_SIGNING_SECRET",
      "inbound": {
        "urlPath": "/openclaw/slack/events",
        "verifyRequestSigning": true
      },
      "dmPairing": {
        "mode": "inline-code",
        "codeTtlMinutes": 15,
        "requireNewPairingOnWorkspaceReinstall": true
      },
      "groupPolicy": {
        "default": "deny",
        "allowChannelIds": ["C0123456789"],
        "allowThreadOnlyChannelIds": []
      },
      "modelByConversation": {
        "C0123456789": "anthropic:claude-3-5-sonnet",
        "DMBIND:U0ABCDEF": "openai:gpt-4.1-mini"
      }
    }
  }
}

4.2 Discord: 봇 토큰·의도·allowlist

{
  "channels": {
    "discord": {
      "enabled": true,
      "botTokenRef": "env:DISCORD_BOT_TOKEN",
      "applicationIdRef": "env:DISCORD_APP_ID",
      "gateway": {
        "intents": ["GUILDS", "GUILD_MESSAGES", "DIRECT_MESSAGES", "MESSAGE_CONTENT"]
      },
      "groupPolicy": {
        "default": "deny",
        "allowGuildIds": ["9876543210"],
        "allowChannelIds": ["111122223333444455"]
      },
      "dmPairing": {
        "mode": "dm-code",
        "codeTtlMinutes": 15
      }
    }
  }
}

codeTtlMinutes는 실제로 사용자에게 보여주는 복사와 맞출 것—pairing expired를 보이기 전에 안내·시계(NTP)부터. modelByConversation 키는 정규화된 채널·DM·스레드 id에 맞추고, 같은 id를 맞춤법만 바꿔 두 번 넣지 마세요. 상위 라우터(강등·fail-over)의 규칙과 채널 정책이 겹치면 층을 맞춰 “서로 싸우지” 않게 하세요(동일 시리즈: 다모델 fail-over 런북).

5. 7단계 런북(원격 물리 Mac)

  1. 설정 스냅샷·얼리기. cp openclaw.json openclaw.json.bak.$(date +%Y%m%d%H%M), OpenClaw 빌드 id·채팅 앱 id를 티켓에.
  2. 이 Mac이 소유한 공개 인입 증명. 인터넷에서 콜백/챌린지 URL을 두드려, 역프록시가 게이트웨이가 바인한 루프백(예: 127.0.0.1:18789)으로 전달되는지.
  3. 서명·시크릿 합의. Slack 요청 서명, Discord는 의도+권한. 틀린 시크릿 한 줄이 “사용자 눈에는 침묵”과 같이 보이기 쉬움.
  4. DM 페어링 완료(또는 재실행). 코드 재발급, 로컬 저장소가 있으면 와이프 전 백업. info 로그·바인딩 테이블에 id가 뜨는지.
  5. groupPolicy를 죽인 뒤 test deny→allow. 신규는 default: deny로 시작, 알고 있는 채널 id 하나씩.
  6. 모델 오버라이드 선행. 같은 문장을 DM·채널에 보내 서로 다른 업스트림 프로필이 켜지는지—아니면 키(id)가 틀림.
  7. 지표+감사에 넘김. allowlist, 페어링 TTL, vhost, 롤백을 다음 온콜이 스크린샷 없이 읽을 수 있게.

6. 트리아지: 침묵·만료·엉뚱한 모델

증상 흔한 원인 첫 조치
사용자에게는 무반응 잘못된 서명·urlPath·groupPolicy deny·채널에 봇 미초대 HMAC·콜백·allowlist id 재검, 봇 재초대, 게이트웨이·프록시 4xx 비율
“pairing expired” TTL < 사람·승인 루프, 시계 어긋남, 링크 재사용 Mac sntp/NTP, 코드 재발·UX 문구, TTL 늘리기는 위협 검토 후
응답은 있는데 모델·툴이 “틀리다” 해석된 대화 id와 modelByConversation 키 불일치, 라우터 강등이 가림 로그에 정규화 id를 남기고 키와 비교, 라우터·채널 정책 이중 정의 정리

7. 인용·체크리스트(숫자로 남기기 좋은 것)

  • 페어링 코드 TTL(예): 본문 조각은 15분—SLO·위협 모델에 맞게 조정하되, OpenClaw 버전 번호 옆에 변경 이력을.
  • groupPolicy default deny: 2026 기선으로 도구 가능 봇에 "deny" 기본, allowlist는 작은 덩어리로.
  • 로컬 리스닝: 게이트웨이를 127.0.0.1에 붙이고 TLS·인증을 엣지에서 끝내면, ZoneMac식 SSH+역프록시에서 호스트 측 노출이 줄어듦.

8. FAQ

Q: DM이 밴더에는 닿는데 OpenClaw만 조용하다.
서명 불일치, “보낸 느낌” 이벤트가 아닌 이벤트, 미페어 DM, 최근 시크릿 로테이션(엣지 200+내부 거절)을 봅니다. raw body로 검증과 env를 맞추세요.

Q: 바쁜 사용자는 TTL 늘리기가 답인가.
때로는—하지만 안내보다 시계·원탭 재페어가 먼저입니다. 긴 TTL은 악·실수된 코드 재사용 창을 늘립니다.

Q: 모델이 둘 다 달라야 할 채널 두 개가 같다.
정규화 id를 덤프하세요(스레드·채널, Discord). modelByConversation하나의 권한 있는 네이밍만.

Q: MESSAGE_CONTENT 없이 Discord는?
많은 에이전트에선 불가—MESSAGE_CONTENT(또는 앱에 상응하는)으로 텍스트를 읽고, OpenClaw 정책에서 거절하세요(클라이언트 굶기지 말 것).

9. 요약: 왜 Mac mini에 이 스택이 잘 맞는가

Slack/Discord 인바운드는 화려한 기능보다 지루한 순서서명 검증, 페어링 완료 증명, 도구 넓히기 전 groupPolicy—에 달렸습니다. ZoneMac 원격 물리 Mac, 특히 Mac mini M4 류는 Apple Silicon 대기 전력이 수 와트 수준이고, Unix(SSH·Homebrew·launchd)와 맞닿는 스택, 크래시가 낮은 OS를 7×24로 돌리기 쉬워 게이트웨이·웹훅 호스트에 잘 맞습니다.

장기 웹훅·역프록시엔 macOSGatekeeper·SIP·FileVault가 한 덩어리로 신뢰·디스크 암호화를 잡는 편이, “유틸리티 Windows 박스” 땜질만 할 때보다 절이 덜 떨어집니다. 새벽 3시에 allowlist·페어 코드가 틀리지 않는 편이 중요하다는 뜻이기도 합니다.

OpenClaw·리버스 프록시·이 런북의 관측을 전용 실물에 얹고 싶다면, Mac mini M4는 합리적인 출발선입니다. ZoneMac에서 전용 물리 Mac 노드로 구성하면 Slack/Discord 인바운드를 재현·감사·정책에 맡길 수 있습니다. 아래 CTA에서 홈·플랜을 확인하세요.

기간 한정

OpenClaw Slack/Discord 인바운드를 쓰실 원격 물리 Mac이 필요하신가요?

ZoneMac Mac mini는 openclaw.json·역프록시·서명 시크릿을 한 macOS에 맞게 고정—시뮬레이터 없이 이 런북을 다시 쓸 수 있게 합니다.

7×24 물리 Mac SSH
macOS 클라우드 렌탈 초저가 기간 한정
지금 구매