프로젝트로 돌아가기
Openclaw + SNS 카드뉴스 자동화15 min

실전 연동 매뉴얼: SSH 키 설정부터 카드 렌더까지

Windows 서버 준비, Linux SSH 키 발급, job.json 전송, worker.ps1 실행, 이미지 회수, slides.json 연결, 최종 렌더까지 실제 실행 순서와 명령어를 정리합니다.

Windows 서버 준비

연동을 시작하기 전에 Windows 서버에서 확인해야 할 것이 있습니다.

OpenSSH Server가 실행 중인지 먼저 확인합니다. Windows 설정 → 앱 → 선택적 기능에서 OpenSSH 서버가 설치되어 있는지 봅니다. 서비스 관리자에서 OpenSSH SSH Server가 실행 중(Running) 상태여야 합니다. Linux에서 SSH로 접속할 수 있어야 이후 단계가 모두 가능합니다.

작업 폴더 세 개가 필요합니다.

D:\016_CardNew\io\
D:\016_CardNew\scripts\
D:\016_CardNew\output\

io는 Linux와 Windows가 파일을 주고받는 교환 폴더입니다. job.json이 여기로 들어오고, result.json이 여기서 나갑니다. scripts에는 worker.ps1이 들어갑니다. output은 ComfyUI가 생성한 이미지가 저장되는 곳입니다.

worker.ps1은 D:\016_CardNew\scripts\ 에 저장합니다. ComfyUI가 http://127.0.0.1:8188/ 에서 실행 중인지도 확인합니다. worker.ps1이 이 주소로 API를 호출하기 때문에 ComfyUI가 꺼져 있으면 이미지 생성이 안 됩니다. comfy_workflow.json은 D:\016_CardNew\io\ 에 저장합니다.

Linux에서 SSH 키 발급

Linux 서버에서 카드뉴스 파이프라인 전용 SSH 키를 만듭니다. 다른 서비스와 키를 공유하지 않도록 별도로 만드는 것이 좋습니다.

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_cardnews

생성된 공개키를 Windows 서버에 등록합니다.

ssh-copy-id -i ~/.ssh/id_ed25519_cardnews.pub reedoc@<WINDOWS_IP>

ssh-copy-id 명령이 안 되는 환경이 있습니다. Windows OpenSSH에서 권한 문제로 막히는 경우입니다. 이럴 때는 공개키 내용을 직접 복사해서 Windows의 C:\Users\reedoc.ssh\authorized_keys 파일에 붙여넣습니다. 파일이 없으면 새로 만들면 됩니다.

연결이 됐는지 테스트합니다.

ssh -i ~/.ssh/id_ed25519_cardnews reedoc@<WINDOWS_IP> "whoami"

계정명이 응답으로 돌아오면 연결 완료입니다. 이 테스트가 통과해야 이후 단계를 진행할 수 있습니다.

job.json 만들고 Windows로 전송

job.json 형식은 고정합니다. job_id, topic, image_prompt, negative_prompt 네 항목이 들어갑니다.

cat > /tmp/job.json << 'JSON'
{
  "job_id": "mind_001",
  "topic": "peaceful_mind_cover",
  "image_prompt": "calm editorial illustration, peaceful mind, minimal composition, soft light, premium magazine style, vertical composition, clean background, no text",
  "negative_prompt": "blurry, watermark, text, messy background"
}
JSON

image_prompt는 카드뉴스용 규격을 그대로 씁니다. 핵심 규칙은 세 가지입니다. 텍스트가 없는 이미지여야 합니다. 카드 상단에 배치하기 때문에 이미지 자체에 글자가 들어가면 카피와 겹칩니다. 흑백 선화 또는 미니멀 일러스트 스타일로 맞춥니다. 이전 디자인과 일관성을 유지하려면 스타일을 고정해야 합니다. 상단 배치에 맞는 넓은 구도를 써야 합니다. 상단 60% 영역에 이미지가 들어가기 때문에 세로형 구도가 어울립니다.

job.json이 준비됐으면 Windows 서버로 전송합니다.

scp -i ~/.ssh/id_ed25519_cardnews /tmp/job.json \
  reedoc@<WINDOWS_IP>:"D:/016_CardNew/io/job.json"

worker.ps1 실행

SSH로 Windows 서버에 접속해서 worker.ps1을 실행합니다.

ssh -i ~/.ssh/id_ed25519_cardnews reedoc@<WINDOWS_IP> \
  'powershell -NoProfile -ExecutionPolicy Bypass -File "D:\016_CardNew\scripts\worker.ps1"'

worker.ps1이 실행되면 D:\016_CardNew\io\job.json을 읽고, ComfyUI API에 이미지 생성을 요청합니다. 생성이 완료되면 이미지를 D:\016_CardNew\output\ 에 저장하고 결과 경로를 D:\016_CardNew\io\result.json에 씁니다.

