
Moodle 4.5 × 로컬 LLM (Ollama)로 AI 기능을 완전히 내재화하는 방법【제2탄】
요약
Moodle 4.5 환경에서 Ollama를 활용해 로컬 LLM을 구축함으로써 데이터 프라이버시를 보호하고 API 비용을 절감하는 방법을 소개합니다. 외부 서버로 데이터를 전송하지 않고 온프레미스 또는 VPS 내에서 AI 기능을 완전히 내재화하는 구성 방식을 다룹니다.
핵심 포인트
- Ollama를 통한 로컬 LLM 구축으로 데이터 프라이버시 완벽 보호
- OpenAI API와 호환되는 엔드포인트를 제공하여 기존 도구 활용 가능
- 클라우드 AI 대비 추가적인 API 호출 비용 발생 없음
- Docker를 활용한 간편한 셀프 호스팅 및 서비스 구성
이전 기사(제1탄)에서는 Moodle 4.5에 OpenAI (ChatGPT) API를 연동하여 AI 기능을 사용하는 방법을 소개했습니다.
클라우드 AI와의 연동은 간편하고 강력하지만, 한 가지 과제가 남습니다.
학습자가 입력한 텍스트는 OpenAI의 서버로 전송됩니다.
성적 정보·사내 자료·개인 정보가 포함된 콘텐츠를 AI로 처리하고 싶은 경우, 이 데이터의 외부 전송은 무시할 수 없는 문제입니다.
본 기사에서는 그 해결책으로서, AI를 Moodle과 동일한 서버 내에서 구동하는 「로컬 LLM (Local LLM)」 구성을 소개합니다. 데이터는 외부로 나가지 않으며, API 비용도 제로입니다.
| 제1탄 (OpenAI) | 제2탄 (Ollama) |
|---|---|
| 데이터 전송 대상 | OpenAI 서버 |
| ... | |
| 본 기사가 상정하는 환경에 대하여 |
본 기사는 온프레미스 (On-premise) 서버 또는 클라우드 상의 VPS·전용 서버에서 Docker를 사용하여 셀프 호스팅(Self-hosting)하고 있는 Moodle 환경을 전제로 합니다.
MoodleCloud와 같은 SaaS형 Moodle을 이용하는 경우, 서버에 직접 접근할 수 없기 때문에 본 기사에서 소개하는 구성(Moodle과 Ollama를 동일 네트워크 내에 공존시키는 방식)은 그대로는 불가능합니다.
SaaS형을 이용하시는 분은 먼저 제1탄에서 소개한 OpenAI API와의 연동을 검토해 주시기 바랍니다.
Cloudflare Tunnel이나 ngrok와 같은 터널링 (Tunneling) 도구를 사용하여 Ollama의 엔드포인트 (Endpoint)를 HTTPS로 공개하면, SaaS형 Moodle에서도 Ollama에 접속하는 것이 기술적으로 가능합니다.
SaaS Moodle → HTTPS → Cloudflare Tunnel → 자사 서버의 Ollama
단, 이 구성에서는 데이터가 인터넷을 경유하기 때문에 「완전한 로컬 완결」은 되지 않습니다. 또한 Ollama를 인터넷에 공개할 경우에는 액세스 제한 설정이 필수입니다.
로컬 LLM을 선택하는 주요 동기가 데이터 프라이버시(Data Privacy)라면, 이 방법은 그 목적을 완전히 충족할 수 없습니다. 셀프 호스팅 환경으로의 이전을 검토할 가치가 있습니다.
LLM (Large Language Model: 대규모 언어 모델)이란, ChatGPT나 Claude와 같이 자연스러운 문장을 생성·이해할 수 있는 AI의 핵심 기술입니다.
통상적으로 LLM은 거대한 서버군 (클라우드)에서 구동되고 있으며, 우리는 인터넷을 통해 그 AI에 질의하고 있습니다.
Ollama는 로컬 환경에서 LLM을 쉽게 관리·실행하기 위한 오픈 소스 (Open Source) 도구입니다.
어려운 환경 구축 없이 명령 하나로 LLM을 다운로드하여 구동할 수 있습니다. 또한, **OpenAI 호환 API 엔드포인트 (API Endpoint)**를 제공하기 때문에 OpenAI 대응 도구(Moodle 포함)를 그대로 사용할 수 있습니다.
# 모델을 다운로드하여 기동하기만 하면 됨
ollama pull qwen2.5:7b
ollama run qwen2.5:7b
Docker 이미지도 공식적으로 제공되고 있어, 기존 Docker 환경에 서비스로 추가하는 것만으로 구동됩니다.
학습자의 성적·수강 이력·내신 정보 등은 외부 서비스로 전송하기에 허들이 높은 정보입니다. 로컬 LLM이라면 인터넷을 경유하지 않고 AI 처리가 완결됩니다.
클라우드 AI는 종량제 과금 방식이므로 학습자 수가 늘어날수록 비용이 증가합니다. 로컬 LLM은 초기 구축 비용만 발생하며, 추가 과금 없이 몇 번이든 이용할 수 있습니다.
공장·의료 시설·보안 정책이 엄격한 기업 등 인터넷 연결이 제한된 환경에서도 로컬 LLM이라면 문제없이 동작합니다.
클라우드 호스팅 (MoodleCloud 등)이 아니라 온프레미스나 VPS 상에서 Moodle을 운용하고 있다면, 동일한 서버에 Ollama를 추가하는 것만으로 도입할 수 있습니다.
이번 검증에 사용한 것은 GEEKOM A8이라는 미니 PC입니다.
| 항목 | 스펙 |
|---|---|
| CPU | AMD Ryzen 7 8845HS (8코어 16스레드) |
| ... |
GPU가 없는 CPU 추론 (Inference) 전용 구성입니다. 그럼에도 qwen2.5:7b가 **약 10~13 토큰/초 (token/s)**로 동작하며, Moodle 상의 AI 기능으로서 충분히 실용적인 속도가 나오고 있습니다.
전용 서버나 고가의 GPU 머신은 필요하지 않습니다. 동등한 사양의 미니 PC나 기존 Linux 서버가 있다면 동일한 구성을 재현할 수 있습니다.
Ubuntu 24.04 LTS
└── Docker Compose
├── moodle45 (Moodle 4.5.11)
...
모든 컨테이너가 shared_net이라는 내부 네트워크로 연결되어 있어, Moodle에서 http://ollama:11434를 통해 Ollama에 접속할 수 있습니다.
이번 구성에서 이용 가능한 모델을 비교한 결과, qwen2.5:7b를 채택했습니다.
| 모델 | 파라미터 수 | RAM 사용량 | 일본어 품질 | 속도 (CPU) |
|---|---|---|---|---|
llama3.2:3b | 3B | 약 2GB | △ | ◎ 빠름 |
qwen2.5:7b | 7B | 약 5GB | ○ 양호 | ○ 실용적 |
gemma4:12b | 12B | 약 8GB | ○ | △ 약간 느림 |
gemma4:26b | 26B | 약 17GB | ◎ 고품질 | ✕ 너무 느림 |
qwen2.5:7b를 선택한 이유는 세 가지입니다.
- 일본어 대응이 양호: Alibaba 제품인 Qwen 시리즈는 일본어를 포함한 아시아 언어 학습 데이터가 풍부하여, 일본어 요약 및 생성 품질이 안정적입니다.
- CPU 추론에서도 실용적인 속도: 7B 사이즈라면 32GB RAM에서 여유롭게 동작하며, 응답 속도도 허용 범위 내에 있습니다.
- 검증 완료: 본 기사를 작성하며 실제로 Moodle과의 연동을 검증했습니다.
더 높은 품질의 일본어 생성이 필요한 경우에는 gemma4:26b도 후보가 될 수 있지만, CPU 추론 시 응답에 몇 분이 걸릴 수 있어 Moodle의 요청이 타임아웃(Timeout)될 리스크가 있습니다. GPU 환경이 있는 경우에 시도해 보시기 바랍니다.
기존 Moodle 환경에 Ollama를 추가하는 최소 구성 샘플입니다.
services:
moodle:
image: your-moodle-image
...
GPU (NVIDIA)를 사용하는 경우에는 deploy 섹션을 추가합니다. CPU 추론으로 충분한 경우에는 위와 같이 그대로 두어도 괜찮습니다.
docker compose up -d ollama
# qwen2.5:7b를 다운로드 (약 4.7GB)
docker exec -it ollama ollama pull qwen2.5:7b
# 다운로드된 모델 확인
...
Moodle 컨테이너에서 Ollama에 도달할 수 있는지 확인합니다.
# Moodle 컨테이너 내부에서 Ollama의 모델 목록을 가져옴
docker exec -it moodle45 curl -s http://ollama:11434/api/tags
모델명이 포함된 JSON이 반환되면 성공입니다.
이어서 OpenAI 호환 엔드포인트(Endpoint)도 확인합니다.
docker exec -it moodle45 curl -s \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ollama" \
...
일본어로 응답이 돌아온다면 Moodle과의 연동 준비가 완료된 것입니다.
제1탄 (OpenAI 연동)을 읽으신 분들께
프로바이더(Provider) 생성, 액션(Action) 활성화, AI Placements 활성화 절차는 제1탄과 동일합니다. 본 장에서는 Ollama 고유의 설정과 제1탄과의 차이점을 중심으로 설명합니다.
사이트 관리 → 일반 → AI → AI 프로바이더
→ 「OpenAI API 프로바이더」를 선택
→ 「설정」을 선택
프로바이더 설정 화면에서는 API 키에 임의의 문자열을 입력합니다 (Ollama는 인증이 필요 없지만, 공란일 경우 에러가 발생합니다).
| 항목 | 값 |
|---|---|
| OpenAI API 키 | ollama (임의의 문자열) |
**「텍스트를 생성한다」 행의 「설정」**을 클릭합니다.
| 항목 | 값 |
|---|---|
| AI 모델 | qwen2.5:7b |
| API 엔드포인트 | http://ollama:11434/v1/chat/completions |
엔드포인트 설정이 가장 중요한 포인트입니다.
OpenAI의 기본 URL (https://api.openai.com/v1/chat/completions)에서 Ollama의 URL (http://ollama:11434/v1/chat/completions)으로 변경해야 합니다.
)に変更해야 합니다.
/v1뿐만 아니라 /v1/chat/completions까지 전체 경로(Full Path)로 입력해야 합니다. 생략하면 404 에러가 발생합니다.
「텍스트 요약하기」도 동일하게 설정합니다.
| 항목 | 값 |
|---|---|
| AI 모델 | qwen2.5:7b |
| API 엔드포인트 | http://ollama:11434/v1/chat/completions |
이 부분이 제1탄(OpenAI)과의 가장 큰 차이점입니다.
Moodle에는 외부로의 의심스러운 요청을 방지하는 SSRF(Server-Side Request Forgery) 방지 기능이 있습니다. 이 기능이 Docker 내부 네트워크의 프라이빗 IP(Private IP)에 대한 액세스도 차단해 버립니다.
Ollama 컨테이너의 IP는 172.20.x.x (Docker의 기본 네트워크)이지만, 이는 Moodle의 기본 차단 목록(Blocklist)인 172.16.0.0/12 범위에 포함되어 있기 때문에 그대로는 액세스할 수 없습니다.
사이트 관리 → Security → HTTP security
① cURL 차단된 호스트 목록에서 172.16.0.0/12를 삭제
설정 후의 내용:
127.0.0.0/8
192.168.0.0/16
10.0.0.0/8
...
② cURL 허용된 포트에 11434를 추가
443
80
11434
이 설정을 잊으면 Moodle 측에서 AI 생성을 실행했을 때 "문제가 발생했습니다. 나중에 다시 시도해 주세요"라는 에러가 계속 표시됩니다.
제1탄과 동일한 절차입니다.
사이트 관리 → 일반 → AI → AI 배치
→ 텍스트 에디터 배치: ON
→ 코스 어시스턴트 배치: ON → 설정 → 코스 텍스트 콘텐츠 요약: 활성화
- 코스 내에서 「텍스트 및 미디어」 등을 편집 모드로 추가
- TinyMCE 툴바의 ✨ 아이콘을 클릭 - 「텍스트 생성하기」를 선택
- 프롬프트를 입력하고 전송

