shud.log
바이브코딩 기록

블로그 자동화 세팅 — Ollama로 글 초안 뽑고 텔레그램으로 승인하기

2026-04-12블로그자동화Ollama텔레그램봇맥미니바이브코딩

매일 블로그에 글을 올리고 싶은데 매일 글 쓰는 게 귀찮습니다.

봇은 24시간 돌아가면서 데이터를 쌓고 있습니다. 나도봇은 체결 기록을 남기고, 킴프봇은 포지션 현황을 기록합니다. 이 데이터가 있으면 매일 뭔가 쓸 거리는 생깁니다.

문제는 데이터 → 글로 가는 과정이 귀찮다는 겁니다. 수치를 보고, 정리하고, 문장으로 만들고, 포스팅하고. 이게 매일 반복되면 결국 안 하게 됩니다.

그래서 이 과정을 자동화했습니다.


전체 흐름

맥미니 봇 데이터 수집
→ Ollama (qwen2.5:14b) 글 생성
→ 텔레그램으로 제목 + 미리보기 전송
→ /publish 명령어로 승인
→ git push → Vercel 자동 배포

여기서 핵심은 Ollama입니다.

ChatGPT나 Claude API를 쓰면 API 키가 필요하고 글 하나 생성할 때마다 비용이 나갑니다. 맥미니에는 이미 Ollama가 설치돼있고, qwen2.5:14b 모델도 다운받아놨습니다. 이걸 그냥 쓰면 됩니다. 비용 0원.


hunslog_bot.py

봇 이름이 hunslog_bot.py입니다. 훈수로그에서 따왔습니다.

주요 함수들을 살펴보면:

collect_bot_data()

나도봇, 킴프봇, 잉크파머 각각의 로그와 state.json을 읽어서 숫자를 뽑습니다. 오늘 체결 횟수, 누적 PnL, 현재 포지션 수 같은 것들입니다.

def collect_bot_data():
    data = {}

    # 나도봇 (nado_grid)
    try:
        with open("/Users/shud/nado_grid/state.json") as f:
            state = json.load(f)
        data["nado"] = {
            "total_fills": state.get("total_fills", 0),
            "total_pnl": state.get("total_pnl_usd", 0),
            "balance": state.get("balance_usd", 0)
        }
    except:
        data["nado"] = None

    # 킴프봇 (kimp_bot)
    try:
        with open("/Users/shud/kimp_bot/state.json") as f:
            state = json.load(f)
        data["kimp"] = {
            "open_positions": len(state.get("positions", {})),
            "total_pnl": state.get("realized_pnl", 0)
        }
    except:
        data["kimp"] = None

    return data

generate_post()

수집한 데이터를 프롬프트에 넣어서 Ollama에 요청합니다.

def generate_post(data):
    prompt = f"""
당신은 크립토 봇을 운영하는 개인 투자자입니다.
오늘의 운영 데이터를 바탕으로 블로그 글을 작성해주세요.

데이터:
- 나도봇: 누적 체결 {data['nado']['total_fills']}회, 총 PnL ${data['nado']['total_pnl']:.2f}
- 킴프봇: 현재 포지션 {data['kimp']['open_positions']}개

조건:
- 한국어로 작성
- AI 느낌이 나지 않게 자연스럽게
- 실제 운영하면서 느낀 점 위주로
- 800~1000자 분량
"""

    response = requests.post("http://localhost:11434/api/generate", json={
        "model": "qwen2.5:14b",
        "prompt": prompt,
        "stream": False
    })

    return response.json()["response"]

publish_post()

승인이 들어오면 MDX 파일을 만들고 git push합니다.

def publish_post(title, content):
    slug = f"daily-{datetime.now().strftime('%Y-%m-%d')}"
    date = datetime.now().strftime('%Y-%m-%d')

    mdx = f"""---
title: {title}
date: 2026-04-12
tags: [나도봇, 킴프봇, 일일리포트]
---

{content}
"""

    path = f"/Users/shud/hunslog/tftchess/content/posts/{slug}.mdx"
    with open(path, "w") as f:
        f.write(mdx)

    subprocess.run(["git", "-C", "/Users/shud/hunslog/tftchess", "add", path])
    subprocess.run(["git", "-C", "/Users/shud/hunslog/tftchess", "commit", "-m", f"Add post: {slug}"])
    subprocess.run(["git", "-C", "/Users/shud/hunslog/tftchess", "push"])

