Bỏ qua điều hướng
chuanweb.com
Quay lại tất cả bài viết

Tự động hoá nội dung blog bằng Ollama và cron: dây chuyền viết bài mỗi sáng

chuanweb.com 2 phút đọc

Duy trì blog có nghĩa là liên tục có nội dung mới. Nhưng ngồi viết mỗi ngày thì khó bền. Giải pháp thực dụng: một dây chuyền nhỏ gồm model AI nội bộ chạy bằng Ollama, một script sinh bài và cron 07:00 sáng để tự động đăng. Không tốn phí API, dữ liệu không rời máy.

Cấu trúc dây chuyền

  1. Ollama chạy model viết bài ngay trên máy (ví dụ gemma3).
  2. Script Python gọi API nội bộ, nhận nội dung MDX có đầy đủ frontmatter.
  3. Script kiểm tra frontmatter, lọc tags theo danh sách cho phép, ghi file vào thư mục blog.
  4. Lệnh build chuyển bài mới thành trang tĩnh.
  5. Cron kích hoạt toàn bộ chuỗi đúng giờ mỗi ngày.

Script sinh bài

Điểm mấu chốt là dùng giao thức tương thích OpenAI qua endpoint nội bộ của Ollama:

import json, urllib.request
from datetime import date

prompt = (
    "Hôm nay là " + date.today().isoformat() + ". "
    "Viết một bài kỹ thuật tiếng Việt hoàn chỉnh, kèm frontmatter hợp lệ "
    "(title, description, pubDate, tags, featured). Xuất ra raw MDX."
)

payload = {
    "model": "gemma3:4b",
    "messages": [{"role": "user", "content": prompt}],
    "stream": False,
    "options": {"num_ctx": 8192},
}

req = urllib.request.Request(
    "http://127.0.0.1:11434/api/chat",
    data=json.dumps(payload).encode(),
    headers={"Content-Type": "application/json"},
)
with urllib.request.urlopen(req, timeout=600) as resp:
    article = json.loads(resp.read())["message"]["content"]

Sau đó script kiểm tra nội dung có đủ --- frontmatter hay không, sửa pubDate về hôm nay, và ghi file theo tên dạng ngay-thang-slug.mdx.

Cron mỗi sáng

Cài cron chạy lúc 07:00:

# crontab -e
0 7 * * * /home/chuanweb/blog/scripts/publish.sh >> /home/chuanweb/blog/logs/cron.log 2>&1

Script publish.sh gói gọn toàn bộ: sinh bài, build site, ghi log có timestamp. Dù bước nào lỗi cũng được ghi lại rõ ràng để sáng hôm sau kiểm tra được ngay.

Những chi tiết quan trọng làm nên độ ổn định

  • Chống bài trùng: nếu ngày hôm đó đã có bài, script bỏ qua thay vì ghi đè.
  • Nội dung lỗi không làm dừng toàn bộ: mỗi lần sinh được bọc bắt lỗi riêng.
  • Model có chế độ suy nghĩ nội bộ (như qwen3) rất dễ làm hỏng frontmatter — nên ưu tiên model trả lời trực tiếp như gemma3.
  • Giữ keep_alive đủ dài để model không bị dỡ khỏi RAM giữa các lượt viết.

Kết luận

  • Dây chuyền Ollama + script + cron cho phép blog ra bài mỗi sáng mà tốn gần như không có chi phí vận hành.
  • Bài viết nên có người kiểm duyệt sơ bộ; coi AI là máy tạo nháp chất lượng cao.
  • Muốn nâng cấp, chỉ cần đổi model, thêm bước chèn ảnh minh họa hay tự đăng lên mạng xã hội trong cùng pipeline.