「응답 생성하기」 → 「조금 더」라고 표시된 후, 생성된 텍스트가 에디터에 삽입됩니다.
OpenAI와 비교하면 응답에 수 초에서 십수 초가 걸리지만, CPU 추론(Inference)에서는 이것이 표준적인 속도입니다.
Course Assistance의 요약 버튼은 액티비티(Activity)의 열람 화면 전반에 표시됩니다. 페이지, 과제, 퀴즈, 포럼 등 많은 액티비티에서 이용할 수 있습니다.
| 액티비티 | 요약 버튼 | 비고 |
|---|---| |
| 페이지 (mod/page) | ✅ | 본문이 그대로 요약됨. 가장 효과적 |
| ... |
액티비티에 따라 요약할 수 있는 콘텐츠의 양이 다릅니다. 본문이 충실한 「페이지」 액티비티가 가장 효과적입니다.
「페이지」 액티비티에서의 확인 절차:
- 「페이지」 액티비티에 텍스트를 입력하고 저장
- 열람 모드(편집 모드 OFF)로 페이지를 열기
- 화면 오른쪽에 「AI 요약」 패널이 표시됨
- 「요약」을 클릭
| 비교 항목 | OpenAI (제1탄) | Ollama (본 기사) |
|---|---| |
| 데이터 전송 | OpenAI 서버로 전송 | 서버 내에서 완결 |
| 실행 비용 | 종량제 | 무료 |
| 응답 속도 | 빠름 (12초) | 약간 느림 (515초) |
| 일본어 품질 | 매우 높음 | 양호 (qwen2.5:7b) |
| 셋업 | 간단함 | 약간의 수고가 필요함 |
| 오프라인 동작 | 불가능 | 가능 |
| 모델 선택지 | OpenAI 모델만 가능 | 100개 이상에서 선택 가능 |
| 적합한 용도 | 간편하게 고품질 AI를 사용하고 싶을 때 | 데이터를 외부로 내보낼 수 없을 때 |
어느 쪽이 더 우월하다는 것이 아니라, 운용 정책과 용도에 따라 나누어 사용하는 것이 현실적입니다.
본 기사의 검증 중에 마주친 문제를 기록해 둡니다. 다른 블로그에서는 잘 보이지 않는 정보입니다.
가장 시간이 오래 걸린 문제입니다. Moodle 관리 화면의 「cURL 차단된 호스트」 목록에 ollama라는 문자열이 자동으로 등록되어 있었기 때문에, 처음에 그것을 삭제했습니다. 하지만 그것만으로는 해결되지 않았습니다.
Ollama의 Docker 컨테이너 IP가 172.20.0.11이며, 이것이 172.16.0.0/12의 CIDR 범위(172.16.0.0...
〜172.31.255.255
)에 포함되어 있었기 때문에, 호스트 이름이 아닌 IP 레벨에서 차단되었던 것입니다.
# 차단 여부를 확인하는 명령어
docker exec -it moodle45 php -r "
define('CLI_SCRIPT', true);
...
blocked: YES
가 반환되는 경우에는 차단 목록(blocklist)에서 172.16.0.0/12를 삭제해 주세요.
액션 설정(Action settings)에서 엔드포인트(endpoint)를 http://ollama:11434/v1로 입력할 경우, /v1 엔드포인트는 Ollama에 존재하지 않으므로 404 에러가 반환됩니다. 반드시 /v1/chat/completions까지 전체 경로(full path)로 입력해야 합니다.
cURL 차단 목록 설정과 동일한 화면에 「cURL 허용 포트(cURL allowed ports)」가 있습니다. 기본값은 443과 80뿐입니다. 11434를 추가하지 않으면 차단 목록 해제와는 별개로 포트 레벨에서 차단됩니다.
「텍스트 및 미디어 (label)」에서는 AI 요약 버튼이 표시되지 않습니다. 「페이지(Page)」, 「과제(Assignment)」, 「퀴즈(Quiz)」 등의 액티비티를 열람 모드로 열어주세요. 또한, 퀴즈나 포럼에서는 설명문(description)만 요약 대상이 되므로, 콘텐츠가 적은 경우에는 유용한 요약을 얻을 수 없을 수도 있습니다. 본문 내용이 풍부한 「페이지」 액티비티가 가장 효과적입니다.
aiprovider_ollama 플러그인은 Moodle 5.0 이후 버전에서만 사용할 수 있습니다. Moodle 4.5에서는 aiprovider_openai 플러그인의 엔드포인트를 Ollama의 URL로 교체하여 대응합니다.
Moodle 4.5 × Ollama의 로컬 LLM 구성을 실현하기 위한 핵심 요점입니다.
| 단계 | 내용 |
|---|---|
| 1 | docker-compose.yml에 ollama 서비스 추가 |
| 2 | qwen2.5:7b를 pull |
| 3 | OpenAI API 프로바이더를 생성하고, API 키에 ollama 입력 |
| 4 | 액션 설정에서 엔드포인트를 http://ollama:11434/v1/chat/completions로 변경 |
| 5 | cURL 차단 목록에서 172.16.0.0/12를 삭제하고, 포트 11434를 추가 |
| 6 | AI Placements를 활성화 |
데이터를 외부에 보내지 않고, API 비용도 제로(0)로 Moodle 4.5의 AI 기능을 최대한 활용할 수 있습니다. 개인정보 및 기밀 정보를 다루는 교육 기관이나 기업 연수에서의 도입에 꼭 참고하시기 바랍니다.
- Moodle AI subsystem 문서
- Ollama 공식 사이트
- Ollama OpenAI 호환 API 문서
- 제1탄: Moodle 4.5에 ChatGPT (OpenAI API)를 연동하는 방법 ← 공개 후 URL 업데이트
※ 이 기사는 Zenn (rublix)에도 게시되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기