Creating an Article
;;;### สรุป หากไม่ต้องการอ่านมาก
# ขั้นที่ 1: สร้างไฟล์เปล่า (แค่มี front matter ยังไม่มีเนื้อหา)
hugo new content/it/linux/fix-copy-paste-in-nvim.md
# ขั้นที่ 2: เปิดไฟล์ เขียน/paste เนื้อหาเข้าไป
nvim content/it/linux/fix-copy-paste-in-nvim.md
# (เขียนเนื้อหา, บันทึกด้วย :wq)
# ขั้นที่ 3: หลังเขียนเสร็จจริงๆ แล้ว ค่อย deploy
./deploy.sh``
หลักการ: Archetype ทำงานเฉพาะตอน hugo new เท่านั้น
hugo new content/it/security/xxx.md ← ตรงนี้ archetype ทำงาน ใส่ front matter ให้อัตโนมัติ
↓
เปิดไฟล์นี้ (ที่มี front matter อยู่แล้ว) ด้วย nvim
↓
เอาแค่ "เนื้อหา" จาก Obsidian มา paste ต่อท้าย (ไม่เอา front matter ของ Obsidian ถ้ามี)เขียนใน Obsidian แล้วจะ copy มาใช้ — ทำแบบนี้
- สร้างไฟล์ปลายทางก่อนด้วย
hugo new(front matter มาเองแล้ว ไม่ต้องพิมพ์) - ใน Obsidian เขียนเนื้อหาตามปกติ (ไม่ต้องสนใจ front matter ของ Obsidian เอง ถ้ามันมี — เพราะจะไม่เอามาด้วย)
- Copy เฉพาะเนื้อหา (ไม่รวมส่วน frontmatter ของ Obsidian ถ้ามี
---คร่อมอยู่บนสุด) - เปิดไฟล์ปลายทาง (ที่สร้างจาก
hugo new) ด้วย nvim → ไปที่บรรทัดล่างสุด (หลัง---ปิดท้าย) → paste
ตัวอย่างให้เห็นภาพ
ไฟล์ที่ hugo new สร้างให้ (มี front matter แล้ว):
---
title: "Xxx"
date: 2026-08-29T10:00:00Z
type: docs
---เนื้อหาจาก Obsidian ที่จะ paste ต่อท้าย (ตรงบรรทัดว่างหลัง --- สุดท้าย):
เนื้อหาบทความทั้งหมด...วิธีเขียนบทความใหม่ — ใช้อ้างอิงทุกครั้ง
Workflow มาตรฐาน (ไม่มีรูปภาพ)
1. เขียน/ร่างใน Obsidian ตามปกติ (เครื่องไหนก็ได้ — notebook/Pi/desktop)
2. SSH เข้า droplet
3. เปิดไฟล์ใหม่ใน content/<หมวด>/<english-filename>.md
4. เติม front matter 3 บรรทัดที่จำเป็น (ดูด้านล่าง)
5. Paste เนื้อหาจาก Obsidian ต่อท้าย
6. เช็คว่ามี [[wiki-link]] ไหม → ถ้ามีต้องแก้เป็น markdown link ปกติ
7. รัน ./deploy.shFront Matter ที่ต้องมีทุกไฟล์ ในกรณีที่ยังไม่ Archetype
---
title: "ชื่อบทความ"
date: 2026-08-27
type: docs
---
เนื้อหาบทความ...| field | ทำไมต้องมี |
|---|---|
title | ชื่อที่โชว์บนเว็บและ sidebar |
date | ต้องเป็นวันนี้หรือย้อนหลังเท่านั้น ถ้าเป็นอนาคต Hugo จะไม่ publish บทความนั้นเงียบๆ (ไม่มี error แจ้ง) |
type: docs | บังคับ ถ้าไม่ใส่ หน้านั้นจะไม่มี sidebar/search ให้ |
กฎการตั้งชื่อไฟล์
- ชื่อไฟล์ (filename) ควรเป็นภาษาอังกฤษ ไม่มีเว้นวรรค เช่น
tcp-handshake-basics.md - เหตุผล: Hugo ใช้ชื่อไฟล์เป็นส่วนหนึ่งของ URL เว็บ ถ้าใช้ภาษาไทย/เว้นวรรค URL จะถูก encode เป็นอักขระประหลาด
title:ในเนื้อหาใส่ภาษาไทยได้ปกติ (อันนี้คือสิ่งที่โชว์บนหน้าเว็บจริง)
คำสั่ง Deploy (ทำทุกครั้งหลังแก้ไฟล์)
cd ~/blog-content
./deploy.shสคริปต์นี้ทำ 2 อย่างให้อัตโนมัติ:
hugo --minify --cleanDestinationDir— build content/ เป็น HTMLrsync -av --delete public/ /var/www/blog/— copy ไปที่ Apache เสิร์ฟจริง
เพิ่มหมวดใหม่ (section ใหญ่ระดับเดียวกับ it/nature/thoughts)
mkdir -p content/<ชื่อ-section>
cat > content/<ชื่อ-section>/_index.md << 'EOF'
---
title: "ชื่อที่จะโชว์"
type: docs
---
EOFเพิ่มหมวดย่อย (เหมือน it/network, it/security)
mkdir -p content/it/<ชื่อหมวดย่อย>
cat > content/it/<ชื่อหมวดย่อย>/_index.md << 'EOF'
---
title: "ชื่อที่จะโชว์"
type: docs
---
EOFกฎสำคัญ: ทุกโฟลเดอร์ใน content/ ต้องมีไฟล์ _index.md เป็น “ป้ายหมวด” เสมอ ไม่มีข้อยกเว้น — ถ้าขาด Hugo จะไม่รู้จักโฟลเดอร์นั้นเป็นหมวดหมู่
เรื่อง wiki-link จาก Obsidian
Obsidian ใช้ [[ชื่อบทความ]] แต่ Hugo ไม่เข้าใจ syntax นี้ ต้องแปลงเป็น markdown link ปกติก่อน paste:
[ข้อความที่จะโชว์](/หมวด/ชื่อไฟล์/)ตัวอย่าง: ถ้าจะลิงก์ไปบทความ content/it/network/tcp-handshake-basics.md
[อ่านเรื่อง TCP Handshake](/it/network/tcp-handshake-basics/)Git Backup (ทางเลือก ไม่บังคับ แต่แนะนำ)
cd ~/blog-content
git add .
git commit -m "เพิ่มบทความ: ชื่อบทความ"
git pushถ้าไม่อยากยุ่งกับ git ทุกครั้ง ข้ามได้ — ใช้แค่ ./deploy.sh เว็บก็อัปเดตแล้ว (git เป็นแค่ safety net เก็บประวัติ ไม่ใช่ requirement ของการ publish)
Repo: git@github.com:green-912/blog-content.git
ดีครับ ฝึกทำเองดีที่สุด — จำแม่นกว่าเยอะ
สิ่งที่ต้องทำ (ทวนสั้นๆ)
hugo new content/it/security/<ชื่อไฟล์เป็นอังกฤษ>.md
nvim ~/knupan-blog/content/it/security/<ชื่อไฟล์>.mdเขียนตามสรุป 8 ขั้นตอนที่ให้ไปด้านบน ใส่เป็นเนื้อหาของคุณเอง — ใช้ nvim copy-paste ที จบแล้วอย่าลืม:
./deploy.shยกตัวอย่าง สร้างหมวดใหม่
ชื่อหมวด = setup
mkdir -p ~/blog-content/content/setup
cat > ~/blog-content/content/setup/_index.md << 'EOF'
---
title: "Setup & Sysadmin"
type: docs
---
EOFmkdir -p ~/blog-content/content/setup คือสร้าง เฟาเดอร์ชื่อ setup ==คำสั่ง mkdir -p== ที่เดิมออฟชั่น p เพื่อสร้างในกรณีที่สร้างในเฟาเดอร์หลัก
กรณีสร้างบทความใหม่ ไว้ในที่สร้างเฟาเดอร์ใหม่
hugo new content/setup/hugo-blog-setup-from-scratch.md