개발자 문서
한국어

시작하기

파발 소개

파발이 무엇이고 어떻게 짜여 있는지, 지금 무엇이 되고 무엇이 아직 안 되는지.

파발이란

파발(擺撥)은 조선 시대에 말을 갈아타며 급한 소식을 이어 달리던 역참 제도입니다. Pabal.me 는 그 이름을 딴 메신저로, 조직이나 공동체가 자기 서버에서 운영하는 텔레그램 호환 메신저입니다.

  • 서버를 직접 운영합니다. 계정·대화·사진이 모두 운영자의 서버와 데이터베이스(PostgreSQL)에 저장됩니다. 서버 프로그램의 이름은 HunsTelegram(Java 21)입니다.
  • 텔레그램의 말을 그대로 씁니다. 앱과 서버 사이는 텔레그램과 같은 MTProto 2.0(레이어 216), 봇과 서버 사이는 텔레그램과 같은 HTTP Bot API 입니다. 그래서 텔레그램용으로 만든 앱·라이브러리·봇이 주소만 바꿔 파발에 붙습니다.
  • 텔레그램과는 연결되지 않은 별도의 세계입니다. 파발 계정은 파발 서버에만 있고, 텔레그램 사용자와 메시지를 주고받을 수는 없습니다.

AI 에이전트와의 대화: 음성 봇이 켜지면 봇은 글에 답하고 전화도 받습니다. 같은 봇에게 컴퓨터에서 글로 묻고, 휴대폰이나 애플 워치로 전화를 걸 수 있고, 누구나 @BotFather 로 그런 봇을 만들 수 있습니다. 아직 준비 중이며, 무엇이 되고 데이터가 어디로 가는지는 AI 에이전트에 모았습니다.

어떻게 짜여 있나

사람 · 프로그램 입구 파발 서버 (HunsTelegram) 파발 앱Pabal.app · 텔레그램 앱 봇 프로그램라이브러리 · curl 브라우저사이트 · 문서 · 링크 MTProto:8443 · 자체 암호화 HTTPS :443Caddy (인증서 자동) 게이트웨이MTProto 2.0 · 레이어 216 Bot API · 웹훅/bot<토큰>/<메서드> 웹사이트 · 문서/ · /docs/ · /사용자명 서비스 메시지함 · 대화 목록 실시간 업데이트 (pts) 그룹 · 사진 · 프로필 가입 코드 · 인증 키 @BotFather · 봇 등록부 관리 화면 (127.0.0.1) PostgreSQL이벤트저장소 파일사진 원본data/media MTProto 봇 웹훅 POST (HTTPS)
파발의 구성 — 입구는 두 개, 기록은 한 곳

다이어그램 설명

  • 세 영역: 왼쪽은 서버 밖에서 도는 것(앱·봇 프로그램·브라우저), 가운데는 서버의 두 입구, 오른쪽은 서버 안입니다. 봇 프로그램도 서버 밖, 운영자나 개발자의 컴퓨터에서 돕니다.
  • 입구는 둘뿐입니다: 앱은 MTProto 포트(8443) 로 바로 붙고(MTProto 가 스스로 암호화하므로 HTTPS 가 필요 없음), 웹사이트와 Bot API 는 HTTPS(443) 로 들어옵니다.
  • 봇은 두 길 중 하나로 붙습니다: 보통은 HTTPS 의 Bot API(실선), 원하면 앱과 같은 MTProto(파란 점선)로도 됩니다. 어느 쪽이든 같은 봇 계정·같은 메시지함입니다.
  • 빨간 점선은 거꾸로 가는 유일한 화살표입니다: 봇이 웹훅을 설정하면 서버가 봇 프로그램의 HTTPS 주소로 새 소식을 보냅니다. 나머지는 모두 바깥에서 서버로 들어오는 요청입니다.
  • 기록은 한 곳입니다: 모든 변경은 서비스를 거쳐 PostgreSQL 의 이벤트 저장소에 남고, 사진 원본만 파일로 둡니다. 앱에서 보낸 메시지도, 봇이 보낸 메시지도 같은 길을 지나므로 푸시·대화 목록·재접속 복구가 모두에게 똑같이 적용됩니다.

