클릭하여 터미널 활성화

Ollama + Open WebUI 설치 | 로컬 LLM 서버 구축 완전 가이드

// macOS · Ollama · Qwen 2.5 14B · Open WebUI · LLM 로컬 서버
로컬 LLM 서버 구축 — Ollama + Qwen 2.5 14B + Open WebUI 브라우저 인터페이스

왜 로컬 LLM인가

GPT API 쓰면 돈 나간다. 쿼리 하나하나가 비용이고, 민감한 데이터를 외부로 보내야 한다.

"내 서버에서 돌리면 공짜고, 데이터가 밖으로 안 나간다."

Ollama로 Qwen 2.5 14B 모델 올리고, Open WebUI로 브라우저에서 바로 쓸 수 있게 만들었다. API 키 없이, 인터넷 연결 없이, 완전히 로컬에서 돌아간다.

작업 환경
OS          : macOS (Apple Silicon)
패키지 관리 : Homebrew
LLM 서버   : Ollama
모델       : Qwen 2.5 14B (~9GB)
웹 UI      : Open WebUI

구성 전 / 후

BEFORE
LLM     : 외부 API (GPT, Claude)
비용     : 쿼리당 과금
프라이버시: 데이터 외부 전송
인터페이스: 없음
AFTER
LLM     : Ollama 로컬 서버
비용     : 무료 (전기세만)
프라이버시: 완전 로컬, 외부 전송 없음
인터페이스: Open WebUI (브라우저)

기술 스택

LLM RUNTIME
Ollama
로컬 LLM 서버 / API :11434
MODEL
Qwen 2.5 14B
Alibaba / 9GB / 한국어 지원
WEB UI
Open WebUI
ChatGPT 스타일 브라우저 인터페이스
PROXY
webui_proxy.py
localhost only 접근 제한

포트 구조

PORT MAP
:11434Ollama API0.0.0.0 (주의)
:18080Open WebUI127.0.0.1 only
:8080 Proxy127.0.0.1 only ← 브라우저 접속
PART 1 — Ollama 설치 + Qwen 2.5 14B

Ollama 설치

Homebrew로 설치한다. 설치 후 서비스로 등록하면 재부팅해도 자동으로 뜬다.

macOS Terminal
# Ollama 설치
user@mac:~$ brew install ollama
# 서비스 시작 (재부팅 시 자동 실행)
user@mac:~$ brew services start ollama
# 정상 실행 확인
user@mac:~$ brew services list | grep ollama
ollama  started
user@mac:~$ curl http://localhost:11434/api/tags
{"models":[]} ← 연결 성공

Qwen 2.5 14B 모델 다운로드

약 9GB다. 네트워크 속도에 따라 10~30분 걸린다. 다운로드 중에 터미널 닫으면 처음부터 다시 시작이니 그냥 놔두면 된다.

macOS Terminal
# 모델 다운로드 (~9GB)
user@mac:~$ ollama pull qwen2.5:14b
pulling manifest...
pulling [===========> ] 45% ▕ 4.1 GB/9.0 GB
# 다운로드 완료 후 목록 확인
user@mac:~$ ollama list
NAME            SIZE
qwen2.5:14b    8.99 GB
💡
다른 모델도 가능
용량이 부담스러우면 ollama pull qwen2.5:7b (4GB) 이나 ollama pull llama3.2:3b (2GB) 도 괜찮다. ollama search 로 전체 모델 목록 확인 가능.

모델 동작 테스트

macOS Terminal
# CLI 테스트
user@mac:~$ ollama run qwen2.5:14b "안녕하세요"
안녕하세요! 무엇을 도와드릴까요?
# API 테스트
user@mac:~$ curl http://localhost:11434/api/generate \
-d '{"model":"qwen2.5:14b","prompt":"Hello","stream":false}'
{"response":"Hello! How can I help you?",...}
PART 2 — Open WebUI 설치

Python 3.11 설치

Open WebUI는 최신 Python(3.12+)과 호환이 안 된다. 3.11을 따로 설치해야 한다.

macOS Terminal
user@mac:~$ brew install python@3.11
user@mac:~$ /opt/homebrew/bin/python3.11 --version
Python 3.11.x
⚠️
삽질 포인트 — Python 버전 호환 문제
macOS 기본 Python(3.13, 3.14)으로 pip install open-webui 하면 빌드 오류 난다. 반드시 3.11 버전으로 설치해야 한다.

Open WebUI 설치 + 실행

macOS Terminal
# python3.11 pip으로 설치
user@mac:~$ /opt/homebrew/bin/pip3.11 install open-webui
# 백그라운드 실행 (127.0.0.1:18080)
user@mac:~$ DATA_DIR=~/openwebui_data \
WEBUI_SECRET_KEY="$(openssl rand -hex 32)" \
nohup /opt/homebrew/bin/open-webui serve \
--host 127.0.0.1 --port 18080 \
> /tmp/openwebui.log 2>&1 &
# 로그 확인
user@mac:~$ tail -f /tmp/openwebui.log
INFO:      Application startup complete.
💡
WEBUI_SECRET_KEY 주의
openssl rand -hex 32 로 강력한 랜덤 키를 쓰자. "secret123" 같은 키는 보안상 위험하다.

Open WebUI 초기 설정

브라우저에서 접속해서 계정을 만들고 Ollama API를 연결한다.

설정 순서
01http://localhost:18080 접속
02관리자 계정 생성 (최초 접속 시 자동으로 관리자 권한)
03설정 → 연결 → Ollama APIhttp://localhost:11434
04모델 선택qwen2.5:14b
05새 채팅 → 대화 테스트
PART 3 — 외부 접근 차단 (리버스 프록시)

