채팅 기록을 직접 삭제할 수 있는 SQLite 파일로 저장하는 셀프 호스팅 Claude 봇
요약
사용자의 대화 기록을 SQLite 파일로 직접 관리할 수 있는 셀프 호스팅 Claude 봇인 Telechat을 소개합니다. Telegram, WhatsApp, Slack 및 로컬 웹 채팅을 지원하며, 데이터 프라이버시를 위해 모든 기록을 사용자의 로컬 디스크에 저장합니다.
핵심 포인트
- 대화 기록을 SQLite 파일로 저장하여 직접 관리 및 삭제 가능
- Telegram, WhatsApp, Slack, 로컬 웹 등 다양한 플랫폼 지원
- Claude Code CLI 또는 Anthropic API를 통한 연동 지원
- 서버를 거치지 않는 셀프 호스팅 방식으로 개인정보 보호 강화
모든 "휴대폰으로 AI와 채팅하기" 제품은 당신에게 똑같은 것을 요구합니다. 바로 계정입니다. 그러면 당신의 대화는 당신이 관리하지 않는 데이터베이스에 저장되며, 당신이 작성하지도 않았고 감사(audit)할 수도 없는 데이터 보존 정책(retention policy)의 적용을 받게 됩니다.
저는 그 반대의 거래를 원했습니다. Claude를 제 메신저에서 사용하되, 대화 기록(transcript)은 제 자신의 디스크에 저장하는 것입니다. 그것이 바로 Telechat입니다. 하나의 Python 프로세스로 실행되며, Telegram, WhatsApp, Slack 및 로컬 웹 채팅을 동시에 지원하고, 모든 것을 단일 SQLite 파일에 저장하는 셀프 호스팅(self-hosted) Claude 봇입니다.
이것이 실제로 당신에게 무엇을 제공하는지, 그리고 "개인정보 보호 우선(privacy-first)"이라는 말이 사람들이 구체적인 설명 없이 내뱉는 주장인 만큼, 신뢰 경계(trust boundary)가 실제로 어디에 위치하는지에 대해 설명하겠습니다.
계정 없이 30초 만에 시작하기
작동 방식을 가장 빠르게 확인하는 방법은 설정을 완전히 건너뛰는 것입니다:
npx telechat web
이렇게 하면 http://127.0.0.1:8585에서 채팅 UI가 시작됩니다. 봇 토큰도 필요 없고, 메신저 계정도 필요 없습니다. 디스크에 기록되는 것도 없습니다. 딱 한 가지만 필요합니다. 이미 가지고 있는 Claude Code CLI나 ANTHROPIC_API_KEY를 통해 Claude에 도달할 수 있는 방법입니다. 둘 다 없다면 모호하게 실패하는 대신 어떤 것이 누락되었는지 알려줍니다.
이 서비스는 루프백(loopback)에 바인딩됩니다. README에 방화벽 설정을 하라는 메모와 함께 0.0.0.0에 바인딩되는 방식이 아닙니다.
셀프 호스팅이 핵심인 이유
셀프 호스팅 Claude 봇은 당신의 계정 아래 당신의 기기에서 실행됩니다. CLI 모드에서 Telechat은 이미 인증된 claude 바이너리를 호출(shell out)하므로, Claude 구독이 있다면 API 키도 필요 없고 추가 비용도 발생하지 않습니다. API 모드에서는 당신의 키를 사용하여 Anthropic과 직접 통신합니다.
어떤 방식이든 경로 상에 Telechat 서버는 존재하지 않습니다. 저는 서버를 운영하지 않습니다. 로그인할 대상이 없으므로, 제가 보유할 당신의 데이터도 없습니다. 당신의 대화 기록, 저장된 메모리, 지식 베이스(knowledge base), 세션 상태(session state) 및 비용 추적 데이터는 모두 ~/.telechat/bot.db에 저장됩니다:
sqlite3 ~/.telechat/bot.db .tables # 그냥 파일일 뿐입니다
telechat env clean # 자격 증명(credentials) 또한 그냥 파일일 뿐입니다
읽거나, grep으로 검색하거나, 백업하거나, 혹은 rm으로 삭제할 수 있습니다. 이것이 데이터 삭제의 전부입니다.
하나의 프로세스, 네 개의 메신저
어떤 플랫폼을 시작할지는 하나의 환경 변수(environment variable)로 결정됩니다:
BOT_MODE=telegram # 기본값
BOT_MODE=telegram,slack # 쉼표로 구분된 목록
BOT_MODE=all # 네 가지 모두
각 어댑터(adapter)는 해당 플랫폼의 특이점 — Telegram의 인라인 키보드(inline keyboards), Slack의 스레드 의미론(thread semantics), WhatsApp의 완전한 상호작용 부재 — 을 처리한 다음, 동일한 호출 계층(invocation layer)에 일반 문자열을 전달합니다.
이 방식의 이점은 RAM을 절약하는 것이 아닙니다. 저장소(store)를 공유하기 때문에 대화 내용도 공유된다는 점입니다. Telegram에서 저장한 기억이 Slack에서 질문할 때 로드됩니다. 웹 채팅에서 책상 앞에 앉아 시작한 세션이 휴대폰을 들었을 때 목록에 나타납니다. 이는 정확히 하나의 프로세스와 정확히 하나의 데이터베이스가 존재하기 때문에 가능한 일입니다.
인터넷 상의 그 무엇도 당신에게 도달할 필요가 없습니다
이것은 공격 표면(attack surface)의 대부분을 제거하는 설계 결정이며, 무언가의 '부재'로 나타나기 때문에 놓치기 쉽습니다.
일반적인 챗봇 튜토리얼은 웹훅(webhook)을 사용합니다. 인바운드(inbound) HTTP 요청을 수락하려면 이제 공개 URL, TLS 인증서, 그리고 플랫폼의 타임아웃(timeout) 내의 응답이 필요합니다. 그런데 LLM의 응답 시간은 통상적으로 이 타임아웃을 초과하므로, 큐(queue)가 필요하고, 그 큐를 실행할 어딘가가 또 필요하게 됩니다.
Telechat은 플랫폼으로부터 인바운드 연결을 절대 수락하지 않습니다:
| 플랫폼 | 전송 방식 (Transport) |
|---|---|
| Telegram | 롱 폴링 (Long polling) |
| ... |
네 가지 모두 아웃바운드(outbound) 방식입니다. 인바운드 방화벽 규칙도, 터널(tunnel)도, 갱신할 인증서도 필요 없으며, 노출되는 것도 없습니다. NAT 뒤에서도, 호텔 Wi-Fi에서도, 기업 네트워크에서도, 그리고 덮개를 닫은 노트북에서도 작동합니다. 노트북이 깨어나면 폴링(polling)이 재개됩니다.
"개인정보 보호 우선" 게시물들이 보통 생략하는 부분
셀프 호스팅(Self-hosted)이 자동으로 안전한 것은 아니며, 마케팅적인 버전보다는 정직한 버전이 더 중요합니다.
CLI 모드에서 이 봇은 원격 셸 (remote shell)입니다. 이 봇은 사용자의 인증 정보와 파일 시스템 접근 권한을 사용하여 claude를 실행합니다. 봇에게 메시지를 보낼 수 있는 사람은 누구나 CLAUDE_CLI_PERMISSION_MODE와 CLAUDE_CLI_WORK_DIR에 의해 제한되는 범위 내에서 Claude에게 읽기, 쓰기 또는 실행을 요청할 수 있습니다. 따라서 다음 사항을 주의해야 합니다:
항상 허용 목록 (allowlist)을 설정하세요. TELEGRAM_ALLOWED_USER_IDS, WHATSAPP_ALLOWED_NUMBERS, SLACK_ALLOWED_USER_IDS를 설정해야 합니다. 이 값이 비어 있으면 봇을 발견하는 누구나 사용할 수 있습니다. 설정 마법사(setup wizard)에서 이에 대해 경고하며, 이 경고는 단순히 장식용이 아닙니다.
허용 목록은 평면적 (flat)입니다. 대화와 메모리는 사용자별로 키(key)가 지정되지만, 권한(capability)은 그렇지 않습니다. 목록에 있는 모든 사람은 하나의 Claude 인증, 하나의 작업 디렉토리(working directory), 그리고 하나의 권한 상한선(permission ceiling)을 공유합니다. 두 번째 사람을 추가하면 그 사람에게도 당신과 동일한 권한이 부여됩니다. 이것은 개인용 단일 운영자 도구이지, 멀티 테넌트 (multi-tenant) 배포 모델이 아니며, 사용자별 격리(per-user isolation) 기능은 아직 존재하지 않습니다.
또한, 사용자가 관리하는 머신에서 실행할 때 특유하게 발생하는 버그 유형도 언급할 가치가 있습니다. Telechat는 사용자가 붙여넣은 링크를 읽으므로, 붙여넣은 URL은 네트워크 _내부_에서 발생하는 아웃바운드 요청 (outbound request)이 됩니다. 최근 수정 사항을 통해 명백한 허점들을 차단했습니다. 이제 리다이렉트 (redirect)는 매 홉(hop)마다 재검증을 거치며 한 번에 한 단계씩만 따라가고, 호스트 이름(hostname)은 매번 확인된 주소와 함께 확인됩니다. 따라서 302 Location: http://169.254.169.254/라고 응답하는 공개 링크가 더 이상 클라우드 메타데이터에 도달하지 않으며, 127.0.0.1을 가리키는 호스트 이름이 더 이상 사용자의 자체 서비스에 도달하지 않습니다. DNS 리바인딩 (DNS rebinding) 취약점은 여전히 열려 있습니다. 이를 차단하려면 연결을 검증된 주소로 고정(pinning)해야 하는데, 이는 더 큰 규모의 변경을 의미합니다. 이 부분은 대충 얼버무리지 않고 문서로 명시되어 있습니다.
만약 이러한 트레이드오프 (trade-off)가 적합하지 않다면, 설치한 후가 아니라 설치하기 _전_에 이를 인지할 수 있어야 합니다.
설치 (Install)
npm install -g telechat
telechat init
telechat init은 각 플랫폼을 대화형으로 안내하며, 적절한 페이지를 열고, 토큰을 가져오고, 이를 검증한 뒤 설정을 작성합니다. 원한다면 pip install telechatai를 사용할 수도 있으며, 문제가 발생했을 때는 telechat doctor를 사용하세요.
MIT 라이선스이며, 소스 코드는 github.com/telechatai/telechat에서 확인할 수 있습니다. 이것은 작은 프로젝트이며, 보안 정책 (security policy)은 이 정도 규모의 대부분의 도구들이 신경 쓰는 것보다 더 자세하게 신뢰 경계 (trust boundary)를 설명하고 있습니다. 제 생각에, 당신의 파일 시스템 (filesystem) 권한을 넘겨주려는 대상에게 기대할 수 있는 최소한의 사항은 바로 이것이라고 봅니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기