⑥ 클라우드

OpenWebUI + Twilio AI 전화비서 + AI 브라우저 에이전트 + Telegram 통합 설치 가이드

Ubuntu → OpenWebUI + Browser Agent v7 + Telegram 원클릭 설치 | 보안 91항목 · 스트리밍 · 예약

🤖 OpenWebUI 💬 Telegram 🌐 Browser Agent v7 🔒 보안 91항목
Phase2 44 + Browser Agent 21 + Telegram 봇 26
CLOUD DEPLOY

☁️24시간 클라우드 배포 설치법

로컬(WSL/PC)이 아닌 클라우드 서버에 설치하면 24시간 365일 중단 없이 운영할 수 있습니다. 아래 순서대로 따라 하세요.

왜 클라우드인가?

항목로컬 PC / WSL클라우드 서버
24시간 가동❌ PC 끄면 중단✅ 항상 켜짐
고정 공인 IP❌ IP 수시 변경✅ 고정 IP
Twilio 연동⚠️ ngrok 필요✅ 직접 연결
보안 등급★★☆☆☆★★★★☆ (CF Tunnel 시 ★★★★★)
전기/인터넷내가 부담클라우드 부담
PROVIDER

🏷️추천 클라우드

클라우드무료 사양비용
Oracle Cloud Always FreeARM 4코어 / 24GB RAM / 200GB 디스크완전 무료 (영구)
AWS EC2t2.micro (1코어/1GB) — RAM 부족t3.medium 월 $30~40
Google Cloude2-micro (1코어/1GB) — RAM 부족e2-medium 월 $25~35
이 스크립트 권장 사양: CPU 2코어 + RAM 4GB 이상. Oracle Cloud Free(4코어/24GB)는 권장 사양을 3배 초과하며 완전 무료입니다.
INSTALL

🚀설치 방법 (Oracle Cloud 기준)

Step 1: Oracle Cloud 인스턴스 생성

① Oracle Cloud 가입: cloud.oracle.com → 계정 생성 (신용카드 필요, 과금 없음)
로그인 → Compute → Instances → Create Instance
③ Image: Ubuntu 22.04 또는 24.04 선택
④ Shape: Ampere A1 (ARM) → OCPUs: 4, Memory: 24GB (Always Free 범위)
⑤ SSH Key: 공개키 업로드 또는 자동 생성 → 개인키 다운로드 보관
Create → 인스턴스 생성 완료 (Public IP 확인)

Step 2: 방화벽 포트 열기

Oracle Cloud는 기본적으로 모든 포트가 차단되어 있습니다. 2곳에서 열어야 합니다.

① Security List (Oracle 웹 콘솔):
Networking → VCN → 서브넷 클릭 → Security List → Ingress Rules → Add Rules
Source: 0.0.0.0/0 / Protocol: TCP / Destination Port: 80 → 추가
Source: 0.0.0.0/0 / Protocol: TCP / Destination Port: 443 → 추가

② OS iptables (SSH 접속 후):
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 6 -m state --state NEW -p tcp --dport 443 -j ACCEPT
sudo netfilter-persistent save
Cloudflare Tunnel을 사용하면 이 Step 2 전체가 필요 없습니다. 포트를 열지 않아도 외부 접속이 가능합니다.

Step 3: 스크립트 실행

로컬과 동일한 스크립트를 그대로 실행합니다. API 키만 입력하면 자동 설치됩니다.
📥 스크립트 다운로드 페이지
# SSH 접속
ssh -i 개인키.pem ubuntu@서버공인IP

# 서버에서 직접 다운로드 + 실행 (원클릭)
# 스크립트 위치에서 다운로드 → 내용 확인 후 실행
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

Step 4: Cloudflare Tunnel 설정 (선택 — 강력 권장)

스크립트 마지막에 Cloudflare Tunnel 설정 여부를 묻습니다. y를 선택하면:

✅ HTTPS 자동 적용 (인증서 자동 발급·갱신)
✅ DDoS 방어 + WAF 추가
✅ 포트 개방 불필요 (Step 2 전체 생략 가능)
✅ 서버 공인 IP 노출 없음
✅ 보안 등급 ★★★★☆ → ★★★★★

※ 로컬에서 먼저 테스트한 후, 만족스러우면 클라우드로 옮기는 것을 권장합니다.
👉 Cloudflare Tunnel의 개념·설정·검증·문제 해결은 아래 Cloudflare Tunnel 자세히 섹션을 참고하세요.
CLOUDFLARE TUNNEL

🛡️Cloudflare Tunnel 자세히

Cloudflare Tunnel(구 Argo Tunnel)은 서버에서 Cloudflare로 나가는 아웃바운드 연결만으로 외부 트래픽을 받는 방식입니다. 서버의 포트를 전혀 열지 않고도 안전하게 HTTPS 서비스를 공개할 수 있습니다.

🔑 한눈에 보는 개념

서버에서 cloudflared라는 작은 데몬이 Cloudflare 엣지로 암호화된 연결을 먼저 걸어둡니다(아웃바운드). 사용자가 도메인에 접속하면 Cloudflare가 그 연결을 통해 트래픽을 서버로 전달합니다. 따라서 인바운드 포트(80·443)를 열 필요가 없고, 서버의 공인 IP도 외부에 노출되지 않습니다.
일반 방식: 인터넷 → (열린 80/443 포트) → 내 서버  ❗IP·포트 노출
Tunnel 방식: 내 서버 → (아웃바운드) → Cloudflare 엣지 ← 인터넷  ✅포트·IP 비노출

✨ 주요 장점

