Rocky Linux 9 로컬 LLM 구축 Ollama Open WebUI Docker 설정

·

, ,

로컬 LLM을 집 서버에 올리는 이유

로컬 AI를 한 번 구성해두면 생각보다 자주 쓰게 됩니다. 외부 API 키를 넣지 않아도 되고, 테스트하다가 토큰 비용이 쌓일 걱정도 없습니다. 홈서버에 붙여두기 좋은 서비스였습니다.

로컬 서버 구축 분위기

제가 로컬 LLM에 관심을 둔 가장 큰 이유는 프라이버시와 API 비용이었습니다.

ChatGPT나 Claude 같은 서비스를 쓰면 편하지만, 개인 메모나 내부 문서 내용을 넣을 때는 한 번 더 생각하게 됩니다. 반대로 Ollama는 모델을 서버 안에 내려받아 실행하는 방식이라, 기본적인 질의응답은 외부 API 없이 처리할 수 있습니다.

물론 성능은 하드웨어를 많이 탑니다. 그래도 간단한 요약, 코드 초안, 개인용 질의응답 정도라면 Rocky Linux 9 + Docker + Ollama + Open WebUI 조합이 꽤 깔끔합니다.

공식 문서는 아래를 기준으로 확인하면 됩니다.

구분 링크 확인할 내용
Rocky Linux Rocky Linux 공식 사이트 Rocky Linux 9 ISO, 릴리즈 정보
Docker Docker Engine 설치 문서 Docker 및 Compose v2 설치
Ollama Ollama Linux 설치 Linux 설치 명령과 모델 실행
Open WebUI Open WebUI Quick Start Docker 실행, Compose 예시

사전 준비는 Rocky 9와 Docker부터

이 글은 Rocky Linux 9.x에 Docker와 Compose v2가 설치된 상태를 기준으로 정리했습니다. Docker Compose는 예전의 docker-compose가 아니라 docker compose처럼 띄어 쓰는 v2 방식으로 진행합니다.

먼저 서버에서 Docker가 정상 동작하는지 확인합니다.

bash

docker --version
docker compose version
systemctl status docker

방화벽을 사용 중이라면 나중에 Open WebUI 접속용으로 3000번 포트를 열어야 합니다. Ollama의 기본 포트는 11434인데, 외부에 직접 열기보다는 Docker 네트워크 내부에서만 쓰는 편이 낫습니다.

서버 작업 환경

Ollama 설치와 모델 Pull

Ollama는 호스트에 직접 설치할 수도 있고, Docker 컨테이너로 띄울 수도 있습니다. 홈서버에서 관리하기에는 Docker Compose로 함께 묶는 방식이 편했습니다.

먼저 감을 보고 싶다면 호스트에 설치한 뒤 모델을 받아 테스트해도 됩니다.

bash

curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2
ollama run llama3.2

모델 이름은 시점에 따라 바뀔 수 있으니, 실제 사용 전에는 Ollama 공식 라이브러리에서 한 번 확인하는 편이 좋습니다. 입문용으로는 llama3.2, 가벼운 서버라면 더 작은 모델부터 시작하는 것이 부담이 적습니다.

모델 목록은 이렇게 확인합니다.

bash

ollama list

Open WebUI Docker Compose 작성

Open WebUI는 브라우저에서 ChatGPT처럼 사용할 수 있게 해주는 웹 UI입니다. 공식 문서에서도 Docker 방식을 안내하고 있고, 데이터는 볼륨에 남기는 구조가 기본입니다.

저는 Ollama와 Open WebUI를 같은 compose 파일에 두는 구성이 가장 단순했습니다.

yaml

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    restart: unless-stopped
    volumes:
      - ollama:/root/.ollama
    ports:
      - "127.0.0.1:11434:11434"

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    depends_on:
      - ollama
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
      - WEBUI_SECRET_KEY=change-this-to-a-long-random-string
    volumes:
      - open-webui:/app/backend/data

volumes:
  ollama:
  open-webui:

여기서 중요한 부분은 OLLAMA_BASE_URL=http://ollama:11434 입니다. 컨테이너 안에서 localhost:11434를 바라보면 Open WebUI 자기 자신을 가리키게 되어 연결이 되지 않습니다.

실행은 compose 파일이 있는 디렉터리에서 합니다.

bash

docker compose up -d
docker ps
docker logs -f open-webui
도커 컨테이너 운영 이미지

firewalld와 SELinux에서 막히는 지점

Rocky Linux 9에서 Ubuntu 기준 글과 차이가 나는 부분은 이 지점이었습니다. 컨테이너는 떠 있는데 브라우저 접속이 안 되거나, 볼륨을 바인드 마운트했을 때 권한 에러가 나는 경우가 있습니다.