왜 프록시가 필요하냐면

Open WebUI를 --host 127.0.0.1로 실행해도 실제로는 0.0.0.0에 바인딩된다.

"같은 네트워크 다른 기기에서 IP:18080으로 들어올 수 있다."

해결책은 간단하다. Python으로 127.0.0.1:8080에만 바인딩된 리버스 프록시를 만들고, 브라우저는 그쪽으로 접속하게 한다.

webui_proxy.py 작성

~/webui_proxy.py
import http.server, urllib.request, socketserver, urllib.error
PROXY_HOST = "127.0.0.1" # 외부 접근 차단
PROXY_PORT = 8080
TARGET    = "http://127.0.0.1:18080"
class ProxyHandler(http.server.BaseHTTPRequestHandler):
def do_request(self):
url = TARGET + self.path
req = urllib.request.Request(url, headers=dict(self.headers))
with urllib.request.urlopen(req) as r:
self.send_response(r.status)
self.end_headers()
self.wfile.write(r.read())
do_GET = do_POST = do_PUT = do_DELETE = do_request
server = socketserver.TCPServer((PROXY_HOST, PROXY_PORT), ProxyHandler)
server.serve_forever()
macOS Terminal
# 프록시 백그라운드 실행
user@mac:~$ nohup python3 ~/webui_proxy.py > /tmp/webui_proxy.log 2>&1 &
# 바인딩 확인 (127.0.0.1만 표시되면 성공)
user@mac:~$ lsof -i :8080
Python  [PID] ... TCP localhost:8080 (LISTEN)
# 외부 접근 차단 테스트
user@mac:~$ curl http://192.168.x.x:8080
Connection refused ← 차단 성공 ✓
user@mac:~$ curl http://localhost:8080
접속 성공 ✓
PART 4 — 서비스 관리 스크립트

start / stop / status 스크립트

서비스가 3개라서 매번 수동으로 켜고 끄면 귀찮다. 스크립트로 묶어두면 한 방에 된다.

~/start_all.sh
#!/bin/bash
echo "=== 서비스 시작 ==="
# 1. Ollama
brew services start ollama
# 2. Open WebUI
DATA_DIR=~/openwebui_data WEBUI_SECRET_KEY="your_key" \
nohup /opt/homebrew/bin/open-webui serve \
--host 127.0.0.1 --port 18080 > /tmp/openwebui.log 2>&1 &
# 3. 프록시
nohup python3 ~/webui_proxy.py > /tmp/webui_proxy.log 2>&1 &
echo "완료 — http://localhost:8080 접속"
~/stop_all.sh
#!/bin/bash
brew services stop ollama
pkill -f "open-webui"
pkill -f "webui_proxy"
echo "전체 서비스 중지 완료"
~/status.sh
#!/bin/bash
brew services list | grep ollama
pgrep -f "open-webui" && echo "WebUI: running" || echo "WebUI: stopped"
pgrep -f "webui_proxy" && echo "Proxy: running" || echo "Proxy: stopped"
lsof -i :8080 -i :11434 -i :18080 | grep LISTEN
macOS Terminal
# 실행 권한 부여 (최초 1회)
user@mac:~$ chmod +x ~/start_all.sh ~/stop_all.sh ~/status.sh
# 사용
user@mac:~$ ~/start_all.sh
user@mac:~$ ~/status.sh
user@mac:~$ ~/stop_all.sh

트러블슈팅

🔴
open-webui pip 설치 빌드 오류
원인: Python 3.12+ 호환 안 됨 → 해결: brew install python@3.11pip3.11 으로 설치
🔴
SECRET_KEY 파일 읽기 오류
원인: /.webui_secret_key 쓰기 권한 없음 → 해결: DATA_DIR=~/openwebui_data + WEBUI_SECRET_KEY 환경변수 직접 지정
🔴
Open WebUI --host 127.0.0.1 무시됨
원인: 옵션 무관하게 0.0.0.0에 바인딩됨 → 해결: Python 리버스 프록시(webui_proxy.py)로 127.0.0.1:8080만 허용
🔴
nohup 로그 파일에 아무것도 안 찍힘
원인: Python 출력 버퍼링 → 해결: python3 -u (unbuffered) + PYTHONUNBUFFERED=1 환경변수
🔴
Qwen 한국어 질문에 중국어로 답변
원인: Qwen은 중국어 기반 모델 → 해결: 시스템 프롬프트에 "NEVER use Chinese characters under any circumstances" 추가

전체 흐름 요약

FULL SETUP FLOW
── Ollama ──────────────────────────────────
01brew install ollama + brew services start ollama
02ollama pull qwen2.5:14b (~9GB 다운로드)
03ollama run qwen2.5:14b → 응답 확인
── Open WebUI ──────────────────────────────
04brew install python@3.11
05pip3.11 install open-webui
06open-webui serve --host 127.0.0.1 --port 18080
07http://localhost:18080 → 계정 생성 + Ollama 연결
── 외부 접근 차단 ──────────────────────────
08webui_proxy.py 작성 + 실행 (127.0.0.1:8080)
09http://localhost:8080 → 브라우저 접속 확인
10start_all.sh / stop_all.sh / status.sh 등록
// 결론
API 키 없이, 인터넷 없이, 완전히 로컬에서 돌아간다.
Ollama + Qwen 2.5 14B + Open WebUI, 이게 전부다.
Tags: #Ollama #Qwen #OpenWebUI #로컬LLM #macOS #LLM서버 #AI서버구축 #Homebrew