블로그 자동화2
n8n과 open webui, ghost 를 docker로 설치 후 진행하는 내용입니다.
docker로 설치는 이전 게시글 참고하세요.
- 준비사항
- n8n 에서 사용할 환경 변수
• GHOST_URL=https://your-ghost-blog.com
• GHOST_ADMIN_API_KEY=YOUR_GHOST_ADMIN_KEY
• OPENWEBUI_URL=http://openwebui:5000/api/v1/generate
• SD_WEBUI_URL=http://openwebui:5000/sdapi/v1/txt2img - n8n에 필요한 커스텀 패키지
• npm install google-trends-api (혹은 직접 HTTP 스크래핑) - 전체 워크플로우 구성
┌─────────────────┐
│ Cron Trigger │ ← 매일/매시간 스케줄링
└──────┬──────────┘
│
▼
┌───────────────────────────┐
│ Function / HTTP Request │
│ • 구글 트렌드 키워드 목록 │
│ (google-trends-api.fetch(‘today’)) │
└──────┬────────────────────┘
│ 키워드 리스트
▼
┌─────────────────┐
│ SplitInBatches │
│ 각 키워드별 루프 │
└──────┬──────────┘
│ 키워드 하나
▼
┌────────────────┐
│ HTTP Request │
│ (LLM 생성) │
│ - URL: OPENWEBUI_URL │
│ - Body: { prompt: │
│ “블로그 스타일: ~; 키워드: {{$json[“keyword”]}}” } │
└──────┬──────────┘
│ 생성된 본문(마크다운)
▼
┌───────────────────────────┐
│ HTTP Request (SD 이미지) │
│ - URL: SD_WEBUI_URL │
│ - Body: { prompt: “키워드…” } │
└──────┬────────────────────┘
│ image_base64 or URL
▼
┌───────────────────────────────┐
│ HTTP Request (Ghost Assets) │
│ - POST {{GHOST_URL}}/ghost/api/admin/images/upload/ │
│ - 헤더: Authorization: Ghost {{GHOST_ADMIN_API_KEY}} │
│ - formData: file=<이미지> │
└──────┬────────────────────────┘
│ uploaded_image_url
▼
┌─────────────────────────────┐
│ HTTP Request (Ghost Posts) │
│ - POST {{GHOST_URL}}/ghost/api/admin/posts/ │
│ - 헤더: Authorization: Ghost {{GHOST_ADMIN_API_KEY}} │
│ - JSON Body: │
│ { │
│ title: “{{$json.keyword}} 트렌드 분석”, │
│ html: “
…
{{$node[“LLM 생성”].json.generated_text}}<img src=‘{{$node[“Assets 업로드”].json.images[0].url}}’/>”, │
│ status: “published” │
│ } │
└─────────────────────────────┘
- 주요 노드 설명
- 구글 트렌드 키워드 가져오기 (Function 노드 예)
const googleTrends = require('google-trends-api');
return googleTrends.todayInterestOverTime({
keyword: [], // 빈배열이면 전체 카테고리
geo: 'KR'
})
.then(res => {
const parsed = JSON.parse(res);
// parsed.default.aggregationTarget.map(o=>o.query)
return parsed.default.aggregationTarget.map(o=>({ json: { keyword: o.query }}));
});
- LLM(OpenWebUI) 호출
- n8n HTTP Request
• Method: POST
• URL: {{$env.OPENWEBUI_URL}}
• Body(JSON):
{
“prompt”: “당신은 한국어 IT/테크 블로그 에디터입니다. 다음 키워드 ‘{{$json.keyword}}’에 대해 전문적이면서도 읽기 쉬운 스타일로 600자 내외의 마크다운 글을 작성하세요. 소제목, 리스트, 예시코드 등을 포함하세요.”,
“max_new_tokens”: 512
}
- 이미지 생성 (Stable Diffusion)
- URL: {{$env.SD_WEBUI_URL}}
Body(JSON):
{ “prompt”: “{{$json.keyword}} 일러스트, 깔끔한 스타일, 블로그 헤더용”, “width”:512, “height”:512, … }
- Ghost 에 이미지/포스트 업로드
- Assets 업로드: POST /admin/images/upload/
- 포스트 생성: POST /admin/posts/
- 팁
- 이미지가 너무 많아지면 Ghost 스토리지 용량을 관리할 것
- 키워드 필터링(높은 상승률만)이나 언어 필터(영어·한국어) 로직 추가 가능
- Perplexity API는 공식 공개된 게 제한적이므로, 구글 트렌드 + 로컬 LLM 조합이 비용·속도 면에서 유리
- n8n 실행 중 에러는 “Execute Workflow”에서 로그 확인
이 구조만 잡아두시면, Cron → 트렌드 취합 → LLM 글 생성 → SD 이미지 → Ghost 게시 까지 완전 자동화가 가능합니다. 필요에 따라 각 노드 내 Javascript 함수로 로직을 더 세밀히 제어하거나, OpenAI 공식 API를 대체 노드로 사용해도 무방합니다.