외부 브라우저에서 접속할 예정이라면 firewalld에 3000번 포트를 열어줍니다.

bash

sudo firewall-cmd --add-port=3000/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

SELinux는 named volume을 쓰면 대체로 조용합니다. 하지만 아래처럼 호스트 디렉터리를 직접 붙이면 에러가 날 수 있습니다.

yaml

volumes:
  - ./open-webui-data:/app/backend/data

이때 로그에는 이런 식으로 남는 경우가 있습니다.

bash

PermissionError: [Errno 13] Permission denied: '/app/backend/data'

또는 audit 로그에서 AVC deny가 확인됩니다.

bash

sudo ausearch -m avc -ts recent

바인드 마운트를 꼭 써야 한다면 :Z 옵션을 붙여 SELinux 컨텍스트를 컨테이너에 맞춰줍니다.

yaml

volumes:
  - ./open-webui-data:/app/backend/data:Z

이미 만들어둔 디렉터리라면 권한도 같이 확인합니다.

bash

mkdir -p ./open-webui-data
sudo chown -R 1000:1000 ./open-webui-data

Rocky 계열에서는 이 부분을 빼먹으면 원인 찾는 데 시간이 꽤 걸립니다. 방화벽은 접속 문제, SELinux는 파일 접근 문제로 나눠서 보면 훨씬 빨리 좁힐 수 있습니다.

접속 테스트와 첫 모델 확인

브라우저에서 아래 주소로 접속합니다.

text

http://서버IP:3000

처음 접속하면 계정을 만들고, 관리자 화면에서 Ollama 연결 상태를 확인합니다. compose에서 OLLAMA_BASE_URL을 제대로 넣었다면 별도 설정 없이 모델 목록이 잡히는 편입니다.

웹 UI 접속 확인 화면 분위기

모델이 보이지 않으면 먼저 Ollama 컨테이너 안에서 pull을 실행합니다.

bash

docker exec -it ollama ollama pull llama3.2
docker exec -it ollama ollama list

Open WebUI 로그에서 연결 실패가 보이면 URL 설정을 다시 확인합니다.

bash

docker logs open-webui --tail=100

자주 만나는 메시지는 대략 이런 형태입니다.

bash

httpx.ConnectError: [Errno 111] Connection refused

이 경우 대부분 Open WebUI가 Ollama를 localhost로 찾고 있거나, 두 컨테이너가 같은 Docker 네트워크에 있지 않은 상황이었습니다.

사양별 체감 속도와 선택 기준

로컬 LLM은 설치보다 사양 선택에서 기대치를 맞추는 일이 더 중요합니다. 특히 CPU만 있는 서버와 GPU가 있는 서버는 체감 차이가 큽니다.

제품명 가격대 주요 특징 추천 대상
Oracle Cloud ARM Free Tier 무료 가능 비용 부담은 거의 없지만 LLM 추론은 느린 편 테스트용, 가벼운 모델 실험
Intel N100 미니 PC 10만~20만원대 전력 소모가 낮고 24시간 운영 부담이 적음 홈서버 입문, 문서 요약 위주
Ryzen 5급 미니 PC 30만~50만원대 CPU 추론 기준으로 N100보다 여유 있음 개인용 AI 서버, 여러 서비스 병행
RTX 3060 12GB 데스크톱 중고가 변동 VRAM 12GB로 7B급 모델 운용이 수월함 응답 속도 중시, 로컬 AI 주사용
RTX 4060 Ti 16GB 데스크톱 가격 변동 큼 VRAM 여유가 있어 모델 선택 폭이 넓음 장기적으로 로컬 LLM을 자주 쓸 사람

제휴 링크를 넣는다면 표의 제품명이나 가격대 옆에 붙이는 방식이 자연스럽습니다. 다만 서버 부품은 가격 변동이 심하므로, 글을 발행할 때 실제 판매가와 재고를 한 번 더 확인하는 편이 좋습니다.

홈서버 하드웨어 선택 분위기

마무리 운영 포인트

Rocky Linux 9에서 Ollama와 Open WebUI를 Docker로 묶으면 관리 자체는 단순합니다. 핵심은 Ollama 주소를 컨테이너 네트워크 기준으로 잡는 것, 그리고 firewalld와 SELinux를 Rocky 방식대로 처리하는 것입니다.

처음부터 큰 모델을 올리기보다 llama3.2 같은 모델로 접속과 응답 흐름을 먼저 확인하고, 그다음 하드웨어에 맞춰 모델을 바꾸는 순서가 덜 피곤했습니다. 로컬 AI는 한 번에 완성하는 서비스라기보다, 홈서버에 하나 얹어두고 천천히 손에 맞게 조정하는 쪽에 가깝습니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다