위 그림은 메시지가 다니는 길입니다. 음성 봇을 켠 서버에는 통화용 입구가 더 생깁니다 — 통화 중계(UDP 3478)와 애플 워치의 소리 입구(WSS). 그 길은 AI 에이전트에 그렸습니다.

지금 되는 것, 아직 안 되는 것

기능상태메모
가입·로그인 (전화번호 + 코드)됨코드는 SMS · 이메일 · 관리자 전달 중 운영자가 고름
1:1 대화, 실시간 수신, 여러 기기됨꺼져 있던 기기는 다시 켜면 놓친 것을 따라잡음
메시지 고치기·지우기됨상대 화면에도 바로 반영
기본 그룹 (만들기·멤버 넣기·내보내기·이름)됨멤버는 그룹 정보에서 직접 넣음
사진 보내기, 프로필 사진됨원본 한 가지 크기로 저장
파일 보내기 (모든 형식)됨이름·형식 그대로. 10MB 가 넘으면 upload.saveBigFilePart, 기본 한도 2GB
봇 — @BotFather, HTTP Bot API, 웹훅, MTProto 봇됨버튼·콜백·명령어 메뉴·사진·파일·그룹
관리 화면, 운영 설정됨서버의 127.0.0.1 에만 열림
웹사이트 10개 언어, 사용자명·초대 링크 페이지됨개발자 문서도 10개 언어
1:1 통화됨서로 다른 망 사이의 통화는 서버의 릴레이(TURN) 설정에 따라 다름
푸시 알림 — 안드로이드됨앱이 꺼져 있어도 메시지 알림과 전화 벨. 운영자가 Firebase 를 설정해야 함(서버 설치)
알림 — 맥·윈도우됨앱이 켜져 있는 동안 컴퓨터의 알림으로 보여 줌(푸시 없음)
로그인한 기기 보기·끊기 (설정의 기기)됨 — 실제 앱 확인 전로그인한 지 24시간이 안 된 기기는 다른 기기를 끊지 못함(안드로이드·데스크톱 앱에는 그 안내가 뜨지 않음). 서버 시험으로 확인했고, 실제 앱으로 끝까지 해 보는 확인은 아직 — 앱 사용하기 — 계정 지키기
데이터 내보내기 (데스크톱 앱)됨 — 실제 앱 확인 전대화·사진·파일과 계정 정보. 하루 세 번까지 시작, 서버를 다시 켜면 처음부터. 텔레그램에 있는 기다리는 시간·다른 기기의 허락·내보내기 기록은 아직 없음. 데스크톱이 보내는 요청 순서대로 시험했고, 실제 앱으로 끝까지 해 보는 확인은 아직
전화번호 바꾸기기본 꺼짐운영자가 켜면 새 번호로 문자 코드(SMS 가 설정된 서버만) — 관리와 설정 — 가입·로그인 코드
채널, 슈퍼그룹아직앱에 제대로 보이지 않을 수 있음
동영상·음성 메시지아직파일로는 보낼 수 있지만 앱 안에서 재생되지는 않습니다
앨범 (여러 장을 한 묶음으로)아직한 번에 여러 개를 보내면 도착은 하지만, 묶이지 않고 하나씩 따로 보입니다
서식 있는 글 (굵게·기울임), 봇의 parse_mode아직글자 그대로 보냄. 명령·멘션·링크·해시태그는 자동 표시
그룹 통화, 비밀 대화아직
2단계 인증 (클라우드 비밀번호)아직설정하려 해도 거절
아이폰 앱준비 중첫 버전(1.0)을 App Store 심사에 냈음(2026-09-23). 1.0 에는 푸시 알림이 없어 앱을 열어 둔 동안 메시지를 받음. 푸시가 든 1.1 은 내부 시험(TestFlight) 중
초대 링크로 그룹에 들어가기아직링크는 만들어지지만 눌러도 멤버가 되지 않음
인라인 모드(@봇 검색어), 결제, 게임아직
음성 봇 (봇에게 전화하면 AI 가 받음)준비 중서버·법률 문서·확인 창이 든 앱이 갖춰져야 켜짐. pabal.me 는 꺼짐, 개발 서버에서 시험 중 — 음성 봇
애플 워치 앱 (음성 봇 통화)준비 중내부 시험(TestFlight)만. 아이폰 없이 워치로 음성 봇에 전화 — 앱 사용하기 — 애플 워치
대화 남기기 (통화 대화를 내 대화방에 글로)준비 중확인 창 문구의 법률 검토 전 — 앱 사용하기 — 음성 봇
봇이 거는 전화 (허락한 봇이 AI 음성으로 나에게 전화)꺼짐법률 검토 대기. 허락 창이 든 앱 빌드도 아직 없음 — 앱 사용하기 — 봇이 나에게 전화하도록 허락하기

