2026-08-25 ServiceOn Blog 작업일지입니다. 오늘은 1건의 작업을 진행했습니다.
n8n 워크플로우 (ServiceOn-Blog Workflow)
현상/기능
- 'ServiceOn-Blog Workflow' 전체 흐름 확인 → 당장 수정 가능한 부분 도출 → 전부 권장사항으로 수정
현상/기능
- 이미지 생성 복구: 업로드 API 추가(옵션 1) 진행
작업
- n8n `ServiceOn-Blog Workflow` (n8n-워크플로우) 수정 후 publish (activeVersionId `af729ae5`)
- `RSS - beehiiv` 죽은 노드 연결: `Limit - beehiiv`(5건) 신규 → `Merge All Sources` 입력 3→4개로 확장 후 4번째 입력에 연결
- 카드뉴스 중복 발행 방지: `Fetch Existing Card URLs`(MySQL, 기존 card source_url 전체 조회, executeOnce+alwaysOutputData) → `Filter New Articles`(Code, 기존 source_url 과 겹치는 기사 제외) → `Limit - Card`(하루 최대 10건) → `AI Agent - Card` 로 재배선 (기존 `Edit Fields`→`AI Agent - Card` 직결 제거)
- `Prepare Card Post` source_url fallback을 `$('Edit Fields')` → `$('Filter New Articles')` 참조로 변경 (필터 삽입 후 페어링 유지)
- `Parse HTML Lists`: origin 미검출 시 해당 소스 건너뛰기 (불완전한 상대경로 URL 저장 방지)
- `Aggregate - google` → `Aggregate - All Sources` 노드명 변경 (실제로 전 소스 집계)
- 미해결(기존 검증 경고): Gmail `Send a message` 노드의 operation 파라미터 생략 경고 — 기본값 send 로 동작, 영향 없음
- 수동 테스트 실행 #38 success (64초): 8개 소스 × 5건 = 40건 수집(beehiiv 포함), 중복 필터 통과 후 매거진 1건(`c71147b5`) + 카드 10건 발행 확인. `Limit - Card`(10건) 정상 작동
- 미해결 1: Gmail 자격증명 만료 — "The credential 'Gmail account' needs to be reconnected" → n8n UI에서 재연결 필요 (메일만 실패, 발행은 계속됨)
- 미해결 2: 이미지 생성 실패(기존 문제) — OpenAI 계정에서 dall-e-3 제거됨(gpt-image 계열만 제공). gpt-image 는 URL 반환 미지원(바이너리만)이라 image_url 파이프라인과 비호환 → 이미지 호스팅 방안 결정 필요 (admin `/api/upload` 는 세션 인증 필수라 n8n 직접 사용 불가)
- admin 신규 API `/api/upload/n8n`
- 인증: `x-upload-token` 헤더 = env `N8N_UPLOAD_TOKEN` (timingSafeEqual 비교, 세션 불필요)
- FormData `file` → `public/uploads/posts/{uuid}.ext` 저장 (png/jpeg/webp, 10MB)
- `서버 설정` 기반 절대 URL 반환 (web 이 image_url 을 그대로 <img src> 로 사용하므로)
- 로컬 테스트: 잘못된 토큰 401, 정상 토큰 200 + 파일 저장 확인
- env: `N8N_UPLOAD_TOKEN` 을 /에 추가, 에 항목 안내
- `.github/workflows/deploy.yml`: rsync 에 `--exclude='public/uploads/'` 추가 — 배포 시 서버 업로드 이미지(포스트·포트폴리오)가 --delete 로 삭제되던 잠재 버그 수정
- n8n 워크플로우 수정 후 publish (activeVersionId `acc3086f`)
- `Generate Magazine Image`/`Generate Card Image`: dall-e-3 → gpt-image-1-mini (quality medium, 1024x1024, 바이너리 출력 `data`)
- 신규 `Upload Magazine Image`/`Upload Card Image` (HTTP Request): multipart 로 admin API 에 업로드, onError=continueRegularOutput (업로드 실패해도 발행 계속)
- 배선: Generate → Upload → Prepare 로 변경, Prepare 의 image_url 은 `$json.url || ''`
- 배포 필요: 서버에 API 가 아직 없어 커밋+push(GitHub Actions 배포)와 서버 에 `N8N_UPLOAD_TOKEN` 추가 필요