บันทึกการย้ายบล็อก Ghost สู่ Hugo

เมื่อความเรียบง่ายคือคำตอบ ช่วงแรกที่เริ่มเขียนบล็อก เราเลือกใช้ Ghost แบบ self-host เพราะมันดู modern, editor ใช้งานดี Ghost รันผ่าน Docker ใน homelab ที่บ้าน แล้วเชื่อมต่อออกไปข้างนอกด้วย Cloudflare Tunnel + โดเมนของเราเอง ทุกอย่างทำงานได้ดี …จนเวลาผ่านไป เราเริ่มรู้สึกว่าเวลาเปิดหน้าเว็บ มันหน่วงขึ้นนิดหน่อย ไม่มากก็จริง แต่ก็พอจะรู้สึกได้ และเริ่มน่ารำคาญขึ้นเรื่อย ๆ ที่แย่กว่านั้นคือ มีอยู่วันหนึ่งไฟที่บ้านดับยาวทั้งวัน UPS ที่ต่อกับ homelab เอาไม่อยู่ เว็บเลยดับหายไปทั้งวันแบบดื้อ ๆ 😅 ตอนนั้นแอบคิดในใจว่า “นี่เรากำลังโฮสต์บล็อกตัวเอง หรือกำลังดูแล data center กันแน่นะ” ถึงเวลาหาอะไรใหม่ที่เบากว่า จริง ๆ แล้วเราก็ไม่ได้ต้องการระบบ CMS อะไรใหญ่โตเลย เขียนโพสต์ง่าย ๆ ด้วย Markdown Publish ได้ไว ไม่ต้องรอระบบอะไรทั้งนั้น ใช้ Git จัดการเวอร์ชันได้สะดวก ไม่ต้องรัน server หรือ database ให้ปวดหัว พอลองหาดู static site generator ที่ตอบโจทย์พวกนี้ เราก็มาเจอกับ Hugo ตัวเล็ก เร็ว และเรียบง่าย Compile แต่ละรอบแค่เสี้ยววินาที ...

June 8, 2025 · 2 min · Teera

Ghost 5.x ใช้งาน SQLite

Ghost 5.x จะทำการ default database เป็น MySQL ซึ่งสมัยก่อนโน้น default database คือ sqlite BREAKING CHANGE: Switch from sqlite3 to MySQL by default by tianon · Pull Request #323 · docker-library/ghost แต่ถ้าเราอยากติดตั้ง ghost 5.x + sqlite ก็สามารถติดตั้งได้เหมือนกัน Configuration - Adapt your publication to suit your needs version: "3.8" services: ghost: image: ghost:latest container_name: ghost restart: always ports: - "2368:2368" environment: url: http://localhost:2368 database__client: sqlite3 database__connection__filename: "content/data/ghost.db" database__useNullAsDefault: true database__debug: false volumes: - ~/ghost:/var/lib/ghost/content docker-compose.yml “~/ghost/content/data/ghost.db” จะเป็น path สำหรับเก็บข้อมูล sqlite กรณีเราอยากย้าย database ก็แค่ copy file ghost.db ...

August 18, 2023 · 1 min · Teera

ติดตั้ง Frigate NVR โดยใช้ OpenVINO Detector ผ่านทาง Proxmox LXC

Frigate คือ NVR ที่มีการติดตั้ง AI object detection มาให้พร้อมใช้งาน โดยปกติแล้วการติดตั้ง Frigate เขาจะแนะนำให้ใช้ Google Coral TPU ซึ่งจะมีราคาค่อนข้างแพง และหาซื้อค่อนข้างยาก แต่ถ้าเราไม่มีก็สามารถใช้ CPU Detector ได้นะ ขั้นต่ำประมาณ 3 threads ทำงาน 100% ตลอดเวลา ฟังดูโหดร้ายมาก! แต่สำหรับบทความนี้เราจะใช้ OpenVINO Detector โดยเจ้าตัว OpenVINO จะสามารถใช้งานกับ CPU intel เจนเนอเรชั่น 6 ขึ้นไปเท่านั้น! และติดตั้งผ่านทาง Proxmox LXC วิธีเช็คว่าเครื่องเรารองรับ OpenVINO ให้เข้าไปที่ shell Proxmox จากนั้นใช้คำสั่ง lscpu | grep -e avx2 สามารถใช้คำสั่ง lscpu | grep -o avx หรือ lscpu | grep -o avx2 ถ้าเจอ Flags: avx2 แสดงว่าเครื่องรองรับ OpenVINO ...

July 29, 2023 · 2 min · Teera

ย้ายข้อมูล MariaDB 10 ไปใช้งาน MySQL 8

บล็อกที่ท่านกำลังอ่านทำงานอยู่บน Ghost CMS ซึ่งก่อนหน้านี้ใช้งาน MariaDB ในการจัดเก็บข้อมูล แต่เนื่องด้วย Ghost 5+ (เวอร์ชั่นใหม่) แนะนำให้ไปใช้งาน MySQL 8 ของเดิมบล็อกรันด้วย docker compose โดยจะมี ghost + mariadb รันคู่กัน version: "2.1" services: ghost: image: ghost:latest container_name: ghost restart: unless-stopped ports: - 8081:2368 environment: - database__client=mysql - database__connection__host=mariadb - database__connection__user=ghost - database__connection__password=ghost - database__connection__database=ghost - url=http://localhost:8081 volumes: - /ghost:/var/lib/ghost/content links: - mariadb mariadb: image: mariadb:latest container_name: mariadb restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=ghost - MYSQL_DATABASE=ghost - MYSQL_USER=ghost - MYSQL_PASSWORD=ghost volumes: - /mariadb:/var/lib/mysql เราทำการ backup database ของเก่าออกมาเป็นไฟล์ก่อน โดยใช้คำสั่ง ...