텔레그램과의 관계

파발은 텔레그램의 공개된 프로토콜을 따르는 별도의 서버입니다. 텔레그램 사(社)와 관계가 없고, 텔레그램 서버에 접속하지도 않습니다.

  • 호환되는 것: MTProto 2.0 (전송 4종, 핸드셰이크, 임시 키 바인딩), 레이어 216 의 요청·응답 형식, HTTP Bot API 의 주소 형식·요청·응답·오류 형식. 공식 텔레그램 데스크톱 6.2.6 을 수정 없이(서버 주소와 공개키만 바꿔) 붙여 확인했습니다.
  • 다른 것: 계정과 데이터가 서버마다 따로입니다. 사용자 ID·메시지 ID·파일 ID 는 이 서버 안에서만 뜻이 있습니다. 텔레그램에서 쓰던 봇 토큰은 쓸 수 없고, 파발의 @BotFather 에게서 새로 받아야 합니다.

앱과 서버는 링크를 https://pabal.me/ 로 만듭니다. 브라우저에서 열면 앱을 여는 작은 페이지가 뜹니다.

링크뜻앱에서 여는 주소
pabal.me/<사용자명>사람이나 봇의 대화 열기tg://resolve?domain=<사용자명>
pabal.me/+<초대 코드>그룹 초대 링크 (앱이 열리지만, 링크로 들어가기는 아직 안 됨)tg://join?invite=<초대 코드>
pabal.me/joinchat/<초대 코드>예전 형식의 초대 링크 (같은 뜻)tg://join?invite=<초대 코드>

사용자명은 영문자로 시작하는 영문자·숫자·밑줄 5~32자입니다(봇은 bot 으로 끝남). docs, admin, health 처럼 사이트가 쓰는 경로와 같은 이름은 링크로 열리지 않습니다.

