Meilisearch는 Rust로 작성된 오픈소스 초고속 검색 엔진입니다. Elasticsearch보다 설정이 10배 단순하고, 한국어 오타 허용·페이셋 필터링·InstantSearch.js 위젯이 기본 내장되어 있습니다. 이 가이드에서는 Strapi + n8n + Qdrant + Ollama + WordPress + ComfyUI가 이미 돌고 있는 홈랩에 Meilisearch를 더해, 블로그 즉시 검색부터 KOSPI 데이터 인덱싱, 프롬프트 라이브러리, 홈랩 로그 검색, 하이브리드 RAG까지 10가지 활용법을 워크플로우 파일과 함께 단계별로 다룹니다.
Meilisearch란 — 스택 내 포지션 & 비교
검색 엔진 비교
| 항목 | Elasticsearch | Typesense | Meilisearch |
|---|---|---|---|
| 설치 난이도 | 높음 (JVM, 클러스터) | 중간 | 낮음 (Docker 한 줄) |
| 메모리 사용 | 수 GB~ | 중간 | 경량 (홈랩 적합) |
| 한국어 오타 허용 | 별도 플러그인 | 기본 지원 | 기본 내장 |
| n8n 공식 노드 | 있음 | 없음 | 있음 |
| Strapi 플러그인 | 없음 | 없음 | 공식 플러그인 |
| InstantSearch.js | 지원 | 지원 | 기본 제공 |
| 라이선스 | SSPL | GPL-3 | MIT (완전 자유) |
홈랩 전체 아키텍처
┌─ Strapi ─ 블로그 발행 → 자동 동기화 ──────────────┐
│ ↓
데이터 소스 ─┼─ n8n ──── KOSPI/뉴스/RSS ──────────────→ Meilisearch
│ ↑
├─ ComfyUI ─ 이미지 프롬프트 히스토리 ──────────────┤
│ │
└─ Obsidian ─ 마크다운 노트 ─── SFTP → n8n ────────┘
↓ ↓
키워드 검색 하이브리드 RAG
↓ ↓
WordPress InstantSearch 위젯 Qdrant(벡터) + Meilisearch(키워드)
(블로그 방문자 검색) ↓ RRF 병합
Ollama LLM → 최종 답변Qdrant(벡터)는 “개념적으로 유사한 문서”를, Meilisearch(BM25 키워드)는 정확한 단어·종목코드·에러코드·날짜를 잘 찾습니다. STEP 11에서 두 결과를 RRF로 병합하면 서로의 약점을 보완하는 하이브리드 RAG가 완성됩니다.
Docker 배포 + Prometheus 모니터링 연동
이전에는 meilisearch-exporter라는 별도 컨테이너가 필요했지만, v1.3부터 Meilisearch에 Prometheus 메트릭 엔드포인트(/metrics)가 내장됩니다. meilisearch/meilisearch-exporter 이미지는 Docker Hub에 존재하지 않으므로 사용할 수 없습니다. 환경변수 한 줄만 추가하면 끝입니다.
① 마스터 키 생성 후 .env에 추가
# 안전한 랜덤 키 생성 후 .env에 추가 echo "MEILI_MASTER_KEY=$(openssl rand -base64 32)" >> .env # 확인 grep MEILI_MASTER_KEY .env
② docker-compose.yml — meilisearch 서비스만 추가
meilisearch:
image: getmeili/meilisearch:v1.7
container_name: meilisearch
restart: unless-stopped
ports:
- "7700:7700"
volumes:
- /mnt/data/02_automation/meilisearch/data:/meili_data
environment:
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
- MEILI_ENV=production
- MEILI_NO_ANALYTICS=true
- MEILI_MAX_INDEXING_MEMORY=4GiB
- MEILI_MAX_INDEXING_THREADS=2
- MEILI_EXPERIMENTAL_ENABLE_METRICS=true
healthcheck:
test: ["CMD","wget","--no-verbose","--tries=1","--spider","http://localhost:7700/health"]
interval: 10s
timeout: 5s
retries: 3
networks:
- ai-common-net
logging: *default-logging
# meilisearch-exporter 컨테이너는 필요 없습니다
# v1.3부터 /metrics 엔드포인트가 내장되어 있습니다③ Prometheus 설정 — Bearer 인증 추가
scrape_configs:
- job_name: 'meilisearch'
metrics_path: '/metrics'
static_configs:
- targets: ['meilisearch:7700']
authorization:
type: Bearer
credentials: 'YOUR_MEILI_MASTER_KEY' # .env의 MEILI_MASTER_KEY 값으로 교체Prometheus의 credentials_file 옵션으로 별도 파일에 분리하거나, Docker Secret을 사용할 수 있습니다. 내부망 전용 환경이라면 일반 텍스트로 두어도 실용적으로 무방합니다.
④ 배포 및 동작 확인
서비스 시작
docker compose up -d meilisearch
헬스 확인
curl http://192.168.0.100:7700/health → {"status":"available"}
메트릭 엔드포인트 확인
curl -s http://192.168.0.100:7700/metrics -H "Authorization: Bearer ${MEILI_MASTER_KEY}" | head -5 → # HELP meilisearch_... 로 시작하는 출력이 나와야 정상
⑤ Grafana 대시보드 Import
인터넷에 잘못된 ID가 퍼져 있습니다. 20197은 MySQL Alert Record 대시보드라서 MySQL 데이터소스를 요구하고 Meilisearch 메트릭은 전혀 표시하지 않습니다. 아래 두 방법 중 하나를 사용하세요.
| 방법 | 절차 | 특징 |
|---|---|---|
| 방법 A — GitHub JSON (공식 권장) | 아래 명령어로 JSON 다운로드 → Grafana “Upload JSON file”로 Import | Meilisearch 공식 리포지토리 제공 — 항상 최신 |
| 방법 B — Grafana Labs ID | Grafana → Import → ID 22733 입력 | 커뮤니티 업로드 버전 |
curl -L -o /tmp/meilisearch-grafana.json https://raw.githubusercontent.com/meilisearch/meilisearch/main/assets/grafana-dashboard.json
# 다운로드 확인
ls -lh /tmp/meilisearch-grafana.json방법 A: Grafana → Dashboards → Import → “Upload JSON file” → 위에서 받은 파일 선택
Data source: Prometheus 선택 → Import
방법 B: Grafana → Dashboards → Import → 22733 입력 → Load → Prometheus 선택 → Import
대시보드 확인: 인덱스 크기, 초당 쿼리(QPS), 인덱싱 대기열, 태스크 처리 현황 표시
마스터 키는 모든 인덱스를 읽기·쓰기·삭제할 수 있는 최고 권한입니다. 반드시 .env 파일에만 보관하고 .gitignore에 추가하세요. 프론트엔드에는 STEP 05에서 발급하는 읽기 전용 키만 사용합니다.
인덱스 초기 설정 — 검색 속성 최적화
Meilisearch는 기본값으로 모든 필드를 인덱싱합니다. 검색 대상·필터·정렬 속성을 명시적으로 지정하면 인덱스 크기를 줄이고 검색 속도를 높입니다. 이 STEP은 Meilisearch가 실행 중인 상태에서, 서버 터미널에서 curl 명령어를 실행하는 작업입니다.
- 언제: STEP 02에서 Meilisearch 컨테이너를 띄운 직후 1회만 실행
- 어디서: [서버 혹은 PC](192.168.0.100) SSH 터미널에서 직접 실행 — Meilisearch 컨테이너 안에 들어가지 않아도 됩니다
- 무엇을: Meilisearch REST API에 curl로 속성 설정 요청을 보내는 것 — GUI나 설정 파일이 아니라 API 호출 방식
- 반드시 해야 하나요: 필수는 아니지만, 기본값은 모든 필드를 검색 대상으로 잡아 인덱스가 불필요하게 커집니다. 한 번 설정해두면 이후 워크플로우가 데이터를 넣을 때 자동으로 적용됩니다
실행 전 — 환경변수 확인
# 1. Meilisearch가 실행 중인지 확인 docker ps | grep meilisearch # 2. 마스터 키 환경변수 불러오기 (.env 파일 위치에서 실행) export MEILI_MASTER_KEY=$(grep MEILI_MASTER_KEY .env | cut -d= -f2) # 3. 연결 테스트 curl -s http://192.168.0.100:7700/health # {"status":"available"} 가 나와야 정상
용도별 인덱스 생성 + 속성 설정
MEILI="http://192.168.0.100:7700"
KEY="${MEILI_MASTER_KEY}"
# ── blog-post 인덱스 ──────────────────────────────────
curl -s -X PUT "$MEILI/indexes/blog-post/settings/searchable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["title","excerpt","category","subCategory","wpTags"]'
curl -s -X PUT "$MEILI/indexes/blog-post/settings/filterable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["category","subCategory"]'
curl -s -X PUT "$MEILI/indexes/blog-post/settings/sortable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["createdAt"]'
# ── market-data 인덱스 ────────────────────────────────
curl -s -X PUT "$MEILI/indexes/market-data/settings/searchable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["title","content","source"]'
curl -s -X PUT "$MEILI/indexes/market-data/settings/filterable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["type","date","source"]'
# ── prompt-library 인덱스 ─────────────────────────────
curl -s -X PUT "$MEILI/indexes/prompt-library/settings/searchable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["prompt","tags","style","model","note"]'
curl -s -X PUT "$MEILI/indexes/prompt-library/settings/filterable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["type","model","rating","dateStr"]'
# ── obsidian-vault 인덱스 ─────────────────────────────
curl -s -X PUT "$MEILI/indexes/obsidian-vault/settings/searchable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["title","content","tags","category","excerpt"]'
# ── homelab-events 인덱스 ─────────────────────────────
curl -s -X PUT "$MEILI/indexes/homelab-events/settings/searchable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["title","content","source","instance"]'
curl -s -X PUT "$MEILI/indexes/homelab-events/settings/filterable-attributes" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '["severity","type","date","source"]'
echo "전체 인덱스 설정 완료"각 curl 명령은 즉시 응답으로 {"taskUid": 숫자, "status": "enqueued"} 형태를 반환합니다. “enqueued”는 요청이 접수됐다는 의미이고, 실제 적용은 수 초 내로 자동 완료됩니다. 아래 명령으로 설정이 제대로 반영됐는지 확인할 수 있습니다.
# blog-post 인덱스의 검색 대상 속성이 잘 들어갔는지 확인 curl -s "http://192.168.0.100:7700/indexes/blog-post/settings/searchable-attributes" -H "Authorization: Bearer ${MEILI_MASTER_KEY}" # 출력 예시: ["title","excerpt","category","subCategory","wpTags"] # 전체 인덱스 목록 확인 (데이터가 들어온 후) curl -s "http://192.168.0.100:7700/indexes" -H "Authorization: Bearer ${MEILI_MASTER_KEY}" | python3 -m json.tool | grep '"uid"'
| 인덱스명 | 용도 | 데이터 소스 |
|---|---|---|
| blog-post | 블로그 글 검색 | Strapi 플러그인 자동 동기화 |
| market-data | KOSPI + 뉴스 검색 | STEP 06 워크플로우 |
| news-feed | RSS 뉴스 피드 | STEP 07 워크플로우 |
| prompt-library | AI 프롬프트 이력 | STEP 08 워크플로우 |
| obsidian-vault | Obsidian 노트 전문 검색 | STEP 09 워크플로우 |
| homelab-events | 서버/NAS 이벤트 로그 | STEP 10 워크플로우 |
Strapi 연동 — 블로그 발행 즉시 자동 인덱싱
Strapi에서 글을 Publish하는 순간 n8n 없이 직접 Meilisearch로 스트리밍됩니다.
① 플러그인 설치 (Strapi 컨테이너 내부)
docker exec -it strapi sh -c "cd /opt/app && npm install @strapi/plugin-meilisearch && exit" docker compose restart strapi
② 플러그인 설정 파일
module.exports = ({ env }) => ({
meilisearch: {
config: {
host: 'http://meilisearch:7700', // 컨테이너명 사용 (같은 네트워크)
apiKey: env('MEILI_MASTER_KEY'),
}
},
});③ Strapi Admin에서 인덱싱 설정
Strapi 관리자 → Settings → Meilisearch 클릭
Collection Type: Blog-post 선택 → 동기화 필드 체크
체크 항목: title, excerpt, category, subCategory, slug (content는 제외 권장 — 인덱스 크기 절약)
Reload 버튼 → 기존 글 전체 즉시 인덱싱 시작
확인: 새 글 Publish 후 Meilisearch에서 검색
curl http://192.168.0.100:7700/indexes/blog-post/search -d '{"q":"테스트"}' -H "Authorization: Bearer $KEY"
WordPress 즉시 검색 위젯 + 페이셋 필터
① 읽기 전용 API 키 발급 (프론트엔드 전용)
curl -X POST "http://192.168.0.100:7700/keys" \
-H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "WordPress Search Key",
"actions": ["search"],
"indexes": ["blog-post"],
"expiresAt": null
}'
# 응답에서 "key" 값을 복사 → WordPress 설정에 사용② WordPress functions.php에 라이브러리 등록
function agibop_enqueue_meilisearch() {
wp_enqueue_script('instantsearch',
'https://cdn.jsdelivr.net/npm/instantsearch.js@4/dist/instantsearch.production.min.js',
[], '4', true);
wp_enqueue_script('meili-instantsearch',
'https://cdn.jsdelivr.net/npm/@meilisearch/instant-meilisearch/dist/instant-meilisearch.umd.min.js',
['instantsearch'], '0.19', true);
}
add_action('wp_enqueue_scripts', 'agibop_enqueue_meilisearch');③ 검색 위젯 — 카테고리 페이셋 필터 포함
<div id="meili-search-wrap"> <div id="meili-searchbox"></div> <div id="meili-refinement"></div> <!-- 카테고리 필터 --> <div id="meili-hits"></div> <div id="meili-pagination"></div> </div> <script> const searchClient = instantMeiliSearch( 'https://meilisearch.agibop.com', // Cloudflare Tunnel 외부 URL 'YOUR_SEARCH_ONLY_KEY' ); const search = instantsearch({ indexName: 'blog-post', searchClient }); search.addWidgets([ instantsearch.widgets.searchBox({ container: '#meili-searchbox', placeholder: '블로그 검색...', }), instantsearch.widgets.refinementList({ // 카테고리 필터 위젯 container: '#meili-refinement', attribute: 'category', transformItems(items) { const labels = { 'ai-lab': 'AI랩', 'finance': '재테크', 'home-lab': '홈랩' }; return items.map(i => ({ ...i, label: labels[i.label] || i.label })); }, }), instantsearch.widgets.hits({ container: '#meili-hits', templates: { item: (hit) => ` <a class="meili-hit" href="/${hit.slug}/"> <span class="meili-cat">${hit.category}</span> <strong>${hit._highlightResult.title.value}</strong> <p>${hit._highlightResult.excerpt?.value || ''}</p> </a>`, empty: '<p>검색 결과가 없습니다.</p>', }, }), instantsearch.widgets.pagination({ container: '#meili-pagination' }), ]); search.start(); </script>
Meilisearch를 Cloudflare Tunnel로 meilisearch.agibop.com으로 노출하면 스마트폰에서도 검색 위젯이 동작합니다. 읽기 전용 키를 쓰기 때문에 노출되어도 데이터 변경 위험이 없습니다. Zero Trust Policy에서 이 서브도메인만 Public으로 설정하세요.
KOSPI + 뉴스 데이터 자동 인덱싱 워크플로우 제공
Yahoo Finance API로 KOSPI 지수를 수집하고, 금융 RSS 피드를 병렬로 받아 market-data 인덱스에 매시간 Upsert합니다.
n8n → Workflows → Import from File로 가져온 뒤 Credential만 연결하면 즉시 동작합니다.
워크플로우 구조
매시간 실행 ─┬─→ Yahoo Finance API (KOSPI 지수) ─┐
└─→ 금융 RSS 피드 ─┘
↓
데이터 정형화 + URL 해시로 id 생성
↓
Meilisearch: market-data 인덱스 Upsert
↓
결과 로그 (콘솔)Import 후 설정할 것
| 노드 | 설정 항목 |
|---|---|
| 5) Meilisearch Upsert | Credentials → “Meilisearch Local” 연결 |
| 2) KOSPI 지수 조회 | 필요시 API 키(Yahoo Finance Premium) 추가 |
검색 테스트
# 날짜 필터 + 키워드 검색
curl -X POST "http://192.168.0.100:7700/indexes/market-data/search" \
-H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
-H "Content-Type: application/json" \
-d '{
"q": "코스피 상승",
"filter": "date = \"2026-07-01\"",
"limit": 5
}'RSS 뉴스 멀티피드 수집 워크플로우 제공
IT기술·금융·주식 등 복수의 RSS 피드를 2시간마다 자동 수집해 news-feed 인덱스에 적재합니다. URL 해시로 id를 만들어 Upsert하므로 중복 걱정이 없습니다.
기본 피드 5개 포함. 워크플로우 2번 노드(RSS 피드 목록 정의) 안의 feeds 배열에 원하는 RSS URL을 추가하세요.
기본 포함 피드 목록
| 소스 | 카테고리 | URL |
|---|---|---|
| ZDNet Korea | IT기술 | feeds.feedburner.com/zdnet/korea |
| 전자신문 | IT기술 | rss.etnews.com/Section901.xml |
| 매일경제 | 금융경제 | mk.co.kr/rss/30100041/ |
| 한국경제 IT | IT기술 | hankyung.com/feed/it |
| Yahoo Finance KR | 주식 | feeds.finance.yahoo.com/rss/… |
피드 추가 방법
const feeds = [
// 기존 5개 ...
// 추가 예시:
{ url: 'https://www.hani.co.kr/rss/', category: '뉴스', source: '한겨레' },
{ url: 'https://www.sedaily.com/RSS/RssNews.xml', category: '경제', source: '서울경제' },
];ComfyUI + 음악AI 프롬프트 라이브러리 워크플로우 제공
ComfyUI 이미지 프롬프트와 ACE-Step / Udio / Suno 음악 생성 프롬프트를 중앙에서 관리합니다. Webhook으로 실시간 저장하거나, ComfyUI API로 히스토리를 일괄 수집합니다.
두 가지 트리거 포함: ① 실시간 Webhook 저장, ② 일일 ComfyUI 히스토리 일괄 수집
프롬프트 저장 API 호출 예시
curl -X POST "https://n8n.agibop.com/webhook/meili-prompt-save" \
-H "Content-Type: application/json" \
-d '{
"prompt": "futuristic AI robot, neon blue, cinematic, 8K, detailed",
"type": "comfyui",
"model": "juggernautXL_v9Rdphoto2Lightning",
"style": "cinematic",
"tags": "로봇,SF,네온,8K",
"rating": 5,
"note": "조명 각도 45도, steps=20이 최적"
}'curl -X POST "https://n8n.agibop.com/webhook/meili-prompt-save" \
-H "Content-Type: application/json" \
-d '{
"prompt": "[verse] 밤하늘 별빛 아래 [chorus] 우리의 이야기",
"type": "music",
"model": "ACE-Step-1.5-XL",
"style": "K-pop ballad, 80 BPM",
"tags": "발라드,K팝,감성",
"rating": 4,
"note": "infer_steps=50이 품질 좋음"
}'프롬프트 검색
# 음악 프롬프트 중 별점 4 이상만 검색
curl -X POST "http://192.168.0.100:7700/indexes/prompt-library/search" \
-H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
-H "Content-Type: application/json" \
-d '{
"q": "발라드",
"filter": "type = \"music\" AND rating >= 4",
"sort": ["rating:desc"],
"limit": 10
}'Obsidian Vault 전문 검색 동기화 워크플로우 제공
SFTP로 Vault 전체 폴더를 30분마다 스캔해 마크다운 노트를 파싱하고 obsidian-vault 인덱스에 동기화합니다. Obsidian 내장 검색보다 빠르고 오타 허용 검색이 됩니다.
인덱싱 폴더 목록(posts, published, templates, work, system)이 기본 포함되어 있습니다. 4번 노드의 FOLDERS 배열에서 원하는 폴더만 남기거나 추가하세요.
Import 후 설정할 것
| 노드 | 설정 |
|---|---|
| 5) 폴더별 파일 목록 조회 | Credentials → “[NAS] SFTP” 연결 |
| 7) 파일 다운로드 | 동일 Credential |
| 10) Meilisearch Upsert | Credentials → “Meilisearch Local” 연결 |
검색 API 호출 예시
# 하이라이팅 포함 노트 검색 (오타 허용) curl -X POST "http://192.168.0.100:7700/indexes/obsidian-vault/search" \ -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \ -H "Content-Type: application/json" \ -d '{ "q": "Strapii n8n연동", "attributesToHighlight": ["title","content"], "highlightPreTag": "**", "highlightPostTag": "**", "limit": 5 }' # "Strapii" 오타도 "Strapi" 결과를 반환합니다
홈랩 이벤트 & 알림 로그 인덱싱 워크플로우 제공
Prometheus 알림과 시스템 부하 지표를 매시간 수집해 homelab-events 인덱스에 쌓습니다. 날짜·심각도·소스로 필터링해서 “지난달 critical 알림만 검색”이 가능해집니다.
Prometheus API + [NAS] DSM API 동시 수집. [NAS] API 호출은 SID(세션 ID)가 필요하니 4번 노드의 URL에서 YOUR_SID 부분을 실제 SID로 교체하거나 비워두세요.
심각도별 이벤트 검색
# 이번 달 critical 이벤트 전체 조회
curl -X POST "http://192.168.0.100:7700/indexes/homelab-events/search" \
-H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
-H "Content-Type: application/json" \
-d '{
"q": "",
"filter": ["severity = \"critical\"", "date >= \"2026-07-01\""],
"sort": ["createdAt:desc"],
"limit": 50
}'하이브리드 RAG — Qdrant + Meilisearch + Ollama 워크플로우 제공
Qdrant(벡터)와 Meilisearch(키워드) 결과를 RRF 알고리즘으로 병합하고, 병합된 컨텍스트를 Ollama에 넘겨 최종 답변을 생성하는 완전한 RAG 파이프라인입니다.
POST https://n8n.agibop.com/webhook/hybrid-search로 쿼리를 보내면 병합된 검색 결과와 Ollama 답변을 JSON으로 받습니다.
RRF 알고리즘 원리
Qdrant 결과: [A순위1, B순위2, C순위3] → 점수: 1/(60+1), 1/(60+2), ...
Meilisearch 결과: [B순위1, D순위2, A순위3] → 점수: 1/(60+1), 1/(60+2), ...
RRF 합산: A = 1/61 + 1/63 ≈ 0.0322 (양쪽 상위권)
B = 1/62 + 1/61 ≈ 0.0326 (양쪽 상위권, 1위)
C = 1/63 ≈ 0.0159 (Qdrant만)
D = 1/62 ≈ 0.0161 (Meilisearch만)
최종 순위: B → A → D → C (양쪽에서 높게 나온 문서가 상위)API 호출 예시
curl -X POST "https://n8n.agibop.com/webhook/hybrid-search" \
-H "Content-Type: application/json" \
-d '{
"query": "2026년 삼성전자 1분기 실적 요약",
"indexes": ["blog-post", "market-data", "news-feed"],
"top_k": 5,
"generate": true
}'
# 응답 구조:
# {
# "query": "...",
# "answer": "Ollama가 생성한 답변",
# "sources": [{ "id": "...", "title": "...", "source": "market-data" }, ...],
# "stats": { "meilisearch_hits": 9, "qdrant_hits": 5 }
# }Import 후 설정할 것
| 노드 | 설정 |
|---|---|
| 3) Meilisearch 멀티 인덱스 검색 | Headers → Authorization: Bearer {MEILI_MASTER_KEY} |
| 4) Ollama 임베딩 생성 | Ollama 임베딩 모델 확인 (nomic-embed-text 설치 여부) |
| 5) Qdrant 벡터 검색 | 컬렉션명 확인 (기본: blog_posts) |
| 7) Ollama 답변 생성 | 사용 모델 확인 (기본: gemma2:latest) |
멀티 인덱스 통합 검색 UI 구축
블로그·뉴스·프롬프트·Obsidian 노트를 한 검색창에서 동시에 검색하는 통합 UI입니다. Meilisearch의 multi-search API를 활용합니다.
멀티 인덱스 동시 검색 API
curl -X POST "http://192.168.0.100:7700/multi-search" \
-H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
-H "Content-Type: application/json" \
-d '{
"queries": [
{ "indexUid": "blog-post", "q": "Strapi", "limit": 3 },
{ "indexUid": "news-feed", "q": "Strapi", "limit": 3 },
{ "indexUid": "obsidian-vault", "q": "Strapi", "limit": 3 },
{ "indexUid": "prompt-library", "q": "Strapi", "limit": 2 }
]
}'n8n HTTP Request 노드에서 활용
const results = $json.results || [];
const LABEL = { 'blog-post': '블로그', 'news-feed': '뉴스', 'obsidian-vault': 'Obsidian', 'prompt-library': '프롬프트' };
const merged = results.flatMap(r =>
(r.hits || []).map(h => ({
...h,
_index: r.indexUid,
_indexLabel: LABEL[r.indexUid] || r.indexUid,
}))
);
return [{ json: { total: merged.length, results: merged } }];성능 최적화 & 백업 운영 전략
① RTX 3060 서버 기준 권장 설정
| 환경변수 | 권장값 | 이유 |
|---|---|---|
| MEILI_MAX_INDEXING_MEMORY | 4GiB | AI/GPU 작업과 메모리 경합 방지 |
| MEILI_MAX_INDEXING_THREADS | 2 | CPU 코어 과점 방지 |
| 인덱스당 문서 길이 | 3000자 이하 권장 | 인덱스 파일 크기 관리 |
② 스냅샷 백업 + NAS 자동 복사
# 스냅샷 생성 (비동기, /meili_data/snapshots/에 저장됨) curl -X POST "http://192.168.0.100:7700/snapshots" \ -H "Authorization: Bearer ${MEILI_MASTER_KEY}" # [NAS]로 자동 복사 (cron 또는 n8n Schedule로 자동화) rsync -avz /mnt/data/02_automation/meilisearch/data/snapshots/ \ 192.168.0.150:/volume1/backup/meilisearch/
③ API 키 관리 전략
| 키 종류 | 권한 | 사용 위치 |
|---|---|---|
| 마스터 키 | 전체 (읽기·쓰기·삭제) | .env 파일만 / n8n Credential만 |
| 검색 전용 키 | search만, 특정 인덱스만 | WordPress 위젯, 프론트엔드 |
| 쓰기 전용 키 | documents.add/update만 | 외부 서비스가 직접 인덱싱 시 |
④ 최종 운영 체크리스트
- ✓헬스 체크:
curl http://192.168.0.100:7700/health→ available - ✓Strapi 플러그인: 새 글 발행 후 인덱스 문서 수 증가 확인
- ✓WordPress 위젯: 오타 검색 동작 확인 (“스트라피” → “Strapi” 결과)
- ✓6개 워크플로우 Active: 인덱스별 문서 수 증가 확인
- ✓Grafana 대시보드(공식 JSON 또는 ID 22733): QPS·인덱싱 대기열 정상
- ✓마스터 키: 프론트엔드 어디에도 노출 안 됨
- ✓스냅샷 백업: [NAS]로 정기 복사 자동화 설정
워크플로우 파일 다운로드 목록
| 파일명 | 용도 | 노드 수 | 트리거 |
|---|---|---|---|
meili-01-market-data-workflow.json | KOSPI + 뉴스 자동 인덱싱 | 6개 | 매시간 |
meili-02-rss-news-workflow.json | RSS 멀티피드 수집 | 7개 | 2시간마다 |
meili-03-prompt-library-workflow.json | ComfyUI + 음악AI 프롬프트 저장 | 8개 | Webhook + 일일 |
meili-04-obsidian-sync-workflow.json | Obsidian 노트 전문 검색 동기화 | 11개 | 30분마다 |
meili-05-homelab-log-workflow.json | 홈랩 이벤트 & 알림 로그 | 8개 | 매시간 |
meili-06-hybrid-rag-workflow.json | 하이브리드 RAG (Qdrant + Meilisearch + Ollama) | 8개 | Webhook |
- blog-post — Strapi 발행 즉시 자동 동기화 → WordPress 즉시 검색 위젯
- market-data — KOSPI 지수 + 금융 뉴스 매시간 수집 (워크플로우 01)
- news-feed — IT·경제·주식 RSS 5개 피드 2시간마다 수집 (워크플로우 02)
- prompt-library — ComfyUI/ACE-Step/Udio 프롬프트 이력 관리 (워크플로우 03)
- obsidian-vault — 전체 마크다운 노트 오타 허용 검색 (워크플로우 04)
- homelab-events — Prometheus 알림 + 시스템 부하 이력 (워크플로우 05)
다음에 도전해볼 것



