카카오톡 채널 봇과 OpenClaw 연결 작업 정리
카카오톡 채널 봇과 OpenClaw 연결 작업 정리
작성일: 2026-06-17
기준 환경: 보스의 OpenClaw / n8n / Nextcloud Talk 운영 환경
결론
카카오톡 채널 봇은 현재 n8n 웹훅을 통해 요청을 받고, 로컬 OpenClaw 릴레이를 거쳐 OpenClaw 에이전트에 메시지를 전달하는 구조로 연결되어 있다.
- KakaoTalk Channel Bot: 사용자 메시지 입력 지점
- n8n workflow:
Kakao OpenClaw Skill Webhook - n8n workflow ID:
DfM6KE0uX1PBTTBT - n8n webhook path:
kakao-openclaw-skill - 로컬 릴레이 스크립트:
/home/mmm/.openclaw/workspace/scripts/kakao_openclaw_relay.py - 릴레이 주소:
http://192.168.219.119:8791/kakao-openclaw - 릴레이 health check:
http://192.168.219.119:8791/health - systemd user service:
kakao-openclaw-relay.service - OpenClaw session key 형식:
kakao-channel-{카카오 userId}
비밀값, API 키, 계정 비밀번호는 이 문서에 포함하지 않았다.
전체 구조
- 사용자가 카카오톡 채널 봇에 메시지를 보낸다.
- 카카오 챗봇 스킬 서버가 n8n webhook으로 요청을 보낸다.
- n8n의
Kakao Skill Webhook노드가 요청을 받는다. Normalize Kakao Request노드가 카카오 요청을 OpenClaw 입력 형식으로 정리한다.callbackUrl이 있으면 카카오에 먼저useCallback: true응답을 보낸다.- n8n이 로컬 릴레이
kakao_openclaw_relay.py를 호출한다. - 릴레이가
openclaw agent --session-key ... --message ...명령으로 OpenClaw 에이전트에 요청한다. - OpenClaw 응답을 릴레이가 JSON으로 반환한다.
- n8n이 응답을 카카오 callback URL로 다시 전송한다.
- 사용자는 카카오톡 채널에서 최종 답변을 받는다.
진행 순서
1. 카카오톡 측 연결 테스트 완료
먼저 카카오톡 쪽에서 n8n으로 요청이 들어오는지 테스트했다. 초기 상태에서는 n8n workflow가 단순 echo 응답을 반환하는 구조였다.
- 카카오 챗봇 스킬 요청이 n8n까지 도착하는지 확인
userRequest.utterance값을 읽어 응답으로 돌려줄 수 있는지 확인
이 단계에서 카카오톡과 n8n 사이의 기본 연결은 정상으로 확인되었다.
2. 목표 변경: Nextcloud Talk처럼 OpenClaw 작업 가능하게 만들기
보스의 요구사항은 단순 응답 봇이 아니라, Nextcloud Talk에서 하던 작업을 카카오톡 채널에서도 비슷하게 수행하는 것이었다.
- 단순 echo 응답 제거
- 카카오 메시지를 OpenClaw용 prompt로 변환
- 사용자별 session key를 만들어 대화 맥락 유지
- 긴 작업을 위해 카카오 callback 방식 사용
3. n8n workflow를 callback 구조로 변경
n8n workflow 이름은 Kakao OpenClaw Skill Webhook이다. 현재 활성 상태이며, 주요 노드는 다음과 같다.
Kakao Skill WebhookNormalize Kakao RequestHas Kakao Callback URLRespond Accepted to KakaoRespond Direct to KakaoCall OpenClaw RelayBuild Kakao Callback ResponseSend Kakao Callback
핵심 분기는 callbackUrl 존재 여부다. callbackUrl이 있으면 카카오에 즉시 useCallback: true 응답을 보내고, 이후 OpenClaw 처리 결과를 callback URL로 전송한다. callbackUrl이 없으면 긴 작업 처리가 어렵기 때문에 카카오 챗봇 관리자센터에서 Callback 설정이 필요하다는 직접 안내 메시지를 반환한다.
확인 필요: 카카오 챗봇 관리자센터에서 실제 운영 스킬의 Callback 설정이 항상 켜져 있는지 확인해야 한다.
4. 로컬 OpenClaw 릴레이 추가
OpenClaw CLI를 n8n에서 직접 다루기보다, 로컬 릴레이 서버를 두었다.
/home/mmm/.openclaw/workspace/scripts/kakao_openclaw_relay.py
- n8n에서 JSON 요청 수신
prompt,message,userId,sessionKey처리- OpenClaw CLI 실행
- OpenClaw 응답 추출
- 카카오로 보내기 쉬운 JSON 반환
GET /health POST /kakao-openclaw
5. systemd user service로 릴레이 상시 실행
릴레이는 사용자 systemd 서비스로 등록했다.
서비스 이름: kakao-openclaw-relay.service 서비스 파일: /home/mmm/.config/systemd/user/kakao-openclaw-relay.service
[Unit] Description=Kakao to OpenClaw local relay After=network-online.target openclaw-gateway.service [Service] Type=simple WorkingDirectory=/home/mmm/.openclaw/workspace ExecStart=/home/mmm/.openclaw/workspace/scripts/kakao_openclaw_relay.py Restart=on-failure RestartSec=5 TimeoutStopSec=300 Environment=PATH=/home/mmm/.npm-global/bin:/usr/local/bin:/usr/bin:/bin [Install] WantedBy=default.target
2026-06-17 21:24 KST 기준으로 서비스는 active running 상태이며, python3 /home/mmm/.openclaw/workspace/scripts/kakao_openclaw_relay.py로 실행 중이다.
6. timeout 문제 확인 및 보강
운영 테스트 중 일부 요청이 약 60초 후 실패했다. n8n은 카카오 요청을 정상 수신했지만 Call OpenClaw Relay 노드에서 504 openclaw_timeout으로 끝나는 경우가 있었다.
- 릴레이의 OpenClaw CLI timeout을 240초로 조정
- Python subprocess timeout을 250초로 조정
- n8n
Call OpenClaw Relaytimeout을 260000ms로 조정 - timeout 발생 시 HTTP 504가 아니라 HTTP 200 fallback JSON 반환
이렇게 바꾼 이유는 n8n workflow가 relay 실패로 끊기지 않게 하고, 카카오 사용자에게 아무 응답도 없는 상태를 줄이기 위해서다.
7. 릴레이 재시작 중 연결 끊김 문제 보강
운영 중 릴레이 서비스를 재시작했을 때, 이미 처리 중이던 n8n 요청이 끊기는 문제가 있었다. 확인된 사례는 n8n execution 25054이며, 2026-06-17 20:27:53 KST에 시작된 요청이 릴레이 재시작으로 중간 종료되었다.
- 릴레이에 graceful shutdown 추가
- SIGTERM / SIGINT 수신 시 draining 모드 진입
- 처리 중인 요청 수 추적
- 최대 270초까지 active request 완료 대기
- systemd
TimeoutStopSec=300적용
8. 사용자별 OpenClaw 세션 분리
카카오톡 채널에서는 사용자별 맥락이 필요하다. 현재 session key 규칙은 다음과 같다.
kakao-channel-{safe userId}
n8n이 sessionKey를 넘기면 그 값을 사용한다. n8n 또는 다른 호출자가 sessionKey를 생략하면 릴레이가 userId 또는 user_id를 기준으로 자동 생성한다.
현재 n8n workflow 요약
Kakao Skill Webhook
-> Normalize Kakao Request
-> Has Kakao Callback URL
-> true: Respond Accepted to Kakao
-> Call OpenClaw Relay
-> Build Kakao Callback Response
-> Send Kakao Callback
-> false: Respond Direct to Kakao
- 워크플로우:
Kakao OpenClaw Skill Webhook - 상태:
active - 워크플로우 ID:
DfM6KE0uX1PBTTBT - 릴레이 호출 주소:
http://192.168.219.119:8791/kakao-openclaw - 릴레이 timeout:
260000ms
운영 확인 명령
systemctl --user status kakao-openclaw-relay.service --no-pager systemctl --user cat kakao-openclaw-relay.service curl -fsS http://192.168.219.119:8791/health
curl -fsS -X POST http://192.168.219.119:8791/kakao-openclaw \
-H 'Content-Type: application/json' \
-d '{
"userId": "relay-session-test",
"message": "OK라고만 답해줘",
"prompt": "OK라고만 답해줘"
}'
장애 대응 기준
카카오에서 답변이 아예 안 올 때:
- 카카오 챗봇 관리자센터에서 Callback 설정이 켜져 있는지 확인
- n8n workflow가 active인지 확인
- n8n execution에서 실패 노드 확인
- 릴레이 health check 확인
kakao-openclaw-relay.service상태 확인- OpenClaw CLI 직접 호출 가능 여부 확인
n8n에서 Respond Direct to Kakao로 끝날 때: 카카오 요청에 callbackUrl이 없었다는 뜻이다. 카카오 챗봇 관리자센터 Callback 설정을 우선 확인해야 한다.
n8n에서 Call OpenClaw Relay가 실패할 때: 릴레이 서비스 중지, 릴레이 재시작 중 요청 유입, OpenClaw CLI 응답 지연, 로컬 네트워크 주소 변경, n8n의 릴레이 접근 실패를 순서대로 확인한다.
현재 남은 확인 사항
- 확인 필요: 카카오 챗봇 관리자센터에서 운영 스킬의 Callback 설정이 켜져 있는지
- 확인 필요: 실제 카카오 사용자 메시지에서 항상
callbackUrl이 들어오는지 - 확인 필요: 외부 접속 경로에서 n8n webhook URL이 안정적으로 접근 가능한지
- 확인 필요: 장시간 작업을 카카오톡에서 어느 정도까지 허용할지 운영 기준
다음 개선 후보
- n8n execution 로그를 기준으로 실패 유형별 알림 만들기
- 릴레이 로그 파일 저장 추가
- 사용자에게 긴 작업 접수 메시지를 더 자연스럽게 조정
- OpenClaw 응답이 1000자를 넘을 때 분할 전송 전략 검토
- 카카오 세션별 최근 대화 상태 점검 명령 추가
- 릴레이 주소가 바뀌었을 때 n8n 설정을 쉽게 갱신하는 절차 문서화
현재 상태 요약
2026-06-17 21:24 KST 기준으로 서버 측 구성은 정상이다. n8n workflow는 active 상태이고, 로컬 릴레이 서비스는 running 상태이며, 릴레이 health check가 가능하다. 카카오 callback flow는 n8n에서 구성되어 있고, OpenClaw 세션은 카카오 사용자별로 분리된다. timeout과 재시작 중 연결 끊김 문제에 대한 1차 보강도 적용되었다.
즉, 현재 단계는 기본 연결 구현 완료 후 운영 안정화와 카카오 관리자센터 설정 확인 단계로 보면 된다.