보안 모델

  • 앱 ↔ 서버: MTProto 2.0 으로 암호화됩니다. 앱은 서버의 RSA 공개키를 몸속에 넣고 빌드되어, 다른 서버가 파발 서버인 척할 수 없습니다. 대화는 텔레그램의 "클라우드 대화"와 같아서 서버는 내용을 읽을 수 있습니다(종단간 암호화가 아님). 서버를 믿을 수 있는 사람이 운영해야 하는 이유입니다.
  • 봇 ↔ 서버: Bot API 는 HTTPS 로만 공개합니다. 봇 토큰은 봇의 비밀번호입니다 — 새어 나갔으면 @BotFather 에서 /revoke 로 바꾸세요. 이전 토큰과 그 토큰으로 붙어 있던 연결이 즉시 끊깁니다.
  • 서버 → 웹훅: 서버는 HTTPS 이고 공인 주소인 웹훅에만 요청을 보냅니다. 사설망·루프백·클라우드 메타데이터 같은 내부 주소는 거절합니다. 봇은 secret_token 으로 요청이 진짜 파발 서버에서 왔는지 확인할 수 있습니다.
  • 서버 → 안드로이드 알림: 푸시 알림은 Google 의 Firebase 클라우드 메시징(FCM)을 거칩니다. 알림 내용(보낸 사람 이름, 메시지 미리보기)은 서버가 그 휴대폰만 가진 키로 암호화해 보내므로 Google 은 읽을 수 없고, 기기 토큰과 보낸 시각 같은 전달 정보만 봅니다. 운영자는 알림에서 메시지 내용을 아예 뺄 수도 있습니다.
  • 서버 → 아이폰 알림: 아이폰의 푸시 알림은 Apple 의 APNs 를 거칩니다. 안드로이드와 같은 방식으로, Apple 에 보이는 겉 문구는 "새 알림이 있습니다" 뿐이고 보낸 사람과 내용은 그 기기만 가진 키로 암호화되어 휴대폰 안에서 풀립니다. 푸시가 든 앱 빌드(1.1)부터입니다.
  • 음성 봇 통화(준비 중): 봇과의 통화는 사람끼리의 통화와 달리 종단 간 암호화가 아닙니다. 파발의 음성 게이트웨이가 소리를 풀어 AI 모델에 건네고, 기본 엔진을 쓰면 통화 소리는 미국(Google Cloud us-central1)의 Google 로 갑니다. 운영자가 정할 수 있는 것 — 서버 직접 운영, 봇 주인의 모델 키, 원음 모드, 운영자 스위치 — 은 AI 에이전트 — 우리가 정할 수 있는 것에 있습니다.
  • 관리: 관리 화면은 서버 자신(127.0.0.1)에만 열리고, 토큰이 있어야 데이터를 볼 수 있습니다. 운영자는 SSH 터널로 들어갑니다.
  • 저장: 인증 키는 서버가 복호화에 써야 하므로 데이터베이스에 그대로 들어 있습니다. 데이터베이스와 백업은 서버의 RSA 비밀키만큼 지켜야 합니다.

용어

용어뜻
MTProto텔레그램이 만든, 앱과 서버 사이의 암호화 프로토콜. 파발은 2.0 을 씁니다.
레이어 (layer)MTProto 위에서 오가는 요청·응답 형식의 판(版). 파발은 216 입니다.
인증 키 (auth key)앱이 처음 접속할 때 서버와 만드는 2048비트 비밀. 로그인은 이 키에 붙습니다.
DC텔레그램의 데이터 센터 번호. 파발은 서버 한 대가 DC 1~5 를 모두 맡습니다.
업데이트, pts새 메시지·수정·삭제 같은 변화. pts 는 사용자별 변화의 순번으로, 끊겼던 기기가 무엇을 놓쳤는지 알게 합니다.
푸시 알림앱이 꺼져 있거나 화면 밖에 있을 때 휴대폰을 깨워 알리는 것. 파발은 안드로이드 앱에는 Google FCM 으로, 아이폰 앱에는 Apple APNs 로 보냅니다.
피어 (peer)대화 상대 — 사람, 봇, 그룹.
봇 토큰<봇 ID>:<비밀> 꼴의 문자열. Bot API 주소에 넣어 봇을 증명합니다.
웹훅봇이 새 소식을 가지러 오는 대신, 서버가 봇의 HTTPS 주소로 보내 주는 방식.
AI 에이전트글에 답하고 전화도 받는 봇. 파발에서는 음성을 켠 봇입니다(준비 중).
음성 봇사람이 전화를 걸 수 있는 봇. 봇 주인의 코드가 아니라 AI 음성 모델이 통화를 받습니다.
음성 게이트웨이봇 대신 통화의 한쪽 끝이 되어 소리를 풀고 AI 모델과 주고받는 파발의 부품(pabal-voice). 앱이 붙는 MTProto 게이트웨이와는 다릅니다.
원음 모드AI 모델 대신 봇 개발자의 서버가 통화 소리를 직접 받는 음성 봇의 방식.
대화 남기기전화를 거는 사람이 고르면, 통화가 끝난 뒤 그 대화를 자기 대화방에만 글로 남기는 것. 봇과 봇 주인에게는 가지 않습니다.