이 명령은 worker가 완료될 때까지 SSH 연결이 유지됩니다. 이미지 생성 시간이 길면 SSH 타임아웃이 날 수 있습니다. 이럴 때는 worker.ps1 실행을 백그라운드로 띄우고 result.json이 생길 때까지 대기하는 방식으로 바꿔야 합니다. 지금은 수동 실행 단계이므로 그냥 기다리면 됩니다.

result.json과 이미지 회수

worker가 완료됐으면 결과를 Linux로 가져옵니다.

먼저 result.json을 가져와서 output_image 경로를 확인합니다.

scp -i ~/.ssh/id_ed25519_cardnews \
  reedoc@<WINDOWS_IP>:"D:/016_CardNew/io/result.json" /tmp/result.json
cat /tmp/result.json

result.json에서 확인한 이미지 경로를 기준으로 이미지를 가져옵니다. 저장 위치는 차은별 워크스페이스의 generated-images 폴더입니다.

scp -i ~/.ssh/id_ed25519_cardnews \
  reedoc@<WINDOWS_IP>:"D:/016_CardNew/output/result_mind_001.jpg" \
  ~/.openclaw/workspace-chaeunbyul/chaeunbyul-engine/workspace/generated-images/mind_001.jpg

slides.json에 이미지 연결

이미지를 가져왔으면 slides.json의 해당 슬라이드에 image_url을 추가합니다. 이전 디자인 기준인 상단 이미지 + 하단 텍스트 박스 구조를 쓸 때는 슬라이드 타입을 cover-topimage 또는 content-topimage로 지정합니다.

이미지가 들어가는 슬라이드 예시입니다.

{
  "slide": 1,
  "type": "cover-topimage",
  "headline": "마음이 시끄러운 날,
이 문장을 떠올리세요",
  "body": "평온은 멀리 있는 게 아니라
내 안을 정리하는 데서 시작됩니다",
  "image_url": "./workspace/generated-images/mind_001.jpg"
}

텍스트만 있는 슬라이드는 image_url 없이 기존 타입 그대로 씁니다. 렌더러가 슬라이드 타입을 보고 이미지 포함 여부를 판단해서 맞는 템플릿을 적용합니다.

레이아웃 구조는 고정합니다. 이전에 만든 카드뉴스 기준으로 상단 55~60%는 이미지 영역, 하단 40~45%는 회색 텍스트 박스, 맨 아래는 계정명(@리도 인사이트)과 페이지 번호가 들어가는 푸터입니다.

최종 렌더

slides.json이 완성됐으면 렌더러를 실행합니다.

CHROME_PATH=/snap/bin/chromium node scripts/render.js \
  --slides workspace/slides.json \
  --style premium \
  --output output/ \
  --accent "#A855F7" \
  --account "리도 인사이트"

렌더가 완료되면 output/ 폴더에 슬라이드 순서대로 PNG 파일이 저장됩니다. 차은별이 이 파일들을 Discord 채널에 업로드하고 캡션을 함께 전달하면 한 세트가 완성됩니다.

추가로 만들어야 할 것

지금 흐름을 매번 명령어로 치는 건 비효율적입니다. 앞으로 세 가지를 추가하면 파이프라인이 훨씬 편해집니다.

send-to-worker.sh — job.json 생성, SCP 전송, SSH 실행을 하나의 스크립트로 묶습니다. 차은별이 이 스크립트 하나만 호출하면 됩니다.

fetch-worker-result.sh — result.json 회수, 이미지 다운로드, generated-images 폴더 저장을 자동으로 처리합니다.

cover-topimage.html / content-topimage.html 템플릿 — 상단 이미지 영역과 하단 텍스트 박스 구조가 분리된 템플릿입니다. 이미지 경로만 바꿔 끼우면 레이아웃이 자동으로 완성됩니다.

이 세 가지가 갖춰지면 "주제 입력 → 최종 PNG 출력"의 완전 자동화가 가능한 상태가 됩니다.

리도 프로필

리도 인사이트

기술을 현장 언어로 다시 풀어 쓰는 사람

3D 설계, 광통신 인프라 장비 개발, 글로벌 현장 교육을 19년 넘게 다뤄왔고, 요즘은 AI 자동화, 꿈꾸는 카메라, 실무 채널 운영을 연결해 복잡한 일을 더 쉽게 만드는 방법을 기록하고 있습니다.

다음 대화

읽고 끝내지 말고, 실제 문제로 이어가도 좋습니다.

자동화, 설계, 교육, 콘텐츠 중 무엇이든 지금 필요한 문제부터 같이 정리해볼 수 있습니다.

편하게 문의하기