OpenClaw Nostr 연동: 5분 만에 DM 봇 설정하기
분산형 네트워크에서 봇을 운영하는 건 생각보다 까다로운 일이죠. 특히 보안과 프라이버시를 유지하면서 사용자들과 소통하고 싶을 때 Nostr 같은 프로토콜은 아주 매력적인 선택지예요. OpenClaw를 사용해 Nostr 환경에서 스마트한 DM 봇을 구축하는 방법을 알아볼게요.
Nostr
섹션 제목: “Nostr”상태: 선택 사항 플러그인 (기본적으로 비활성화됨).
Nostr은 소셜 네트워킹을 위한 분산형 프로토콜이에요. 이 채널을 통해 OpenClaw는 NIP-04를 사용하여 암호화된 DM(Direct Message)을 수신하고 응답할 수 있어요.
설치 (온디맨드)
섹션 제목: “설치 (온디맨드)”온보딩 (권장)
섹션 제목: “온보딩 (권장)”- 온보딩(
openclaw onboard) 및openclaw channels add명령어를 실행하면 선택 가능한 채널 플러그인 목록이 나와요. - Nostr를 선택하면 필요에 따라 플러그인을 설치하라는 안내가 표시돼요.
설치 기본값:
- Dev 채널 + git checkout 가능 시: 로컬 플러그인 경로를 사용해요.
- Stable/Beta: npm에서 다운로드해요.
프롬프트에서 선택 사항을 언제든지 직접 지정할 수 있어요.
수동 설치
섹션 제목: “수동 설치”openclaw plugins install @openclaw/nostr로컬 체크아웃을 사용하는 경우 (개발 워크플로우):
openclaw plugins install --link <path-to-local-nostr-plugin>플러그인을 설치하거나 활성화한 후에는 Gateway를 다시 시작해 주세요.
비대화형 설정
섹션 제목: “비대화형 설정”openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY"openclaw channels add --channel nostr --private-key "$NOSTR_PRIVATE_KEY" --relay-urls "wss://relay.damus.io,wss://relay.primal.net"NOSTR_PRIVATE_KEY를 설정 파일에 저장하는 대신 환경 변수로 유지하려면 --use-env 옵션을 사용하세요.
빠른 설정
섹션 제목: “빠른 설정”- Nostr 키 쌍을 생성하세요 (필요한 경우):
# Using naknak key generate- 설정에 추가하세요:
{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", }, },}- 키를 export 하세요:
export NOSTR_PRIVATE_KEY="nsec1..."- Gateway를 다시 시작하세요.
설정 참조
섹션 제목: “설정 참조”| Key | Type | Default | Description |
|---|---|---|---|
privateKey | string | required | nsec 또는 hex 형식의 Private key |
relays | string[] | ['wss://relay.damus.io', 'wss://nos.lol'] | 릴레이 URL (WebSocket) |
dmPolicy | string | pairing | DM 액세스 정책 |
allowFrom | string[] | [] | 허용된 발신자 pubkeys |
enabled | boolean | true | 채널 활성화/비활성화 |
name | string | - | 표시 이름 |
profile | object | - | NIP-01 프로필 메타데이터 |
프로필 메타데이터
섹션 제목: “프로필 메타데이터”프로필 데이터는 NIP-01 kind:0 이벤트로 게시돼요. Control UI(Channels -> Nostr -> Profile)에서 관리하거나 설정 파일에서 직접 설정할 수 있어요.
예시:
{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", profile: { name: "openclaw", displayName: "OpenClaw", about: "Personal assistant DM bot", picture: "https://example.com/avatar.png", banner: "https://example.com/banner.png", website: "https://example.com", nip05: "openclaw@example.com", lud16: "openclaw@example.com", }, }, },}참고:
- 프로필 URL은 반드시
https://를 사용해야 해요. - 릴레이에서 가져올 때 필드가 병합되며, 로컬에서 설정한 값이 우선적으로 유지돼요.
액세스 제어
섹션 제목: “액세스 제어”DM 정책
섹션 제목: “DM 정책”- pairing (기본값): 알 수 없는 발신자에게 페어링 코드를 보내요.
- allowlist:
allowFrom에 있는 pubkey만 DM을 보낼 수 있어요. - open: 공개적으로 인바운드 DM을 허용해요 (
allowFrom: ["*"]설정 필요). - disabled: 인바운드 DM을 무시해요.
강제 적용 참고 사항:
- 발신자 정책은 서명 확인 및 NIP-04 복호화 전에 체크돼요.
- 페어링 응답은 원래 DM 본문을 처리하지 않고 전송돼요.
- 인바운드 DM은 속도 제한(rate-limit)이 적용되며, 너무 큰 페이로드는 복호화 전에 드롭돼요.
허용 목록(Allowlist) 예시
섹션 제목: “허용 목록(Allowlist) 예시”{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", dmPolicy: "allowlist", allowFrom: ["npub1abc...", "npub1xyz..."], }, },}키 형식
섹션 제목: “키 형식”허용되는 형식:
- Private key:
nsec...또는 64자 hex - Pubkeys (
allowFrom):npub...또는 hex
릴레이 (Relays)
섹션 제목: “릴레이 (Relays)”기본값: relay.damus.io 및 nos.lol.
{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"], }, },}팁:
- 중복성을 위해 2~3개의 릴레이를 사용하세요.
- 너무 많은 릴레이를 사용하면 지연 시간이 발생하거나 중복 응답이 생길 수 있으니 피하는 게 좋아요.
- 유료 릴레이를 사용하면 안정성을 높일 수 있어요.
- 테스트 용도로는 로컬 릴레이(
ws://localhost:7777)도 괜찮아요.
프로토콜 지원
섹션 제목: “프로토콜 지원”| NIP | 상태 | 설명 |
|---|---|---|
| NIP-01 | 지원됨 | 기본 이벤트 형식 + 프로필 메타데이터 |
| NIP-04 | 지원됨 | 암호화된 DM (kind:4) |
| NIP-17 | 계획 중 | Gift-wrapped DM |
| NIP-44 | 계획 중 | 버전 관리형 암호화 |
테스트
섹션 제목: “테스트”로컬 릴레이
섹션 제목: “로컬 릴레이”# Start strfrydocker run -p 7777:7777 ghcr.io/hoytech/strfry{ channels: { nostr: { privateKey: "${NOSTR_PRIVATE_KEY}", relays: ["ws://localhost:7777"], }, },}수동 테스트
섹션 제목: “수동 테스트”- 로그에서 봇의 pubkey(npub)를 확인하세요.
- Nostr 클라이언트(Damus, Amethyst 등)를 여세요.
- 봇의 pubkey로 DM을 보내세요.
- 응답이 오는지 확인하세요.
트러블슈팅
섹션 제목: “트러블슈팅”메시지를 받지 못하는 경우
섹션 제목: “메시지를 받지 못하는 경우”- Private key가 유효한지 확인하세요.
- 릴레이 URL에 접속 가능한지,
wss://(로컬은ws://)를 사용하는지 확인하세요. enabled가false로 되어 있지 않은지 확인하세요.- Gateway 로그에서 릴레이 연결 오류가 있는지 확인하세요.
응답을 보내지 못하는 경우
섹션 제목: “응답을 보내지 못하는 경우”- 릴레이가 쓰기 권한을 허용하는지 확인하세요.
- 아웃바운드 연결 상태를 확인하세요.
- 릴레이의 속도 제한(rate limits)을 확인하세요.
중복 응답이 발생하는 경우
섹션 제목: “중복 응답이 발생하는 경우”- 여러 릴레이를 사용할 때 발생할 수 있는 현상이에요.
- 메시지는 이벤트 ID로 중복 제거되며, 첫 번째로 전달된 메시지만 응답을 트리거해요.
- Private key를 절대 커밋하지 마세요.
- 키 관리에는 환경 변수를 사용하세요.
- 프로덕션 봇의 경우
allowlist사용을 고려하세요. - 페어링 및 허용 목록 정책은 복호화 전에 적용되므로, 알 수 없는 발신자가 과도한 암호화 연산을 강제할 수 없어요.
제한 사항 (MVP)
섹션 제목: “제한 사항 (MVP)”- 다이렉트 메시지만 지원해요 (그룹 채팅 불가).
- 미디어 첨부 파일은 지원하지 않아요.
- NIP-04만 지원해요 (NIP-17 gift-wrap은 계획 중).
관련 문서
섹션 제목: “관련 문서”- Channels Overview — 지원되는 모든 채널
- Pairing — DM 인증 및 페어링 흐름
- Groups — 그룹 채팅 동작 및 멘션 게이팅
- Channel Routing — 메시지 세션 라우팅
- Security — 액세스 모델 및 보안 강화
OpenClaw Expert
아직 막혀 있나요?
이 문서에서 답을 못 찾았다면 OpenClaw Expert에게 바로 물어보세요.