텔레그램 명령어

봇이 매일 아침 9시에 자동으로 초안을 생성해서 텔레그램으로 보냅니다. 이런 형태입니다.

📝 오늘의 블로그 초안

제목: 나도봇 체결 130회 돌파 — 파라미터 수정 후 첫 주 결산

미리보기:
한 달 넘게 돌린 나도봇이 드디어 체결 130회를 넘겼습니다.
스탑로스를 2%로 늘리고 갭을 $300으로 넓힌 이후...

[/publish] [/regen] [/skip]

명령어들:

  • /publish — 이대로 발행
  • /regen — 다시 생성
  • /skip — 오늘은 건너뜀
  • /full — 전체 내용 보기 (4000자씩 나눠서 전송)
  • /draft — 수동으로 지금 생성
  • /status — 봇 상태 확인

세팅하면서 막혔던 것들

Ollama가 꺼져있으면 생성 실패

처음에 자꾸 "생성 실패" 알림이 왔습니다. 원인은 Ollama 서비스가 꺼져있어서였습니다. brew services start ollama로 시작하니까 됐습니다. 지금은 macOS 시작 시 자동으로 켜지도록 설정했습니다.

텔레그램 4096자 제한

블로그 글 한 편이 4096자를 넘어서 메시지가 잘렸습니다. 텔레그램은 메시지 하나당 최대 4096자입니다. /full 명령어를 추가해서 4000자씩 나눠서 보내도록 수정했습니다.

GitHub SSH 인증

처음에 HTTPS로 push하려고 했는데 Personal Access Token 설정이 복잡했습니다. 맥미니에서 SSH 키를 생성하고 GitHub에 등록하는 방식으로 바꿨습니다. 한번 설정하니까 이후로는 비밀번호 없이 push됩니다.

ssh-keygen -t ed25519 -C "shud@macmini"
cat ~/.ssh/id_ed25519.pub
# 이걸 GitHub Settings → SSH keys에 추가

LaunchAgent 등록

봇이 맥미니 재부팅 후에도 자동으로 켜지도록 LaunchAgent를 만들었습니다.

<!-- ~/Library/LaunchAgents/com.shud.hunslog.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0">
<dict>
  <key>Label</key><string>com.shud.hunslog</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/shud/.pyenv/versions/3.11.11/bin/python3.11</string>
    <string>/Users/shud/hunslog/hunslog_bot.py</string>
  </array>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
</dict>
</plist>

실제로 써보니

초안 품질이 생각보다 괜찮습니다. qwen2.5:14b가 한국어를 꽤 잘 씁니다. 숫자를 넣어주면 맥락을 잘 연결합니다.

물론 그대로 쓸 수 없는 경우도 있습니다. 봇 관련 용어를 잘못 쓰거나, 사실과 다른 해석을 붙이기도 합니다. 검수가 필요합니다.

그래서 흐름이 이렇게 됐습니다: 봇이 초안 생성 → 텔레그램으로 확인 → 수정이 필요하면 직접 파일 수정 후 /publish → 그대로면 바로 /publish.

전에는 "블로그 글 써야지"가 부담이었습니다. 지금은 초안이 와있고, 읽고 승인만 하면 됩니다. 하루 5분이면 됩니다.


생성에 약 24초 걸립니다. 9시에 요청을 보내면 9시 0분 24초에 초안이 텔레그램에 옵니다.

다음 개선 목표는 초안 품질을 높이는 것입니다. 지금은 숫자만 넣어주는데, 최근 체결 내역이나 로그에서 특이사항을 뽑아서 프롬프트에 추가하면 더 구체적인 글이 나올 것 같습니다.

← 목록으로