🌐OpenWebUI + Twilio 전화봇 설치
아래 링크에서 설치 스크립트를 다운로드하여 실행합니다.
설치 스크립트 다운로드 + 실행 (원클릭)
용도에 맞는 스크립트를 선택하세요. 두 가지 운영 모드가 있습니다:
| 스크립트 | 용도 | 전화 받는 대상 |
|---|---|---|
start-openwebui-hardened-admin-only.sh | 개인용 (나만의 AI 비서) | 등록된 관리자 번호만 |
start-openwebui-customer-support.sh | 고객 상담용 | 누구나 (AI 응대) · 캘린더 등은 관리자만 |
아래 명령어 한 줄로 다운로드 → 권한 부여 → 실행이 자동으로 진행됩니다 (개인용 예시):
# 스크립트 위치에서 다운로드 → 내용 확인 후 실행
wget https://YOUR-HOST/OpenWebUI/start-openwebui-hardened-admin-only.sh
less start-openwebui-hardened-admin-only.sh # 실행 전 내용 검토
chmod +x start-openwebui-hardened-admin-only.sh
./start-openwebui-hardened-admin-only.sh
※ 고객 상담용은 위 명령어에서 파일명만 start-openwebui-customer-support.sh로 바꾸면 됩니다.
설치 중 입력값 안내
스크립트가 대화형으로 여러 값을 물어봅니다. 아래 순서로 입력하세요:
| 순서 | 항목 | 입력 예시 | 비고 |
|---|---|---|---|
| ① | Ollama 사용 여부 | Y 또는 N | RAM 8GB+ 이면 Y 권장 |
| ② | Groq API Key | gsk_xxxxx... | Enter = 건너뛰기 |
| ③ | Twilio Account SID | ACxxxxx... | Enter = 건너뛰기 |
| ④ | Twilio Auth Token | xxxxx... | Enter = 건너뛰기 |
| ⑤ | Twilio 전화번호 | +18023929721 | E.164 형식 |
| ⑥ | 나의 전화번호 | +821012345678 | E.164 형식 |
| ⑦ | 서버 도메인 | https://yourdomain.com | Twilio Webhook용 |
| ⑧ | 관리자 이메일 | admin@yourdomain.com | OpenWebUI 로그인용 |
| ⑨ | 관리자 비밀번호 | MyStr0ng!Pass | 반드시 변경 |
| ⑩ | 🆕 앱 이름 설정 | 나만의AI | 최대 10자, Enter=Open WebUI |
| ⑪ | AI 모드 선택 | 2 | 1=OpenWebUI, 2=Groq, 3=포워딩 |
| ⑫ | 🔄 통화 인증 방식 | 관리자 번호만 | 🆕 PIN 폐지 → 등록된 관리자 번호만 통화 허용 (자동) |
| ⑬ | 연락처 등록 | 김철수,+821011112222 | Enter = 나중에 (봇이 전화 걸 대상, 통화 권한과 무관) |
| ⑭ | Cloudflare Tunnel 🆕 | y 또는 N | Enter = 건너뛰기 |
| ⑮ | CF Tunnel Token 🆕 | eyJhIjoixx... | ⑭에서 y 선택 시만 |
설치 완료 확인
# Docker 컨테이너 상태 확인
cd ~/OpenWebUI && docker compose ps
# 4개 컨테이너가 모두 "Up" 상태여야 합니다:
# qdrant → Up
# openapi-tools → Up
# open-webui → Up
# twilio-bot → Up
# 서비스 접속 테스트
curl -s http://localhost:3000/health # OpenWebUI
curl -s http://localhost:8000/health # Tools Server
curl -s http://localhost:6333/collections # Qdrant
curl -s http://localhost:5000/health # Twilio Bot
OpenWebUI 웹 접속 + API Key 발급
브라우저에서 http://서버IP:3000 접속 후:
- 설치 시 입력한 이메일/비밀번호로 로그인
- 좌측 하단 사용자 아이콘 클릭 → 설정
- 계정 탭 → API Keys 섹션
- 새 API Key 생성 클릭 → 키 복사 후 안전한 곳에 저장
이 API Key를 반드시 메모하세요! 마지막 단계인 Telegram 봇 설치 시 입력해야 합니다. 발급 후 다시 볼 수 없으니 꼭 복사해두세요.
📞전화 어시스턴트 (Twilio)
Twilio API를 통해 AI가 전화를 걸고 받는 기능입니다. OpenWebUI 채팅에서 "나한테 전화해줘"로 호출합니다.
주요 기능
| 기능 | 사용법 | 도구 |
|---|---|---|
| 나에게 전화 | "나한테 전화해줘" | phone_assistant_v2/call_me |
| 연락처 전화 | "홍길동에게 전화해줘" | phone_assistant_v2/call_contact |
| 안부전화 | "김철수에게 안부 확인해줘" | phone_assistant_v2/call_contact |
| SMS 보내기 | "홍길동에게 문자 보내줘" | sms_sender |
| 연락처 저장 | "김철수 010-1234-5678 저장해줘" | phone_assistant_v2 |
| 연락처 삭제 | "김철수 삭제해줘" | phone_assistant_v2 |
| 🆕 연락처 수정(번호) | "박익제 번호를 010-9999-8888로 바꿔줘" | phone_assistant_v2/update_contact |
| 🆕 연락처 수정(이름) | "박익제를 박익재로 이름 바꿔줘" | phone_assistant_v2/update_contact |
| 연락처 목록 | "연락처 보여줘" (15개씩) | phone_assistant_v2 |
| 🆕 연락처 다음 페이지 | "연락처 2페이지" 또는 "다음 페이지" | phone_assistant_v2 |
| 통화 기록 | "최근 통화 기록 보여줘" | phone_assistant_v2 |
| 전화 예약 | "내일 오후 3시에 김철수에게 전화해줘" | schedule_manager |
| SMS 예약 | "내일 9시에 홍길동에게 문자 보내줘" | schedule_manager |
| 예약 목록 | "예약 목록 보여줘" | schedule_manager |
| 예약 삭제 | "예약 삭제해줘" | schedule_manager |
| 🆕 오늘 일정 조회 | "오늘 일정 알려줘" | calendar_today |
| 🆕 일정 등록 | "내일 3시 회의 등록해줘, 알림 30분 전" | calendar_today |
| 🆕 일정 등록(상세) | "12월 25일 2시 치과 등록, 설명은 정기검진, 알림 1시간 전" | calendar_today |
| 🆕 일정 수정 | "12월 25일 회의를 오후 5시로 바꿔줘" | calendar_today/update_event |
| 🆕 일정 삭제 | "12월 25일 회의 삭제해줘" | calendar_today/delete_event |
| 녹음 ON/OFF | "통화 녹음 켜줘" | recording_manager |
| 녹음 파일 목록 | "녹음 파일 보여줘" | recording_manager |
| PDF 보고서 ON/OFF | "PDF 보고서 켜줘" | pdf_report_manager |
| PDF 보고서 목록 | "PDF 보고서 보여줘" | pdf_report_manager |
| 기능 상태 확인 | "녹음이랑 PDF 상태 확인해줘" | feature_status |
| 통화 결과 보고 | "김철수에게 전화하고 홍길동에게 보고해줘" | phone_assistant_v2 |
| 수신전화 자동 보고 | (외부 전화 수신 시 자동) SMS+Telegram+PDF | 자동 실행 |
| 번호 차단 | "010-9999-8888 차단해줘" | phone_assistant_v2 |
| 미디어 파일 목록 | "미디어 파일 보여줘" | media_manager |
| 미디어 업로드 | localhost:8000/upload 에서 드래그앤드롭 | media_manager |
| 녹음 파일 재생 | "녹음 파일 보여줘" → 클릭해서 재생 | media_manager |
| PDF 보고서 열기 | "PDF 보고서 보여줘" → 클릭해서 열기 | media_manager |
📱 SMS 사용법
보내기:
답장 자동 전달: 상대방이 답장하면 Telegram으로 자동 전달됩니다.
제한: 1600자 이내, 8개국 국가코드만 허용 (프리미엄 번호 차단)
👤 홍길동에게 "회의 참석 부탁드립니다" 문자 보내줘👤 010-1234-5678로 "내일 3시에 만나요" 문자 보내줘답장 자동 전달: 상대방이 답장하면 Telegram으로 자동 전달됩니다.
제한: 1600자 이내, 8개국 국가코드만 허용 (프리미엄 번호 차단)
📅 예약 스케줄러 사용법
전화 예약:
SMS 예약:
예약 관리:
반복 옵션: 매일, 매주, 매월 반복 예약 가능
놓친 예약:
👤 내일 오후 3시에 김철수에게 안부 전화 예약해줘👤 매주 월요일 10시에 김철수에게 전화 예약해줘SMS 예약:
👤 내일 아침 9시에 홍길동에게 "회의 참석 부탁" 문자 예약해줘예약 관리:
👤 예약 목록 보여줘👤 예약 삭제해줘👤 예약 일시정지해줘반복 옵션: 매일, 매주, 매월 반복 예약 가능
놓친 예약:
👤 놓친 예약 확인해줘 — 서버 중단 등으로 실행 못한 예약 조회
📼 통화 녹음 & PDF 보고서
기본값은 OFF입니다. 채팅에서 켜면 됩니다.
녹음 ON/OFF:
PDF ON/OFF:
녹음 동작: 법적 고지 멘트(4개국어) → 통화 녹음 → MP3 저장 → Twilio 원본 삭제 → Telegram 알림
PDF 동작: 통화 종료 3초 후 → 대화 전문 + AI 요약 + 통화 시간 포함 PDF 자동 생성
파일 위치: 녹음
.env 기본값 변경 (영구):
녹음 ON/OFF:
👤 통화 녹음 켜줘 / 👤 통화 녹음 꺼줘PDF ON/OFF:
👤 PDF 보고서 켜줘 / 👤 PDF 보고서 꺼줘녹음 동작: 법적 고지 멘트(4개국어) → 통화 녹음 → MP3 저장 → Twilio 원본 삭제 → Telegram 알림
PDF 동작: 통화 종료 3초 후 → 대화 전문 + AI 요약 + 통화 시간 포함 PDF 자동 생성
파일 위치: 녹음
~/OpenWebUI/twilio-bot/data/recordings/ | PDF ~/OpenWebUI/twilio-bot/data/reports/.env 기본값 변경 (영구):
ENABLE_CALL_RECORDING=true / ENABLE_PDF_REPORT=true
📋 통화 결과 보고 (지인에게 전달)
안부전화 후 결과를 관리자가 아닌 다른 연락처에게 전화+문자로 보고할 수 있습니다.
사용법:
보고 방식 (자동):
① 통화 종료 35초 후 → 보고 대상에게 음성 전화로 결과 요약 전달
② 통화 종료 40초 후 → 보고 대상에게 SMS 문자로 결과 요약 전달
③ 동시에 Telegram으로 관리자에게 항상 알림 (보고 대상과 무관)
※ "나한테 알려줘"라고 하면 관리자 본인 번호로 음성+SMS가 옵니다.
※ 다른 사람을 지정하면 음성+SMS는 그 사람에게, Telegram 알림은 관리자에게 옵니다.
사용법:
👤 김철수에게 전화하고 홍길동에게 결과 보고해줘👤 김철수에게 안부 확인하고 나한테 알려줘👤 김철수에게 회의 참석 여부 확인하고 박영희에게 보고해줘보고 방식 (자동):
① 통화 종료 35초 후 → 보고 대상에게 음성 전화로 결과 요약 전달
② 통화 종료 40초 후 → 보고 대상에게 SMS 문자로 결과 요약 전달
③ 동시에 Telegram으로 관리자에게 항상 알림 (보고 대상과 무관)
※ "나한테 알려줘"라고 하면 관리자 본인 번호로 음성+SMS가 옵니다.
※ 다른 사람을 지정하면 음성+SMS는 그 사람에게, Telegram 알림은 관리자에게 옵니다.
🔧 AI 어시스턴트 설정 수정 (ai_config.py)
AI의 성격, 말투, 대화 규칙, 타이밍을 수정하려면
ai_config.py 파일 하나만 편집합니다.
# ai_config.py 편집
nano ~/OpenWebUI/twilio-bot/ai_config.py
# 수정 후 적용 (재시작)
cd ~/OpenWebUI && docker compose restart twilio-bot
성격/프롬프트 설정
| 항목 | 설정값 | 설명 |
|---|---|---|
| 기본 언어 | DEFAULT_LANG = "ko" | "ko", "en", "ja", "zh" 중 선택 |
| AI 이름 | AI_NAME = "AI 비서" | AI가 자신을 부르는 이름 |
| AI 역할 | AI_ROLE = "전화 어시스턴트" | AI의 역할 설명 |
| 관리자 프롬프트 | ADMIN_SYSTEM_PROMPTS | 관리자 전화 시 AI 성격 (4개국어) |
| 수신전화 프롬프트 | INBOUND_SYSTEM_PROMPTS | 외부 전화 시 AI 성격 (4개국어) |
| 안부전화 규칙 | OUTBOUND_DIALOGUE_RULES_MAP | 안부전화 대화 규칙 11가지 (4개국어) |
| 고정 멘트 | MESSAGES | 인사, PIN 요청, 종료 등 고정 멘트 (4개국어) |
타이밍 설정
| 설정 | 기본값 | 설명 |
|---|---|---|
TIMEOUT_INBOUND | 4초 | 수신전화 — 상대방 말 시작 대기 시간 |
TIMEOUT_OUTBOUND | 5초 | 안부전화 — 상대방 말 시작 대기 시간 |
SPEECH_TIMEOUT_INBOUND | auto | 수신전화 — 말 끝 자동 감지 |
SPEECH_TIMEOUT_OUTBOUND | auto | 안부전화 — 말 끝 자동 감지 |
SLOW_DOWN_MAX | 3회 | "천천히 말해주세요" 최대 횟수 |
PATIENCE_MAX_RETRIES | 3회 | 불명확 음성 재질문 최대 횟수 |
TIMER_SUMMARY_START | 30초 | 통화 종료 후 요약 시작 대기 |
🆕 끼어들기(barge-in) 설정
통화 중 AI가 말하는 도중 상대방이 끼어들면, AI가 즉시 멈추고 맞장구친 뒤 새 질문에 집중합니다.
| 설정 | 기본값 | 설명 |
|---|---|---|
BARGEIN_THRESHOLD | 0.6 | 민감도 (0.0~1.0). 클수록 민감 — AI 답변의 이 비율 이전에 말하면 끼어들기로 인식. 0.8=더 민감 / 0.4=더 둔감 |
BARGEIN_MIN_SECONDS | 3.0 | 이 시간(초)보다 짧은 답변은 끼어들기 판단에서 제외 ("네", "알겠습니다" 등) |
BARGEIN_ENABLED | True | 끼어들기 맥락 처리 자체를 켜고 끔 |
BARGEIN_NOTE | (지시문) | 끼어들었을 때 AI에게 주는 지시문 — 말투/반응 조절 |
⚠️ 주변 소음이 큰 환경에서는 잡음에 반응할 수 있어
BARGEIN_THRESHOLD를 0.4로 낮추거나, 아예 BARGEIN_ENABLED = False로 끄는 것을 권장합니다.🆕 음성 대기시간 설정 (말이 끝났다고 판단하는 시간)
봇이 말 도중에 성급하게 끊는다면 이 값을 키우세요. 값이 클수록 말을 잠깐 멈추거나 생각해도 안 끊깁니다.| 설정 | 기본값 | 설명 |
|---|---|---|
SPEECH_TIMEOUT_ADMIN | "5" | 관리자 통화(일정 등록 등 긴 명령). 넉넉하게 권장 |
SPEECH_TIMEOUT_INBOUND | "3" | 걸려온 전화 응대 |
SPEECH_TIMEOUT_OUTBOUND | "3" | 봇이 거는 안부전화 |
숫자는 "초" 단위 문자열로 넣습니다(예:
"7"). 너무 크게 하면 말을 다 끝냈는데도 그만큼 기다려 답답할 수 있으니, 5초 안팎에서 본인 말 속도에 맞춰 조절하세요.# 예: 끼어들기를 덜 민감하게 (소음 환경)
BARGEIN_THRESHOLD = 0.4
# 예: 끼어들기 완전히 끄기
BARGEIN_ENABLED = False
🆕 상담원(0번) · 음성 담당자 연결 설정
통화 중 0번 키패드를 누르거나 음성으로 "담당자"라고 말하면 관리자(사람) 휴대폰으로 직통 연결됩니다. 각각 독립적으로 켜고 끌 수 있습니다.
| 설정 | 기본값 | 설명 |
|---|---|---|
OPERATOR_TRANSFER_ENABLED | True | 0번 키패드 직통 연결 기능. False면 0번 눌러도 연결 안 됨 |
OPERATOR_HINT_ENABLED | True | 통화 시작 시 "0번을 눌러주세요" 안내 멘트. (고객 상담용에서만 재생) |
OPERATOR_VOICE_ENABLED | True | 음성 "담당자 바꿔줘" 연결 기능. False면 음성 요청해도 연결 안 됨 |
OPERATOR_VOICE_KEYWORDS | (목록) | 음성 연결을 발동시키는 키워드 목록 (자유롭게 추가/삭제) |
세 가지가 독립적입니다. 0번만 쓰거나, 음성만 쓰거나, 둘 다 끄거나 자유롭게 조합할 수 있습니다.
조합별 동작:
| TRANSFER | VOICE | 결과 |
|---|---|---|
| True | True | 0번·음성 둘 다 연결 (기본) |
| True | False | 0번만 연결 |
| False | True | 음성만 연결 |
| False | False | 사람 연결 완전 차단 (AI만 응대) |
# 예: 0번·음성 모두 끄기 (완전 무인 AI 응대)
OPERATOR_TRANSFER_ENABLED = False
OPERATOR_VOICE_ENABLED = False
# 예: 음성 키워드에 표현 추가
OPERATOR_VOICE_KEYWORDS = ["담당자", "상담원", "직원", "사장님 바꿔"]
⚠️ 사람 연결을 모두 꺼도 외부인은 AI 상담은 계속 받습니다. 통화 종료 후 관리자 자동 보고도 그대로 작동합니다. 캘린더 등 민감 기능은 항상 관리자 전용입니다.
다국어 TTS 음성
전화번호 국가코드로 언어를 자동 감지합니다.
| 언어 | TTS 음성 | 자동 감지 국가코드 |
|---|---|---|
| 한국어 | Polly.Seoyeon-Neural | +82 |
| 영어 | Polly.Joanna-Neural | +1, +44, +61, +64 |
| 일본어 | Google.ja-JP-Neural2-B | +81 |
| 중국어 | Google.cmn-CN-Wavenet-A | +86, +886, +852 |
📞 수신전화 자동 보고
외부에서 전화가 걸려오면 AI가 응대한 후 자동으로 관리자에게 보고합니다.
동작 흐름:
외부 전화 수신 → AI 응대 → 대화 기록 추적 → 마지막 대화 60초 후 통화 종료 판단 → 자동 보고
보고 내용 (자동):
① SMS 문자 → 관리자 번호로 80자 요약 발송
② Telegram 알림 → 발신자 이름/번호 + AI 요약
③ PDF 보고서 → 대화 전문 + AI 요약 (
④ 대시보드 기록 → 통화 기록에 자동 저장
보고 예시 (Telegram):
※ 관리자 전화는 보고 대상에서 제외됩니다. 외부 번호만 추적합니다.
※ 연락처에 등록된 번호면 이름이 표시되고, 미등록 번호면 "알 수 없음 + 전화번호"로 표시됩니다.
동작 흐름:
외부 전화 수신 → AI 응대 → 대화 기록 추적 → 마지막 대화 60초 후 통화 종료 판단 → 자동 보고
보고 내용 (자동):
① SMS 문자 → 관리자 번호로 80자 요약 발송
② Telegram 알림 → 발신자 이름/번호 + AI 요약
③ PDF 보고서 → 대화 전문 + AI 요약 (
ENABLE_PDF_REPORT=true 시)④ 대시보드 기록 → 통화 기록에 자동 저장
보고 예시 (Telegram):
📞 [수신전화 보고]👤 발신자: 김철수 (010-1234-5678)📊 내용: 환불 절차 문의. AI가 환불 정책을 안내함. 추가 서류 필요.※ 관리자 전화는 보고 대상에서 제외됩니다. 외부 번호만 추적합니다.
※ 연락처에 등록된 번호면 이름이 표시되고, 미등록 번호면 "알 수 없음 + 전화번호"로 표시됩니다.
🚫 번호 차단
스팸이나 악의적인 전화번호를 차단할 수 있습니다.
채팅에서:
API로:
채팅에서:
👤 010-9999-8888 차단해줘👤 차단 번호 목록 보여줘API로:
curl -X POST http://localhost:5000/block \
-H "X-API-Secret: $(cat ~/OpenWebUI/secrets/api_secret)" \
-H "Content-Type: application/json" \
-d '{"number": "+821099998888"}'
자동 차단: PIN 3회 실패 시 해당 번호가 자동으로 시간제 잠금됩니다.
💬 Telegram에서 전화 기능 사용
Telegram 채팅에서도 OpenWebUI와 동일한 전화 기능을 사용할 수 있습니다.
※ Telegram 브릿지에서 Tool이 활성화되어 있어야 합니다.
👤 김철수에게 전화해줘👤 홍길동에게 "회의 참석 부탁" 문자 보내줘👤 내일 3시에 김철수에게 전화 예약해줘👤 통화 녹음 켜줘👤 연락처 보여줘※ Telegram 브릿지에서 Tool이 활성화되어 있어야 합니다.
⚙️ .env 주요 환경변수
설치 시 자동 생성되는
~/OpenWebUI/.env 파일의 주요 설정값입니다.
| 변수 | 기본값 | 설명 |
|---|---|---|
BOT_MODE | 2 | 1=OpenWebUI 경유, 2=Groq 직결 (빠름) |
MY_PHONE_NUMBER | (설치 시 입력) | 관리자 전화번호 (+82...) |
TWILIO_ACCOUNT_SID | (설치 시 입력) | Twilio 계정 SID |
TWILIO_AUTH_TOKEN | (설치 시 입력) | Twilio 인증 토큰 |
TWILIO_PHONE_NUMBER | (설치 시 입력) | Twilio 발신 번호 |
ADMIN_PIN | (설치 시 입력) | 관리자 전화 인증 PIN 6자리 |
OPENAI_API_KEY | (설치 시 입력) | Groq API 키 |
OPENAI_MODEL | llama-3.3-70b-versatile | AI 대화 모델 |
API_SECRET | (자동 생성) | 내부 API 인증 키 192비트 |
ENABLE_CALL_RECORDING | false | 통화 녹음 ON/OFF |
ENABLE_PDF_REPORT | false | PDF 보고서 ON/OFF |
SERVER_DOMAIN | (설치 시 입력) | 서버 도메인 (Twilio Webhook용) |
# .env 파일 확인
cat ~/OpenWebUI/.env
# 값 수정 후 적용
nano ~/OpenWebUI/.env
cd ~/OpenWebUI && docker compose restart twilio-bot
⏱️ 통화 시간 제한 변경
안부전화(발신)는 기본 4분(240초)에 강제 종료됩니다. 변경하려면 숫자 3개만 수정합니다.
| 설정 | 현재 (4분) | 변경 예시 (6분) |
|---|---|---|
| Twilio 강제 종료 | 240초 | 360초 |
| AI 정리 멘트 시작 | 210초 (3분30초) | 330초 (5분30초) |
# 컨테이너 안 파일 수정 (예: 4분 → 6분)
docker exec -it twilio-bot sh -c "
sed -i 's/time_limit=240/time_limit=360/' /app/twilio_bot.py
sed -i 's/elapsed >= 240/elapsed >= 360/' /app/twilio_bot.py
sed -i 's/elapsed >= 210/elapsed >= 330/' /app/twilio_bot.py
"
# 재시작
cd ~/OpenWebUI && docker compose restart twilio-bot
Docker 재시작하면 원래 값(4분)으로 돌아갑니다. 영구 적용하려면 설치 스크립트의 해당 숫자를 바꾸고 재설치하세요.
📷 미디어 관리 (사진/동영상/음성)
채팅에서 사진, 동영상, 음성 파일을 업로드하고, 저장된 파일을 클릭해서 브라우저로 바로 볼 수 있습니다. 통화 녹음(MP3)과 PDF 보고서도 클릭해서 재생/열기가 가능합니다.
파일 업로드 (브라우저 드래그앤드롭):
브라우저에서
폴더 지정 가능 (예: photos/홍길동) · 파일 크기 제한 없음 · 업로드 완료 시 클릭하면 바로 열림
파일 목록 조회 (채팅에서):
폴더별 조회:
지원 형식:
저장 위치:
녹음 파일:
PDF 보고서:
※ 🔧 미디어 관리 Tool이 활성화되어 있어야 합니다.
파일 업로드 (브라우저 드래그앤드롭):
브라우저에서
http://localhost:8000/upload 접속 → 파일을 드래그앤드롭으로 업로드폴더 지정 가능 (예: photos/홍길동) · 파일 크기 제한 없음 · 업로드 완료 시 클릭하면 바로 열림
파일 목록 조회 (채팅에서):
👤 미디어 파일 보여줘 → 전체 목록👤 녹음 파일 보여줘 → 통화 녹음 목록 (클릭하면 재생)👤 PDF 보고서 보여줘 → 보고서 목록 (클릭하면 열림)폴더별 조회:
👤 홍길동 사진 보여줘 → photos/홍길동 폴더 조회지원 형식:
| 종류 | 형식 | 브라우저 재생 |
|---|---|---|
| 사진 | .jpg .png .gif .webp | ✅ 바로 표시 |
| 동영상 | .mp4 .webm | ✅ 바로 재생 |
| 음성 | .mp3 .wav | ✅ 바로 재생 |
| ✅ 바로 표시 |
저장 위치:
~/ai-share/ (터미널에서도 직접 접근 가능)녹음 파일:
~/OpenWebUI/twilio-bot/data/recordings/ (읽기전용)PDF 보고서:
~/OpenWebUI/twilio-bot/data/reports/ (읽기전용)※ 🔧 미디어 관리 Tool이 활성화되어 있어야 합니다.
📅 캘린더 (조회·등록·수정·삭제) — 채팅·전화·텔레그램 공유
개요
OpenWebUI 내장 캘린더(0.9.0 이상)의 일정을, 채팅·전화·텔레그램·브라우저 에이전트에서 모두 조회하고 새로 등록할 수 있습니다. 캘린더 도구는 설치 시 자동 등록됩니다 (9번째 도구 "캘린더 (조회·등록·수정·삭제)").🔑 키는 한 번만 입력 → 모든 채널이 공유합니다.
🆕 일정 등록 — 말로 캘린더에 넣기
이제 조회뿐 아니라 일정 등록도 됩니다. 날짜·시간·제목은 물론 장소·설명·알림 시간까지 한 번에 기록됩니다.- 전화: "내일 오후 3시에 회의 등록해줘. 설명은 분기보고 자료 준비. 알림은 30분 전에."
- 채팅/텔레그램: 같은 문장을 채팅으로 입력
| 항목 | 말하는 법 | 예 |
|---|---|---|
| 날짜·시간 | "내일 3시", "12월 25일 오후 2시" | 필수 |
| 제목 | "회의", "치과 예약" | 필수 |
| 장소 | "강남역에서", "장소는 3층 회의실" | 선택 |
| 설명 | "설명은 ~~", "내용은 ~~" | 선택 |
| 알림 | "알림 30분 전", "1시간 전에 알림" | 선택(기본 10분) |
💡 설명·알림은 "설명은~", "알림 30분 전"처럼 키워드를 붙여 말하면 정확히 분리됩니다. 그냥 나열하면 AI가 제목에 섞을 수 있습니다.
🆕 일정 수정·삭제 — 등록한 일정 바꾸기·지우기
이제 등록한 일정을 수정하거나 삭제할 수 있습니다. 날짜와 제목으로 대상을 찾습니다.- 수정: "12월 25일 회의를 오후 5시로 바꿔줘" (시간·날짜·제목·장소 중 바꿀 것만 말하면 됩니다)
- 삭제: "12월 25일 회의 삭제해줘"
| 바꾸는 것 | 말하는 법 |
|---|---|
| 시간 | "~회의를 4시로 바꿔줘" |
| 날짜 | "~회의를 26일로 옮겨줘" |
| 제목 | "~회의 제목을 임원회의로 바꿔줘" |
| 장소 | "~회의 장소를 5층으로 바꿔줘" |
💡 같은 날 같은 제목의 일정이 여러 개면, 봇이 되물어 확인합니다. 그날 일정을 먼저 "일정 알려줘"로 조회해 제목을 정확히 확인하면 안전합니다.
✅ 알림 자동 연동 — 시간을 바꾸면 전화·문자 알림도 새 시각으로 자동 재예약되고, 일정을 삭제하면 걸려 있던 알림도 자동 취소됩니다. 옛 시각에 알림이 울리는 일이 없습니다. (알림 밸브가 설정된 경우)
🔔 알림을 전화·문자로 받기
캘린더에 저장되는 알림은 기본적으로 OpenWebUI 화면 팝업/브라우저 알림으로 옵니다(OpenWebUI를 켜둬야 보임). 여기에 더해, 알림 시각에 관리자에게 실제 전화 + 문자가 오도록 예약할 수 있습니다.- 일정 등록 시 알림 시간을 말하면(예: "30분 전"), 그 시각에 본인에게 전화와 SMS가 옵니다.
- 전화로 등록하면 바로 작동합니다(추가 설정 불필요).
- 채팅·텔레그램·브라우저로 등록할 때 전화·문자 알림까지 받으려면 아래 밸브 설정이 필요합니다.
| 도구 밸브 | 넣는 값 |
|---|---|
TWILIO_BOT_SECRET | ~/OpenWebUI/.env 의 API_SECRET 값 |
ENABLE_CALL_SMS_REMINDER | 켜기(기본) / 끄기 |
# .env 에서 API_SECRET 값 확인 (이 값을 밸브에 붙여넣기)
grep API_SECRET ~/OpenWebUI/.env
API_SECRET은 외부에서 발급받는 키가 아니라 설치 시 자동 생성되는 내부 인증 암호입니다. 컨테이너끼리 서로를 확인하는 자물쇠 역할을 하며, .env 파일에 이미 들어 있습니다.🔒 봇이 꺼져 있으면 지난 알림 전화는 오지 않습니다. 알림 시각이 지난 뒤 봇이 켜져도, 지난 알림은 조용히 폐기되어 뒤늦게 쏟아지지 않습니다.
설정 순서 (한 번만)
- OpenWebUI 관리자 로그인 → 설정 → 계정 → API 키 발급
키 형식:
sk-...권장.eyJ...(JWT 토큰)도 작동하지만 만료가 있어 권장하지 않습니다. - 좌측 캘린더(Calendar)에 오늘 일정 등록
- 워크스페이스 → 도구 → "캘린더 (조회·등록·수정·삭제)" → ⚙️ 밸브 →
OPENWEBUI_API_KEY에 키 입력 → 저장🔔 전화·문자 알림까지 쓰려면 같은 밸브의TWILIO_BOT_SECRET에.env의API_SECRET값도 넣어 주세요. - 채팅에서 "오늘 일정 알려줘"를 한 번 실행
⚠️ 이 단계가 핵심입니다. 이때 키가 공유 폴더에 저장되어 전화 봇도 캘린더를 읽을 수 있게 됩니다.
- 이제 전화로 "오늘 일정 알려줘"(조회) 또는 "내일 3시 회의 등록해줘"(등록)
채널별 캘린더 접근 방식
| 채널 | 접근 방식 | 키 입력 위치 |
|---|---|---|
| 채팅 | "캘린더 (조회·등록·수정·삭제)" 도구 직접 호출 (조회+등록) | 그 도구의 밸브 |
| 전화 | "오늘 일정"/"등록해줘" 키워드 감지 → 공유 키로 조회·등록 | (채팅 키 공유받음) |
| 텔레그램 | 모든 도구 자동 활성화 → 캘린더 자동 포함 | (채팅 키 공유받음) |
| 브라우저 에이전트 | "AI 브라우저 에이전트" 도구의 메서드 (조회+등록) | 그 도구의 밸브에 별도 입력 |
브라우저 에이전트만 같은 키를 그 도구 밸브에 한 번 더 넣어야 합니다 (독립 도구). 전화·문자 알림용
TWILIO_BOT_SECRET도 채팅·브라우저 각 도구 밸브에 각각 넣습니다.⚠️ 재발 방지 — 자동 적용됨
캘린더 마운트가 메인 docker-compose.yml에 직접 포함되고.env의 COMPOSE_FILE에 고정됩니다.
덕분에 docker compose up, restart, 서버 재부팅 등 어떤 방식으로 띄워도 캘린더가 항상 연결됩니다.
※ 과거엔 별도 compose 파일이 빠지면 전화가 가짜 일정을 말하는 문제가 있었으나, 현재 버전에서 영구 해결되었습니다.
가짜 일정 방지 (폴백 안전장치)
캘린더 조회가 실패하면 AI가 지어낸 가짜 일정 대신, 원인을 정확히 음성 안내합니다:- 키 미설정 → "캘린더 키가 설정되지 않았습니다…"
- 연결 실패 → "캘린더 서버에 연결하지 못했습니다…"
- 키 만료(JWT) → "키가 만료되었을 수 있으니 새 키로 다시 설정해 주세요"
JWT 키(
eyJ...)를 쓰는 경우 만료 시 위 안내가 나옵니다. sk- 키로 바꾸면 만료 걱정이 없습니다.🆕 채팅 캘린더 15초 타임아웃 방지 (멀티 워커)
채팅에서 캘린더 도구가Read timed out (15초) 오류를 내는 경우가 있었습니다. 원인은 단일 워커 self-call 데드락입니다 — OpenWebUI가 워커 1개로 도구를 실행하는데, 그 도구가 다시 OpenWebUI 자기 API를 부르니 응답할 워커가 없어 막힙니다.
해결 (현재 스크립트에 자동 적용됨): OpenWebUI를 멀티 워커로 실행합니다.
# docker-compose.yml의 open-webui 서비스 environment에 자동 포함됨:
# - UVICORN_WORKERS=4
# 수동 확인
docker exec openwebui-open-webui-1 sh -c 'cat /proc/1/environ | tr "\0" "\n" | grep UVICORN_WORKERS'
워커마다 메모리를 추가로 씁니다. 메모리가 빠듯하면
.env에 UVICORN_WORKERS=2를 넣어 줄일 수 있습니다 (2개로도 데드락 해결). 캘린더 조회 타임아웃도 15→30초로 늘려 일시적 부하에 더 견딥니다.🔐 통화 인증 — 누가 전화를 걸 수 있나
🆕 PIN 폐지 → 등록된 관리자 번호만
이전의 PIN 입력 방식은 완전히 제거되었습니다. 이제 모르는 사람이 전화하면 PIN을 묻지 않고 즉시 차단됩니다 (개인용 모드 기준). 등록된 관리자 번호로 건 전화만 연결됩니다.왜 더 안전한가: PIN은 유출되면 누구나 통과하지만, 번호 방식은 등록된 번호로 실제 전화를 걸어야만 인정됩니다.
두 가지 운영 모드
| 모드 | 모르는 번호가 전화하면 | 캘린더·명령 |
|---|---|---|
| 개인용 (admin-only) | 즉시 차단 | 관리자만 |
| 고객 상담용 (customer-support) | AI가 일반 상담 응대 | 관리자만 (고객은 접근 불가) |
고객 상담용에서도 고객이 "오늘 일정"을 말해도 캘린더에 접근할 수 없습니다. 민감 기능은 관리자 전용으로 분리됩니다.
관리자 번호 vs 연락처 — 헷갈리지 마세요
| 구분 | 무엇 | 방향 |
|---|---|---|
| 관리자 번호 | 설치 시 입력한 내 번호 | 봇에게 전화 거는 권한 |
| 연락처 | 채팅에서 저장한 "김철수…" | 봇이 전화 거는 대상 |
채팅에서 "김철수 저장"해도 김철수가 봇에게 전화하면 차단됩니다(개인용). 김철수가 봇에게 전화하게 하려면 그 번호를 관리자 번호(ADMIN_NUMBERS)에 추가해야 합니다.
🆕 상담원(사람) 연결 — 0번 / 음성
고객 상담 모드에서 외부인이 AI와 대화하다가 사람(관리자)과 통화하고 싶을 때 두 가지 방법이 있습니다:| 방법 | 동작 | 설정 |
|---|---|---|
| 키패드 0번 | 0번 누르면 관리자 휴대폰으로 직통 연결 | OPERATOR_TRANSFER_ENABLED |
| 음성 | "담당자 바꿔줘" 등을 말하면 연결 | OPERATOR_VOICE_ENABLED |
두 방법 모두
ai_config.py에서 독립적으로 켜고 끌 수 있습니다 (위 "ai_config.py 설정" 참고). 모두 끄면 외부인은 AI 상담만 받고 사람에게는 연결되지 않습니다. 단, 통화 후 관리자 자동 보고는 그대로 작동합니다.📊대시보드 전체 안내
시스템에는 두 종류의 대시보드가 있습니다. AI 전화비서 대시보드(포트 5000)와 Telegram 봇 관리 대시보드(포트 8445)입니다.
대시보드 종류 한눈에 보기
| 대시보드 | 포트 | 주요 기능 | 접속 방법 |
|---|---|---|---|
| 📞 AI 전화비서 | :5000/dashboard | 통화 기록·AI 요약·녹음 파일·PDF 보고서 | 채팅 질문 또는 SSH 터널 |
| 🤖 Telegram 봇 관리 | :8445/dashboard | 세션·사용자·Tool·로그·공지·통계 | SSH 터널 또는 Windows 포트포워딩 |
| 🗄️ Qdrant DB | :6333/dashboard | 벡터 DB 저장 현황 | ✅ 로컬에서 직접 접속 |
| 📖 RAG API 문서 | :8000/docs | OpenAPI 엔드포인트 목록·테스트 | ✅ 로컬에서 직접 접속 |
전화비서(:5000)와 Telegram 봇(:8445)은
127.0.0.1에 바인딩되어 외부에서 직접 접근 불가합니다. SSH 터널을 통해 접속합니다.
📞 AI 전화비서 대시보드 (:5000)
방법 1: OpenWebUI / Telegram 채팅창 (가장 간단)
채팅창에서 자연어로 질문합니다.
※ 전화 어시스턴트·통화 녹음 관리·PDF 보고서 관리 Tool이 활성화되어 있어야 합니다.
👤 통화 기록 보여줘👤 최근 통화 목록 알려줘👤 녹음 파일 목록 보여줘👤 PDF 보고서 목록 보여줘※ 전화 어시스턴트·통화 녹음 관리·PDF 보고서 관리 Tool이 활성화되어 있어야 합니다.
방법 2: 단축 명령어 (터미널 — 최초 1회 등록)
# 단축 명령어 등록 (최초 1회)
echo 'alias dashboard="docker exec twilio-bot curl -s http://127.0.0.1:5000/dashboard > /tmp/dashboard.html && explorer.exe \"$(wslpath -w /tmp/dashboard.html)\""' >> ~/.bashrc
source ~/.bashrc
# 이후부터 이것만 입력
dashboard
WSL(Windows) 환경에서만 작동합니다. 녹음·보고서 폴더도 바로 열 수 있습니다:
cd ~/OpenWebUI/twilio-bot/data/recordings/ && explorer.exe . — 녹음 파일 폴더cd ~/OpenWebUI/twilio-bot/data/reports/ && explorer.exe . — PDF 보고서 폴더
🤖Telegram 봇 관리 대시보드 (:8445)
Telegram 봇 전용 웹 관리 대시보드입니다. 세션·사용자·Tool·로그·통계를 브라우저에서 실시간으로 확인합니다. 로컬 전용(127.0.0.1)이므로 SSH 터널 또는 포트포워딩으로 접속합니다.
대시보드 탭 구성
| 탭 | 주요 내용 | 자동 갱신 |
|---|---|---|
| 📊 개요 | 활성 세션 수·메시지 수·차단 수·가동시간·OpenWebUI 연결 상태 | 15초 |
| 👥 세션 | 접속 중인 사용자 목록 — User ID·모델·메시지 수·Tool 수·마지막 활동 | 15초 |
| 👤 사용자 | 허용 사용자 추가/제거·차단 목록 관리·차단 해제 | 수동 |
| 🔧 Tool | 등록된 Tool 목록·세션별 사용 현황·전체 ON/OFF | 수동 |
| 📋 로그 | 줄 수 지정(최대 500)·10초 자동 새로고침 토글 | 선택 |
| 📢 공지 | 모든 활성 사용자에게 메시지 전송 | — |
🔑 인증 토큰 확인
대시보드는 토큰 기반 인증을 사용합니다. 잘못된 토큰을 5회 입력하면 해당 IP가 15분 잠금됩니다.
# 서버에서 토큰 확인
grep INTERNAL_API_SECRET ~/telegram-openwebui-bridge/.env
한 번 입력 후 브라우저에 자동 저장됩니다. Telegram에서는 /admin → 웹 대시보드 버튼으로 토큰 앞부분을 확인할 수 있습니다.
🖥️ 접속 방법 1 — SSH 터널 (보안 권장)
1단계: PC/Mac 터미널에서 SSH 터널 연결
ssh -L 8445:localhost:8445 user@서버IP
2단계: Windows 브라우저에서 접속
http://localhost:8445/dashboard
SSH 터널은 암호화 채널이므로 Nginx HTTPS보다 보안이 강합니다.
🖥️ 접속 방법 2 — Windows 포트포워딩 (WSL2 전용)
WSL2 환경에서는
PowerShell(관리자)에서 포트포워딩을 설정하면 SSH 터널 없이 접속 가능합니다.
PowerShell (관리자)에서 실행:
127.0.0.1:8445가 WSL2 내부 루프백이라 Windows 브라우저에서 직접 접근이 안 됩니다.PowerShell(관리자)에서 포트포워딩을 설정하면 SSH 터널 없이 접속 가능합니다.
PowerShell (관리자)에서 실행:
# WSL2 IP 확인 후 포트포워딩 설정
$wslIP = (wsl hostname -I).Trim().Split()[0]
netsh interface portproxy add v4tov4 listenport=8445 listenaddress=127.0.0.1 connectport=8445 connectaddress=$wslIP
# 설정 확인
netsh interface portproxy show all
이후 Windows 브라우저에서:
http://localhost:8445/dashboard
제거:
netsh interface portproxy delete v4tov4 listenport=8445 listenaddress=127.0.0.1
🖥️ 접속 방법 3 — docker-compose 포트 변경 (가장 간단)
docker-compose.yml의 포트 바인딩을
0.0.0.0으로 변경하면 Windows 브라우저에서 바로 접속 가능합니다.
cd ~/telegram-openwebui-bridge
sed -i 's/127.0.0.1:8445:8445/0.0.0.0:8445:8445/g' docker-compose.yml
docker compose restart
이후 Windows 브라우저에서 http://localhost:8445/dashboard 접속.
⚠️ 주의: 0.0.0.0 바인딩 시 같은 네트워크의 다른 기기에서도 접근 가능합니다. UFW에서 8445 포트를 차단하거나 사용 후 127.0.0.1로 되돌리세요.
📱 Telegram 명령어로 대신하기
대시보드의 대부분 기능은 Telegram 명령어로 대체 가능합니다.
| 웹 탭 | Telegram 명령어 |
|---|---|
| 📊 개요 | /admin → 현황 | /stats | /status |
| 👥 세션 | /users |
| 👤 사용자 | /adduser | /block | /unblock |
| 🔧 Tool | /tools |
| 📋 로그 | /logs | /logs 50 |
| 📢 공지 | /broadcast 메시지 |