항목설명
포트 개방 불필요방화벽·Security List에서 80/443을 열지 않아도 됨 (Step 2 생략 가능)
공인 IP 은닉실제 서버 IP가 노출되지 않아 직접 공격(스캔·DDoS) 표적이 되지 않음
HTTPS 자동Cloudflare가 SSL/TLS 인증서를 자동 발급·갱신 (Let's Encrypt 수동 설정 불필요)
DDoS·WAFCloudflare의 글로벌 DDoS 방어와 WAF(웹 방화벽) 규칙을 그대로 활용
고정 IP 불필요서버 IP가 바뀌어도 터널이 자동 재연결 — 가정용 회선·동적 IP에서도 동작
무료Cloudflare 무료 플랜에서도 Tunnel 사용 가능 (도메인만 있으면 됨)

📋 사전 준비물

Cloudflare 계정 (무료) — dash.cloudflare.com
본인 소유 도메인 1개 (예: example.com) — 네임서버를 Cloudflare로 변경해 등록
설치 대상 서버 (이 가이드의 OpenWebUI 서버)
도메인의 네임서버(NS)가 Cloudflare를 가리키도록 먼저 변경되어 있어야 합니다. 도메인 등록 직후에는 전파(최대 24시간)가 끝나야 터널 DNS가 정상 동작합니다.

🚀 설정 방법 A — 설치 스크립트 자동 (가장 쉬움)

이 가이드의 설치 스크립트는 Cloudflare Tunnel을 자동으로 구성합니다. 미리 발급한 Tunnel 토큰만 붙여넣으면 됩니다.

대시보드에서 터널 생성 + 토큰 발급

Cloudflare 대시보드 → Zero TrustNetworks → Tunnels
Create a tunnel → 유형은 Cloudflared 선택 → 터널 이름 입력 (예: openwebui)
생성 후 표시되는 설치 명령에서 --token 뒤의 긴 토큰 문자열(eyJhIjoi...)을 복사
이 토큰을 설치 스크립트의 "CF Tunnel Token" 입력 단계(설치 ⑮번)에 붙여넣기

공개 호스트네임(Public Hostname) 연결

같은 터널 화면의 Public Hostname 탭에서 도메인과 내부 서비스를 연결합니다.
설정 항목입력 예시설명
Subdomainchat접속할 주소 (선택)
Domainexample.comCloudflare에 등록한 도메인
Service TypeHTTP내부는 평문 HTTP로 충분
URLlocalhost:3000OpenWebUI 내부 주소
저장하면 https://chat.example.com 으로 OpenWebUI에 접속됩니다. DNS 레코드(CNAME)는 Cloudflare가 자동 생성합니다.
설치 스크립트가 cloudflared 컨테이너를 자동 실행하고 토큰으로 터널을 연결합니다. 별도 명령 없이 끝납니다.

🔧 설정 방법 B — 수동 설치 (스크립트를 쓰지 않을 때)

이미 운영 중인 서버에 직접 붙이거나, 동작 원리를 이해하고 싶을 때 사용합니다.

# 1) cloudflared 설치 (Debian/Ubuntu)
curl -L --output cloudflared.deb \
  https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb

# 2) Cloudflare 로그인 (브라우저로 도메인 인증)
cloudflared tunnel login

# 3) 터널 생성 (이름 지정)
cloudflared tunnel create openwebui

# 4) DNS 라우팅 연결 (도메인 → 터널)
cloudflared tunnel route dns openwebui chat.example.com

설정 파일 (config.yml)

여러 서비스를 한 터널로 묶으려면 ~/.cloudflared/config.yml에 라우팅 규칙을 작성합니다.

# ~/.cloudflared/config.yml
tunnel: openwebui
credentials-file: /home/ubuntu/.cloudflared/<터널ID>.json

ingress:
  # OpenWebUI 메인
  - hostname: chat.example.com
    service: http://localhost:3000
  # (선택) Telegram 봇 대시보드 등 추가 가능
  - hostname: bot.example.com
    service: http://localhost:8445
  # 마지막은 반드시 catch-all 404
  - service: http_status:404

서비스로 등록 (24시간 자동 실행)

# systemd 서비스로 등록 → 재부팅 후에도 자동 시작
sudo cloudflared service install
sudo systemctl enable --now cloudflared

# 상태 확인
sudo systemctl status cloudflared

✅ 연결 검증

# 터널 목록·상태 확인 (healthy 면 정상)
cloudflared tunnel list
cloudflared tunnel info openwebui

# 도메인 접속 테스트 (200 응답이면 정상)
curl -I https://chat.example.com
브라우저에서 https://chat.example.com 접속 시 OpenWebUI 로그인 화면이 HTTPS(자물쇠 표시)로 열리면 성공입니다.

🆘 자주 겪는 문제

증상원인 / 해결
error="dial tcp ... connection refused"내부 서비스가 안 떠 있음 → docker compose ps로 컨테이너 Up 확인, URL의 포트(3000) 재확인
도메인 접속 시 1033 Tunnel errorcloudflared가 중지됨 → sudo systemctl restart cloudflared 후 상태 확인
DNS가 안 잡힘 (NXDOMAIN)네임서버 전파 미완 또는 CNAME 누락 → Cloudflare DNS 탭에서 해당 호스트의 CNAME(프록시 켜짐) 존재 확인
접속은 되는데 인증서 경고호스트네임 오타 또는 Cloudflare 프록시(주황 구름) 꺼짐 → DNS 레코드 프록시 ON
토큰이 만료/유출됨대시보드에서 터널 토큰 재발급(Refresh) → 새 토큰으로 컨테이너/서비스 재시작
보안 팁: Tunnel 토큰은 사실상 비밀번호입니다. 공개 저장소·채팅에 붙여넣지 말고, 유출 시 즉시 대시보드에서 재발급하세요. 추가로 Zero Trust의 Access 정책을 걸면 특정 이메일·그룹만 접속하도록 인증 게이트를 둘 수 있습니다.