2026-09-03 ServiceOn Blog 작업일지입니다. 오늘은 4건의 작업을 진행했습니다.

시스템 (전체 흐름 + n8n)

현상/기능

  • 전체 시스템을 n8n 워크플로우와 함께 분석 후 흐름을 정리

작업

  • 레포(web/admin/db/nginx/PM2/deploy) + n8n `SO-블로그 파이프라인` 발행본 분석
  • 휴대 SVG: `docs/so-blog-system-flow.svg`, 좁은 화면 `docs/so-blog-system-flow-mobile.svg`
  • 활성 블로그 워크플로는 1개. 다른 n8n 5개는 비활성·경로 밖
  • 관측: 실행 54–56 트리거 성공(21:00 UTC=06:00 KST). 서버 PM2/443은 미조회

n8n 워크플로우 (SO-블로그 파이프라인)

현상/기능

  • SO-블로그 파이프라인 노드 하나씩 뜯어보기 — 먼저 전체 노드 정리
  • 정리 내용을 PDF로 만들어 줘
  • 수집을 채널당 2건으로 한다. 매거진은 주단위로 바꾼다
  • 아니다 다시 수정: 채널당 2건, 뉴스마다 카드, 매거진은 하루 1번 묶기

작업

  • n8n `SO-블로그 파이프라인` (n8n-워크플로우) 노드 42개(스티커 3·실행 39) 인벤토리 정리
  • PDF: `docs/SO-블로그-파이프라인-노드정리.pdf` (원본 HTML `docs/so-blog-pipeline-nodes.html`)
  • 수집 5채널 실측(2026-09-03): AI타임스=`AI기술`(S1N24), IT비즈뉴스=`키워드뉴스`(S1N1), 나머지 3곳은 `전체`. 채널당 5건. 블로터 전체는 뷰티·금융·바이오가 상단
  • 인공지능신문 제안 URL `sc_section_code=S1N2` = **AI Tech**. 현재 노드(섹션 없음)와 상위 5건이 다름. 불꽃축제·카카오 아이돌 빠지고 모델·칩·연구 기사가 들어옴
  • `HTTP - 인공지능신문` URL을 S1N2(AI Tech)로 초안 수정. **publish 안 함**
  • 한국클라우드신문 제안 URL `S1N11` = **AI/로봇**. 다만 HTML 상단 ‘최신뉴스’가 본문보다 먼저라 `Parse HTML Lists`는 섹션이 아니라 사이트 최신 5건을 집을 수 있음
  • `HTTP - 한국클라우드신문`, `HTTP - IT비즈뉴스` 노드 삭제. Merge 입력 5→3 (AI타임스·인공지능신문·블로터). `Parse HTML Lists`는 미수정. **publish 안 함**
  • `HTTP - 블로터` 삭제, `HTTP - MIT테크리뷰` 추가 (`/category/ai/`의 `archive-new-posts-section` = 인공지능 의 최신 뉴스). `Parse HTML Lists`에 MIT 분기 추가. 상단 피처 카드 제외. **publish 안 함**
  • `Extract Article Text`: MIT테크리뷰는 `class=single-content` 균형 div를 본문으로 사용(약 1800자). 기존 CMS 패턴·og:image 유지. **publish 안 함**
  • 수동실행 요청. 초안 `Schedule Trigger`를 켜야 MCP 실행이 됨
  • 실행 #57 error: Extract가 `$('Resolve Article URL')`를 Function 래퍼 안에서 호출해 실패. Parse도 래퍼 때문에 AI타임스 5건만 수집
  • 실행 #58 error: Extract 래퍼 문법 오류(`missing ) after argument list`)
  • `Parse HTML Lists`·`Extract Article Text`에서 base64 Function 래퍼 제거, n8n 네이티브 jsCode로 교체. **publish 안 함**
  • 실행 #59 success (01:13–01:18 UTC, 약 5분). 수집 15건(채널당 5). 매거진 `b99f3a88-a711-11f1-8b7e-024e21a51863` 「공간지능·환각 해부·신소재·인프라·에이전트 안전까지 — 2026년 9월 첫째 주 AI·IT 핵심 브리핑」, 커버는 기사 이미지. 카드 3건 upsert. MIT 본문 추출·참고 링크 반영됨
  • 수집 채널당 2건, 매거진 주단위. `Parse HTML Lists` PER_SOURCE=2, `Limit - Card`=6. `Pick Today Magazine`은 일~토 주 매거진 upsert(신규는 일요일 06:00). AI Agent 주간 브리핑(이슈 3~4). **publish 안 함**
  • 웹: 주간호 라벨, 홈 히어로 주간 범위. `DB 패치` — 매거진은 주 단위 조회, 카드는 선택일. mockCall 동일
  • 주간 철회. 채널당 2건 유지. `Filter New Articles`는 수집 기사마다 카드(오늘 URL은 갱신, 과거 URL은 건너뜀). 매거진은 오늘 1호로 수집분 전부 묶음. 웹 일간호 복구. `012` 삭제. **publish 안 함**
  • 카드 프롬프트를 1장 카드뉴스형으로 교체(`title`/`summary`/`content`/`imagePrompt` 키 유지). 발행 없이 Anthropic(`claude-sonnet-4-6`) vs OpenAI(`gpt-5.4`) 병렬 초안
  • 발행 차단: Insert Blog/Card, Send a message, Generate/Upload 이미지 disable. `Limit - Card`=2. 매거진 검증 연결 제거(disabled Agent 통과 데이터가 Validate를 깨뜨려 실행 #60 error)
  • 실행 #61 success (06:51–06:52 UTC). 같은 AI타임스 2건을 양 모델이 초안. DB/메일/이미지 없음. **publish 안 함**. 모델 선택 대기
  • OpenAI(`gpt-5.4`) 카드 경로 채택. Anthropic 카드 클러스터 disable, Limit→Anthropic 연결 제거. `Prepare Card Post`는 `AI Agent - Card OpenAI`를 읽음. `Generate/Upload Card Image` 재연결·enable. Insert/메일/매거진은 꺼둠. **publish 안 함**
  • 실행 #62 success (07:06–07:08 UTC). 카드 2건 초안 + `gpt-image-1` PNG 2장(1.63MB/1.58MB, 생성 약 110초). `Upload Card Image`는 nginx **413**(기본 1MB). DB 미저장. **publish 안 함**
  • `ops/nginx/blog.serviceon.kr.conf` 80 블록에 `client_max_body_size 10m` 추가(API 한도와 맞춤). 이 PC에 SSH 키 없어 운영 443은 미적용. **publish 안 함**
  • 사용자 서버 nginx 적용 후 실행 #63 success (07:21–07:23 UTC). 413 해소. `Upload Card Image`는 **401 Unauthorized**. API는 떠 있고 `N8N_UPLOAD_TOKEN`이 서버 env에 없거나 n8n 헤더와 불일치. DB 미저장. **publish 안 함**
  • 실행 #64 success (07:30–07:32 UTC). 업로드 API는 URL 반환. 공개 GET은 Next standalone 404(`/uploads/posts` 런타임 파일이 빌드 public에 없음). Insert는 disable. **publish 안 함**
  • 업로드 서빙은 nginx `/uploads/` alias 선택. `ops/nginx/blog.serviceon.kr.conf` admin 80에 `alias /var/www/blog/admin/`. 운영 443은 서버에서 동일 적용 필요. GET 라우트·새 모듈 없음. **publish 안 함**
  • 사용자 admin 443에 `/uploads/` 적용. 테스트 PNG 2장 HTTP 200 (`e79d1a80-…` 1.48MB, `4a6cded4-…` 1.73MB). 카드 이미지 경로 확인됨. Insert/매거진/메일은 꺼둔 상태. **publish 안 함**
  • 카드 Insert enable, `Limit - Card`=6. 매거진 경로 복구(검증·커버·Insert). 메일 꺼둠. 실행 #65 success (08:01–08:10 UTC). 카드 6건 upsert + 오늘 매거진 `b99f3a88-…` 「공간지능부터 자기진화 AI까지 — 2026년 9월 3일 AI·IT 핵심 브리핑」(커버=기사 이미지). 검색 API로 확인. 일자 목록 API는 빈 배열. n8n **publish 안 함**
  • 홈 미표시 원인: 운영 `관련 데이터.tags` 없음 → `저장 절차` 실패 후 mock 폴백. 컬럼 추가. list/dates SP를 일간(`DATE(published_at)=p_date`)으로 복구. 기록: `DB 패치`. `/api/posts?date=2026-09-03`에 오늘 매거진+카드 반환 확인
  • 카드 프롬프트를 Headline/Subheadline/One-line/Key Points 매핑으로 수정. `Limit - Card`=2, 매거진 노드 일시 disable. 실행 #66 success (08:40–08:42 UTC). 오늘 URL 2건 update. **publish 안 함**. 매거진/Limit 복구는 사용자 확인 후
  • 오늘자 재발행 요청. `Limit - Card`=6, 매거진 경로 복구(메일 꺼둠). 실행 #67 success (08:48–08:56 UTC). 카드 6건 update + 오늘 매거진 `b99f3a88-…` 「공간 추론·환각 원인·자율 에이전트·자기진화 AI까지 — 2026년 9월 3일 AI 기술 브리핑」(커버=기사 이미지). n8n 워크플로 **publish 안 함**
  • 오늘자 이전 수집 카드 8건 삭제(`저장 절차`). 불꽃축제·구아틀라스·아스트라·카나나·보건의료·유령전력·iM금융·석유에너지. 오늘 매거진 1 + 카드 6 유지
  • `AI Agent` title 문구: `AI 기술 브리핑` → `기술 뉴스`. 다른 노드 미수정. n8n **publish 안 함**

페이지 (메뉴 주제 축)

현상/기능

  • 메뉴가 좀 매칭이 안된다. 상단에 홈, 카드뉴스, 매거진, 목록… 하단에 전체, 히스토리, AI소식
  • 홈 화면에는 어떤 내용을 넣으면 될까
  • A + 각각의 입구에 카드뉴스 2~3개 정도 리스트 시키기
  • 메뉴를 주제 축으로 정돈
  • AI 소식 보다 AI 뉴스로 변경

작업

  • 상단 메뉴: 홈 / AI 뉴스(`/cards`) / 히스토리(`/history`) / 포트폴리오 / 공유링크. 목록 제거
  • 푸터: 홈 / AI 뉴스 / 히스토리 / 구독
  • `/posts/[id]` 메뉴 포커스는 `postFormat`이 아니라 `category`(ai_news|dev_history). `proxyx-pathname` + `Header저장 절차`
  • 홈: 분류 칩·전체 피드 없음. 매거진 히어로 + 날짜띠 + AI 뉴스·히스토리 입구 각 2~3편. 히스토리도 선택일 기준(최신 고정 아님)
  • `/cards`·`/magazine`: 형식 탭(카드뉴스|매거진) + `category=ai_news` 고정
  • `/history`: `PostArchiveClient` 재사용, `lockedCategory=dev_history`, 분류 칩 숨김
  • 브레드크럼: 카드 `홈 > AI 뉴스|히스토리 > 제목`, 매거진 `홈 > AI 뉴스 > 매거진`. `/posts`는 검색 전용
  • 분류 칩 링크 모드: 전체=`/` · 히스토리=`/history` · AI 뉴스=`/cards`
  • 공개 라벨 `AI 소식` → `AI 뉴스`. 슬러그 `ai_news`·DB 저장명 유지

페이지 (카드 상세)

현상/기능

  • post 에도 사진이 들어가게 해. 덱에는 사진이 나온다

작업

  • `CardArticle`: 제목 아래 덱과 같은 `imageUrl` 히어로 표시 (`resolveMediaUrl`)
  • 상단 메뉴 포커스·주제 축 정돈은 「페이지 (메뉴 주제 축)」 참고