June 24, 2023 · 2 min · Teera

มาสร้าง RTSP Stream Proxy ใช้งานกันเถอะ

ขอเล่าเหตุการณ์ที่มาของ Stream proxy server ก่อนนะ ได้ซื้อกล้อง IP Camera มาใหม่ TP-Link Tapo C200 โดยเจ้าตัวกล้อง support rtsp ซึ่งตรงกับความต้องการ ความคมชัด 1080P ราคาไม่แพงมาก ตัวกล้องจะมี rtps มาให้ 2 stream high: rtsp://IP Address/stream1 low: rtsp:// IP Address/stream2 ซึ่งก็ดูเหมือนจะเพียงพอใช่ไหม แต่ๆปัญหาคือ ถ้าเราจะใช้งาน high stream มากกว่า 1 client ตัวกล้องไม่ยอมให้ใช้งาน ตัวอย่างเช่น client 1: สำหรับ NVR เพื่อบันทึกเหตุการณ์ต่างๆ 24 ชั่วโมง client 2: สำหรับ Home Assistant เพื่อทำระบบ automation แจ้งเตือน พอมองเห็นปัญหาแล้วใช่ไหม? RTSP stream proxy server สามารถแก้ไขเรื่องนี้ได้ ยังไง? จากรูปด้านบน proxy server จะทำหน้าสร้าง connection ให้แก่ client ต่างๆ ให้มากกว่า 1 connection ...

June 3, 2022 · 1 min · Teera

update docker image ให้ใหม่สดอยู่เสมอ

เมื่อเรามีจำนวน docker container จำนวนเยอะๆ การที่เราต้องมาคอย pull latest image แต่ละ container ค่อนข้างเสียเวลามาก อีกทั้งเราก็ไม่สามารถรู้ล่วงหน้าว่า เมื่อไหร่ image จะมีการ update เป็นเวอร์ชั่นใหม่ แต่ถ้าเราสามารถ automation update docker image ทุกๆ container ของเราชีวิตมันก็คงจะง่ายขึ้นเนอะ ** คำเตือน การตั้ง automation update อาจจะส่งเสียต่อ *container ของท่านได้ กรณีเวอร์ชั่นใหม่มี bug ค่อนข้างเยอะ หรือไม่ support ต่อระบบของท่าน เพราะฉนั้นกรุณาทำระบบ monitoring อย่างแข็งแรง! Watchtower คือ “หอสังเกตการณ์” 555+ อันนั้นก็ตรงตัวไป ถ้าอธิบายง่ายๆก็คือ docker container ตัวนึงที่จะคอยตรวจสอบ docker image ถ้าเจอมีการ update version ก็จะทำการ pull image จากนั้น restart container ให้เราทันที ฟังแล้วชีวิตง่ายขึ้นมาก ( อ่านเพิ่มเติม ) เริ่มติดตั้ง Watchtower สำหรับการติดตั้ง watchtower สามารถทำได้ทั้งแบบ docker run หรือ docker-compose แต่สำหรับวันนี้ผมจะใช้วิธี docker-compose โดยสร้าง stack ผ่านทาง portainer ...

July 2, 2021 · 1 min · Teera

แก้ปัญหา docker stats ไม่แสดงผล memory usage

ตอนนี้ใช้งาน raspberry pi 4 สำหรับ run docker ซึ่งก็มีจำนวน container ทำงานอยู่พอสมควร เพราะคิดว่าซื้อมาแล้ว ต้องใช้งานให้มันคุ้มค่าซิ! แต่เมื่อ container เริ่มเยอะ เครื่องมันก็จะเริ่มช้า! เราก็เลยอยากรู้ว่า container ตัวไหนใช้งาน cpu หรือ memory เยอะผิดปกติ ซึ่งเราสามารถใช้คำสั่ง docker stats docker stats ไม่แสดงผล memory usage อย่างที่เห็นดังรูปข้างบน MEM USAGE / LIMIT และ MEM % จะไม่แสดงผล ก็เลยไปลองหาข้อมูลจนเจอวิธีแก้ปัญหาดังกล่าว เลยคิดว่านำมาแชร์ เพื่อจะเป็นประโยชน์ วิธีแก้ปัญหา ทำการ backup cmdline.txt ไว้ก่อนเลย เผื่อมีอะไรผิดพลาด จากนั้นเข้าไปแก้ไขไฟล์ cmdline.txt ได้เลย sudo cp /boot/cmdline.txt /boot/cmdline.txt.old sudo nano /boot/cmdline.txt เมื่อเข้าไปในไฟล์ cmdline.txt เราจะเจอแบบข้างล่าง console=serial0,115200 console=tty1 root=PARTUUID=eb9dd260-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait ทำการแก้ไข โดยเพิ่มคำสั่ง cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory ต่อท้าย rootwait ...

May 12, 2021 · 1 min · Teera