[{"data":1,"prerenderedAt":4648},["ShallowReactive",2],{"blogs-2026-08-03-grafana-alloy-loki":3,"next-blog-2026-08-03-grafana-alloy-loki":1887,"prev-blog-2026-08-03-grafana-alloy-loki":1887,"recommended-blog-2026-08-03-grafana-alloy-loki":1898,"related-blog-2026-08-03-grafana-alloy-loki":2140},{"id":4,"title":5,"body":6,"date":1882,"description":1883,"draft":1884,"extension":1885,"meta":1886,"navigation":131,"next":1887,"ogTitle":1888,"path":1889,"pin":1884,"prev":1887,"recommends":1890,"seo":1892,"sitemap":1893,"stem":1894,"tags":1895,"__hash__":1897},"content/blogs/2026-08-03-grafana-alloy-loki.md","ลองใช้ Grafana Alloy เก็บ log เข้า Loki",{"type":7,"value":8,"toc":1869},"minimark",[9,14,23,31,34,49,53,56,59,62,94,102,105,108,181,184,200,211,214,253,257,264,391,413,416,458,461,478,481,566,577,581,588,594,606,610,613,729,732,735,749,830,849,852,895,898,1123,1129,1182,1188,1191,1197,1200,1250,1256,1260,1267,1298,1305,1380,1386,1389,1413,1417,1424,1523,1526,1745,1757,1760,1763,1766,1807,1810,1813,1816,1822,1826,1865],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17,18,22],"p",{},"สวัสดีครับ พอดีที่บ้านผมมี container รันอยู่หลายตัว แล้วเวลาจะดู log ทีก็ต้อง ",[19,20,21],"code",{},"docker logs"," ไล่ทีละตัว ซึ่งพอมันเยอะขึ้นเรื่อย ๆ ก็เริ่มไม่ไหวแล้วครับ เลยคิดว่าถึงเวลารวม log ไว้ที่เดียวสักที",[15,24,25,26,30],{},"ตัวที่คนใช้กันมานานคือ Promtail แต่พอไปเปิดเอกสารดูก็เจอบรรทัดนี้ครับ \"Promtail is end of life (EOL) as of March 2, 2026\" คือหมดอายุไปตั้งแต่ต้นปีแล้ว ไม่มี update ไม่มี security fix อีกต่อไป (Grafana Agent ก็หมดอายุไปก่อนหน้านั้นตั้งแต่ 1 พฤศจิกายน 2025 เหมือนกัน) ตัวที่ Grafana ให้ย้ายไปคือ ",[27,28,29],"strong",{},"Alloy"," ผมเลยข้ามไปลองตัวนี้เลยดีกว่า",[15,32,33],{},"บทความนี้ผมรันจริงทั้งหมดบนเครื่องตัวเองด้วย docker นะครับ output ที่แปะไว้ก๊อปมาจาก terminal ตรง ๆ ไม่ได้พิมพ์ขึ้นมาเอง เวอร์ชันที่ใช้คือ Alloy v1.18.0 กับ Loki 3.7.4",[15,35,36,37,40,41,44,45,48],{},"ของที่ต้องมีก่อนคือ docker กับ ",[19,38,39],{},"jq"," (เอาไว้อ่าน JSON ที่ Loki ตอบกลับมา ถ้ายังไม่มีก็ ",[19,42,43],{},"brew install jq"," หรือ ",[19,46,47],{},"apt install jq",") แล้วก็ต้องมี port 3100 กับ 12345 ว่างอยู่ด้วย",[10,50,52],{"id":51},"alloy-คืออะไร","Alloy คืออะไร",[15,54,55],{},"Alloy คือ distribution ของ OpenTelemetry Collector ที่ Grafana ทำขึ้นมาเองครับ (OpenTelemetry Collector คือตัวกลางมาตรฐานที่คอยรับข้อมูลพวก log, metrics, traces จากที่นึงแล้วส่งต่อไปอีกที่นึง) เอาไว้เก็บ log, metrics, traces แล้วก็ profiles ส่งไปยังปลายทางที่เราต้องการ พูดง่าย ๆ คือของเดิมที่เคยแยกเป็น Promtail (log) กับ Prometheus agent (metrics) ตอนนี้รวมมาอยู่ในตัวเดียวแล้ว",[15,57,58],{},"ที่ผมชอบคือมันเขียน config เป็นก้อน ๆ เรียกว่า component แล้วเอา output ของก้อนนึงต่อเข้า input ของอีกก้อนได้เลย ไม่ได้เขียนเป็น YAML ก้อนใหญ่ ๆ ที่ต้องมานั่งไล่ว่า key ไหนอยู่ใต้ key ไหน เดี๋ยวจะได้เห็นกันครับ",[15,60,61],{},"เช็คเวอร์ชันได้แบบนี้",[63,64,69],"pre",{"className":65,"code":66,"language":67,"meta":68,"style":68},"language-sh shiki shiki-themes material-theme-lighter one-dark-pro github-dark","docker run --rm grafana/alloy:latest --version\n","sh","",[19,70,71],{"__ignoreMap":68},[72,73,76,80,84,88,91],"span",{"class":74,"line":75},"line",1,[72,77,79],{"class":78},"sosa_","docker",[72,81,83],{"class":82},"sAlJX"," run",[72,85,87],{"class":86},"sEoV_"," --rm",[72,89,90],{"class":82}," grafana/alloy:latest",[72,92,93],{"class":86}," --version\n",[63,95,100],{"className":96,"code":98,"language":99},[97],"language-text","alloy, version v1.18.0 (branch: HEAD, revision: a435563)\n  build user:       root@buildkitsandbox\n  build date:       2026-07-20T09:02:30Z\n  go version:       go1.26.5\n  platform:         linux/arm64\n  tags:             gore2regex,netgo,embedalloyui,promtail_journal_enabled\n","text",[19,101,98],{"__ignoreMap":68},[10,103,104],{"id":104},"วิธีการติดตั้ง",[15,106,107],{},"ผมยก Loki ขึ้นมาก่อนเพื่อให้มีปลายทางให้ส่ง แล้วค่อยตาม Alloy ทีหลัง สร้าง network ให้สองตัวคุยกันได้ด้วย",[63,109,111],{"className":65,"code":110,"language":67,"meta":68,"style":68},"docker network create alloy-net\n\ndocker run -d --name loki-demo \\\n  --network alloy-net \\\n  -p 3100:3100 \\\n  grafana/loki:latest\n",[19,112,113,126,133,153,164,175],{"__ignoreMap":68},[72,114,115,117,120,123],{"class":74,"line":75},[72,116,79],{"class":78},[72,118,119],{"class":82}," network",[72,121,122],{"class":82}," create",[72,124,125],{"class":82}," alloy-net\n",[72,127,129],{"class":74,"line":128},2,[72,130,132],{"emptyLinePlaceholder":131},true,"\n",[72,134,136,138,140,143,146,149],{"class":74,"line":135},3,[72,137,79],{"class":78},[72,139,83],{"class":82},[72,141,142],{"class":86}," -d",[72,144,145],{"class":86}," --name",[72,147,148],{"class":82}," loki-demo",[72,150,152],{"class":151},"sicAX"," \\\n",[72,154,156,159,162],{"class":74,"line":155},4,[72,157,158],{"class":86},"  --network",[72,160,161],{"class":82}," alloy-net",[72,163,152],{"class":151},[72,165,167,170,173],{"class":74,"line":166},5,[72,168,169],{"class":86},"  -p",[72,171,172],{"class":82}," 3100:3100",[72,174,152],{"class":151},[72,176,178],{"class":74,"line":177},6,[72,179,180],{"class":82},"  grafana/loki:latest\n",[15,182,183],{},"Loki ใช้เวลาบูตพอสมควรครับ ของผมรอไป 17 วินาทีกว่าจะพร้อมรับ query เช็คได้แบบนี้",[63,185,187],{"className":65,"code":186,"language":67,"meta":68,"style":68},"curl -s http://localhost:3100/ready\n",[19,188,189],{"__ignoreMap":68},[72,190,191,194,197],{"class":74,"line":75},[72,192,193],{"class":78},"curl",[72,195,196],{"class":86}," -s",[72,198,199],{"class":82}," http://localhost:3100/ready\n",[15,201,202,203,206,207,210],{},"ถ้ายังไม่พร้อมจะได้ ",[19,204,205],{},"Ingester not ready: waiting for 15s after being ready"," กลับมา รอจนกว่าจะขึ้นคำว่า ",[19,208,209],{},"ready"," แล้วค่อยไปต่อ",[15,212,213],{},"จากนั้นเตรียมโฟลเดอร์กับไฟล์ log ตัวอย่างที่จะให้ Alloy อ่าน",[63,215,217],{"className":65,"code":216,"language":67,"meta":68,"style":68},"mkdir -p ~/alloy/logs\necho '{\"level\":\"info\",\"msg\":\"service started\"}' > ~/alloy/logs/app.log\n",[19,218,219,230],{"__ignoreMap":68},[72,220,221,224,227],{"class":74,"line":75},[72,222,223],{"class":78},"mkdir",[72,225,226],{"class":86}," -p",[72,228,229],{"class":82}," ~/alloy/logs\n",[72,231,232,236,240,243,246,250],{"class":74,"line":128},[72,233,235],{"class":234},"sJZfL","echo",[72,237,239],{"class":238},"snfNA"," '",[72,241,242],{"class":82},"{\"level\":\"info\",\"msg\":\"service started\"}",[72,244,245],{"class":238},"'",[72,247,249],{"class":248},"sbGrh"," >",[72,251,252],{"class":82}," ~/alloy/logs/app.log\n",[10,254,256],{"id":255},"เขียน-config","เขียน config",[15,258,259,260,263],{},"สร้างไฟล์ ",[19,261,262],{},"~/alloy/config.alloy"," ขึ้นมาครับ จะใช้ editor เปิดเขียนเองก็ได้ หรือก๊อปทั้งก้อนนี้ไปวางใน terminal เลยก็ได้",[63,265,267],{"className":65,"code":266,"language":67,"meta":68,"style":68},"cat > ~/alloy/config.alloy \u003C\u003C'EOF'\nlocal.file_match \"applog\" {\n  path_targets = [{\n    __path__ = \"/var/log/demo/*.log\",\n    job      = \"demo-app\",\n    host     = \"homelab\",\n  }]\n}\n\nloki.source.file \"applog\" {\n  targets    = local.file_match.applog.targets\n  forward_to = [loki.write.default.receiver]\n}\n\nloki.write \"default\" {\n  endpoint {\n    url = \"http://loki-demo:3100/loki/api/v1/push\"\n  }\n}\nEOF\n",[19,268,269,286,291,296,301,306,311,317,323,328,334,340,346,351,356,362,368,374,380,385],{"__ignoreMap":68},[72,270,271,274,276,279,282],{"class":74,"line":75},[72,272,273],{"class":78},"cat",[72,275,249],{"class":248},[72,277,278],{"class":82}," ~/alloy/config.alloy",[72,280,281],{"class":248}," \u003C\u003C",[72,283,285],{"class":284},"s2KDN","'EOF'\n",[72,287,288],{"class":74,"line":128},[72,289,290],{"class":82},"local.file_match \"applog\" {\n",[72,292,293],{"class":74,"line":135},[72,294,295],{"class":82},"  path_targets = [{\n",[72,297,298],{"class":74,"line":155},[72,299,300],{"class":82},"    __path__ = \"/var/log/demo/*.log\",\n",[72,302,303],{"class":74,"line":166},[72,304,305],{"class":82},"    job      = \"demo-app\",\n",[72,307,308],{"class":74,"line":177},[72,309,310],{"class":82},"    host     = \"homelab\",\n",[72,312,314],{"class":74,"line":313},7,[72,315,316],{"class":82},"  }]\n",[72,318,320],{"class":74,"line":319},8,[72,321,322],{"class":82},"}\n",[72,324,326],{"class":74,"line":325},9,[72,327,132],{"emptyLinePlaceholder":131},[72,329,331],{"class":74,"line":330},10,[72,332,333],{"class":82},"loki.source.file \"applog\" {\n",[72,335,337],{"class":74,"line":336},11,[72,338,339],{"class":82},"  targets    = local.file_match.applog.targets\n",[72,341,343],{"class":74,"line":342},12,[72,344,345],{"class":82},"  forward_to = [loki.write.default.receiver]\n",[72,347,349],{"class":74,"line":348},13,[72,350,322],{"class":82},[72,352,354],{"class":74,"line":353},14,[72,355,132],{"emptyLinePlaceholder":131},[72,357,359],{"class":74,"line":358},15,[72,360,361],{"class":82},"loki.write \"default\" {\n",[72,363,365],{"class":74,"line":364},16,[72,366,367],{"class":82},"  endpoint {\n",[72,369,371],{"class":74,"line":370},17,[72,372,373],{"class":82},"    url = \"http://loki-demo:3100/loki/api/v1/push\"\n",[72,375,377],{"class":74,"line":376},18,[72,378,379],{"class":82},"  }\n",[72,381,383],{"class":74,"line":382},19,[72,384,322],{"class":82},[72,386,388],{"class":74,"line":387},20,[72,389,390],{"class":284},"EOF\n",[15,392,393,394,397,398,401,402,405,406,409,410,412],{},"ขั้นตอนนี้ห้ามข้ามนะครับ ถ้ายังไม่มีไฟล์นี้แล้วไปสั่ง ",[19,395,396],{},"docker run"," เลย docker จะสร้าง",[27,399,400],{},"โฟลเดอร์","ชื่อ ",[19,403,404],{},"config.alloy"," ให้แทน แล้ว container จะพังตั้งแต่ยังไม่ทันขึ้น พร้อม error ที่งงมากว่า ",[19,407,408],{},"not a directory"," แถม ",[19,411,21],{}," ก็ว่างเปล่าไม่มีอะไรให้ดูด้วย",[15,414,415],{},"อ่าน config จากบนลงล่างได้เลยครับ",[417,418,419,434,452],"ul",{},[420,421,422,425,426,429,430,433],"li",{},[19,423,424],{},"local.file_match"," คือตัวบอกว่าจะอ่านไฟล์ไหนบ้าง ตรง ",[19,427,428],{},"job"," กับ ",[19,431,432],{},"host"," คือ label ที่จะติดไปกับ log ทุกบรรทัด เอาไว้ค้นทีหลัง",[420,435,436,439,440,443,444,447,448,451],{},[19,437,438],{},"loki.source.file"," คือตัวอ่านไฟล์ สังเกตว่า ",[19,441,442],{},"targets"," ชี้ไปที่ผลลัพธ์ของบล็อกแรกตรง ๆ (",[19,445,446],{},"local.file_match.applog.targets",") แล้ว ",[19,449,450],{},"forward_to"," ก็ชี้ต่อไปยังบล็อกที่สาม",[420,453,454,457],{},[19,455,456],{},"loki.write"," คือตัวส่งออก",[15,459,460],{},"การต่อกันแบบนี้แหละครับที่เป็นจุดขายของ Alloy คือ output ของ component นึงเสียบเข้า input ของอีกตัวได้เลย",[15,462,463,464,466,467,470,471,474,475,477],{},"อีกเรื่องที่ควรรู้ไว้คือ ",[19,465,438],{}," มีบล็อก ",[19,468,469],{},"file_match"," ในตัวอยู่แล้ว ใส่ glob ลงไปใน ",[19,472,473],{},"__path__"," ตรง ๆ ได้โดยไม่ต้องมี ",[19,476,424],{}," แยกออกมา แต่ผมเลือกเขียนแยกเพราะอยากให้เห็นภาพว่า component ต่อกันยังไง แล้วถ้าวันหลังมี component อื่นอยากใช้ targets ชุดเดียวกันก็ดึงไปใช้ต่อได้",[15,479,480],{},"ทีนี้รันได้แล้ว",[63,482,484],{"className":65,"code":483,"language":67,"meta":68,"style":68},"docker run -d --name alloy-demo \\\n  --network alloy-net \\\n  -p 12345:12345 \\\n  -v ~/alloy/config.alloy:/etc/alloy/config.alloy \\\n  -v ~/alloy/logs:/var/log/demo \\\n  grafana/alloy:latest \\\n    run --server.http.listen-addr=0.0.0.0:12345 \\\n    --storage.path=/var/lib/alloy/data \\\n    /etc/alloy/config.alloy\n",[19,485,486,501,509,518,528,537,544,554,561],{"__ignoreMap":68},[72,487,488,490,492,494,496,499],{"class":74,"line":75},[72,489,79],{"class":78},[72,491,83],{"class":82},[72,493,142],{"class":86},[72,495,145],{"class":86},[72,497,498],{"class":82}," alloy-demo",[72,500,152],{"class":151},[72,502,503,505,507],{"class":74,"line":128},[72,504,158],{"class":86},[72,506,161],{"class":82},[72,508,152],{"class":151},[72,510,511,513,516],{"class":74,"line":135},[72,512,169],{"class":86},[72,514,515],{"class":82}," 12345:12345",[72,517,152],{"class":151},[72,519,520,523,526],{"class":74,"line":155},[72,521,522],{"class":86},"  -v",[72,524,525],{"class":82}," ~/alloy/config.alloy:/etc/alloy/config.alloy",[72,527,152],{"class":151},[72,529,530,532,535],{"class":74,"line":166},[72,531,522],{"class":86},[72,533,534],{"class":82}," ~/alloy/logs:/var/log/demo",[72,536,152],{"class":151},[72,538,539,542],{"class":74,"line":177},[72,540,541],{"class":82},"  grafana/alloy:latest",[72,543,152],{"class":151},[72,545,546,549,552],{"class":74,"line":313},[72,547,548],{"class":82},"    run",[72,550,551],{"class":86}," --server.http.listen-addr=0.0.0.0:12345",[72,553,152],{"class":151},[72,555,556,559],{"class":74,"line":319},[72,557,558],{"class":86},"    --storage.path=/var/lib/alloy/data",[72,560,152],{"class":151},[72,562,563],{"class":74,"line":325},[72,564,565],{"class":82},"    /etc/alloy/config.alloy\n",[15,567,568,569,572,573,576],{},"ตรง ",[19,570,571],{},"--server.http.listen-addr=0.0.0.0:12345"," อย่าลืมใส่นะครับ ถ้าไม่ใส่มันจะไป bind ที่ ",[19,574,575],{},"127.0.0.1"," ข้างใน container แล้วเราจะเข้าหน้า UI จากข้างนอกไม่ได้เลย",[10,578,580],{"id":579},"หน้า-ui-ของ-alloy","หน้า UI ของ Alloy",[15,582,583,584,587],{},"เปิด ",[19,585,586],{},"http://localhost:12345"," แล้วไปที่เมนู Graph ได้เลยครับ (หน้าแรกที่เด้งขึ้นมาจะเป็น Components) มันจะวาด pipeline ให้ดูว่า component ไหนต่อกับอันไหน",[15,589,590],{},[591,592],"img",{"alt":68,"src":593},"/images/2026-08-03-grafana-alloy-loki/alloy-ui.png",[15,595,596,597,599,600,602,603,605],{},"นี่แหละครับคือสิ่งที่อธิบายไปเมื่อกี้ ",[19,598,424],{}," ยิงไปหา ",[19,601,438],{}," แล้วต่อไป ",[19,604,456],{}," ตรงตาม config ที่เขียนไว้เป๊ะ ๆ เส้นสีเขียวคือ log ถ้ามี metrics หรือ traces ด้วยก็จะเป็นคนละสี อันนี้มีประโยชน์มากตอน config เริ่มใหญ่ เพราะดูรูปทีเดียวรู้เลยว่าอะไรต่อกับอะไร",[10,607,609],{"id":608},"เช็คว่า-log-เข้าจริง","เช็คว่า log เข้าจริง",[15,611,612],{},"ลองเขียน log เพิ่มเข้าไปในไฟล์",[63,614,616],{"className":65,"code":615,"language":67,"meta":68,"style":68},"for i in 1 2 3; do\n  echo \"{\\\"level\\\":\\\"info\\\",\\\"msg\\\":\\\"handled request $i\\\"}\" >> ~/alloy/logs/app.log\ndone\necho '{\"level\":\"error\",\"msg\":\"database connection refused\"}' >> ~/alloy/logs/app.log\n",[19,617,618,647,709,714],{"__ignoreMap":68},[72,619,620,624,628,631,634,637,640,644],{"class":74,"line":75},[72,621,623],{"class":622},"s36IK","for",[72,625,627],{"class":626},"sLHrO"," i",[72,629,630],{"class":622}," in",[72,632,633],{"class":82}," 1",[72,635,636],{"class":82}," 2",[72,638,639],{"class":82}," 3",[72,641,643],{"class":642},"stlKB",";",[72,645,646],{"class":622}," do\n",[72,648,649,652,655,658,661,664,666,669,671,674,676,679,681,684,686,688,690,693,696,698,701,704,707],{"class":74,"line":128},[72,650,651],{"class":234},"  echo",[72,653,654],{"class":238}," \"",[72,656,657],{"class":82},"{",[72,659,660],{"class":151},"\\\"",[72,662,663],{"class":82},"level",[72,665,660],{"class":151},[72,667,668],{"class":82},":",[72,670,660],{"class":151},[72,672,673],{"class":82},"info",[72,675,660],{"class":151},[72,677,678],{"class":82},",",[72,680,660],{"class":151},[72,682,683],{"class":82},"msg",[72,685,660],{"class":151},[72,687,668],{"class":82},[72,689,660],{"class":151},[72,691,692],{"class":82},"handled request ",[72,694,695],{"class":626},"$i",[72,697,660],{"class":151},[72,699,700],{"class":82},"}",[72,702,703],{"class":238},"\"",[72,705,706],{"class":248}," >>",[72,708,252],{"class":82},[72,710,711],{"class":74,"line":135},[72,712,713],{"class":622},"done\n",[72,715,716,718,720,723,725,727],{"class":74,"line":155},[72,717,235],{"class":234},[72,719,239],{"class":238},[72,721,722],{"class":82},"{\"level\":\"error\",\"msg\":\"database connection refused\"}",[72,724,245],{"class":238},[72,726,706],{"class":248},[72,728,252],{"class":82},[15,730,731],{},"รอสัก 2-3 วินาทีให้ Alloy อ่านไฟล์แล้วส่งเข้า Loki ก่อนนะครับ ถ้ายิง query ทันทีจะเห็นแค่บรรทัดแรกบรรทัดเดียวแล้วนึกว่าพัง",[15,733,734],{},"ถามก่อนว่า Loki รู้จัก label อะไรบ้าง",[63,736,738],{"className":65,"code":737,"language":67,"meta":68,"style":68},"curl -s http://localhost:3100/loki/api/v1/labels\n",[19,739,740],{"__ignoreMap":68},[72,741,742,744,746],{"class":74,"line":75},[72,743,193],{"class":78},[72,745,196],{"class":86},[72,747,748],{"class":82}," http://localhost:3100/loki/api/v1/labels\n",[63,750,754],{"className":751,"code":752,"language":753,"meta":68,"style":68},"language-json shiki shiki-themes material-theme-lighter one-dark-pro github-dark","{ \"status\": \"success\", \"data\": [\"filename\", \"host\", \"job\", \"service_name\"] }\n","json",[19,755,756],{"__ignoreMap":68},[72,757,758,760,763,767,769,771,773,776,778,780,782,785,787,789,792,794,797,799,801,803,805,807,809,811,813,815,817,819,822,824,827],{"class":74,"line":75},[72,759,657],{"class":642},[72,761,654],{"class":762},"sObbn",[72,764,766],{"class":765},"sVeMc","status",[72,768,703],{"class":762},[72,770,668],{"class":642},[72,772,654],{"class":238},[72,774,775],{"class":82},"success",[72,777,703],{"class":238},[72,779,678],{"class":642},[72,781,654],{"class":762},[72,783,784],{"class":765},"data",[72,786,703],{"class":762},[72,788,668],{"class":642},[72,790,791],{"class":642}," [",[72,793,703],{"class":238},[72,795,796],{"class":82},"filename",[72,798,703],{"class":238},[72,800,678],{"class":642},[72,802,654],{"class":238},[72,804,432],{"class":82},[72,806,703],{"class":238},[72,808,678],{"class":642},[72,810,654],{"class":238},[72,812,428],{"class":82},[72,814,703],{"class":238},[72,816,678],{"class":642},[72,818,654],{"class":238},[72,820,821],{"class":82},"service_name",[72,823,703],{"class":238},[72,825,826],{"class":642},"]",[72,828,829],{"class":642}," }\n",[15,831,832,429,834,836,837,839,840,842,843,845,846,848],{},[19,833,428],{},[19,835,432],{}," คือที่เราใส่ไว้ใน config เอง ส่วนอีกสองตัวมาคนละที่กันครับ ",[19,838,796],{}," เป็นของ Alloy ที่เอา ",[19,841,473],{}," มาแปะให้ทุกบรรทัด ส่วน ",[19,844,821],{}," เป็นของ Loki ที่ map มาจาก label ",[19,847,428],{}," ให้อัตโนมัติตอน ingest",[15,850,851],{},"ทีนี้ลองดึง log ออกมาดูจริง ๆ",[63,853,855],{"className":65,"code":854,"language":67,"meta":68,"style":68},"curl -sG http://localhost:3100/loki/api/v1/query_range \\\n  --data-urlencode 'query={job=\"demo-app\"}' \\\n  --data-urlencode 'limit=10'\n",[19,856,857,869,883],{"__ignoreMap":68},[72,858,859,861,864,867],{"class":74,"line":75},[72,860,193],{"class":78},[72,862,863],{"class":86}," -sG",[72,865,866],{"class":82}," http://localhost:3100/loki/api/v1/query_range",[72,868,152],{"class":151},[72,870,871,874,876,879,881],{"class":74,"line":128},[72,872,873],{"class":86},"  --data-urlencode",[72,875,239],{"class":238},[72,877,878],{"class":82},"query={job=\"demo-app\"}",[72,880,245],{"class":238},[72,882,152],{"class":151},[72,884,885,887,889,892],{"class":74,"line":135},[72,886,873],{"class":86},[72,888,239],{"class":238},[72,890,891],{"class":82},"limit=10",[72,893,894],{"class":238},"'\n",[15,896,897],{},"ที่ได้กลับมาคือ JSON ก้อนเดียวยาว ๆ หน้าตาประมาณนี้",[63,899,901],{"className":751,"code":900,"language":753,"meta":68,"style":68},"{\"status\":\"success\",\"data\":{\"resultType\":\"streams\",\"result\":[{\"stream\":{\"detected_level\":\"error\",\"filename\":\"/var/log/demo/app.log\",\"host\":\"homelab\",\"job\":\"demo-app\",\"service_name\":\"demo-app\"},\"values\":[[\"1785760821561036812\",\"{\\\"level\\\":\\\"error\\\",\\\"msg\\\":\\\"database connection refused\\\"}\"]]},...\n",[19,902,903],{"__ignoreMap":68},[72,904,905,907,909,911,913,915,917,919,921,923,925,927,929,932,934,938,940,942,944,947,949,951,953,956,958,961,963,967,969,971,973,977,979,981,983,986,988,990,992,994,996,998,1000,1003,1005,1007,1009,1011,1013,1015,1017,1020,1022,1024,1026,1028,1030,1032,1034,1037,1039,1041,1043,1045,1047,1049,1051,1053,1055,1058,1060,1063,1065,1068,1070,1073,1075,1077,1079,1081,1083,1085,1087,1089,1091,1093,1095,1097,1099,1101,1103,1105,1107,1110,1112,1114,1116,1119],{"class":74,"line":75},[72,906,657],{"class":642},[72,908,703],{"class":762},[72,910,766],{"class":765},[72,912,703],{"class":762},[72,914,668],{"class":642},[72,916,703],{"class":238},[72,918,775],{"class":82},[72,920,703],{"class":238},[72,922,678],{"class":642},[72,924,703],{"class":762},[72,926,784],{"class":765},[72,928,703],{"class":762},[72,930,931],{"class":642},":{",[72,933,703],{"class":762},[72,935,937],{"class":936},"sLise","resultType",[72,939,703],{"class":762},[72,941,668],{"class":642},[72,943,703],{"class":238},[72,945,946],{"class":82},"streams",[72,948,703],{"class":238},[72,950,678],{"class":642},[72,952,703],{"class":762},[72,954,955],{"class":936},"result",[72,957,703],{"class":762},[72,959,960],{"class":642},":[{",[72,962,703],{"class":762},[72,964,966],{"class":965},"sxkdo","stream",[72,968,703],{"class":762},[72,970,931],{"class":642},[72,972,703],{"class":762},[72,974,976],{"class":975},"s9IQt","detected_level",[72,978,703],{"class":762},[72,980,668],{"class":642},[72,982,703],{"class":238},[72,984,985],{"class":82},"error",[72,987,703],{"class":238},[72,989,678],{"class":642},[72,991,703],{"class":762},[72,993,796],{"class":975},[72,995,703],{"class":762},[72,997,668],{"class":642},[72,999,703],{"class":238},[72,1001,1002],{"class":82},"/var/log/demo/app.log",[72,1004,703],{"class":238},[72,1006,678],{"class":642},[72,1008,703],{"class":762},[72,1010,432],{"class":975},[72,1012,703],{"class":762},[72,1014,668],{"class":642},[72,1016,703],{"class":238},[72,1018,1019],{"class":82},"homelab",[72,1021,703],{"class":238},[72,1023,678],{"class":642},[72,1025,703],{"class":762},[72,1027,428],{"class":975},[72,1029,703],{"class":762},[72,1031,668],{"class":642},[72,1033,703],{"class":238},[72,1035,1036],{"class":82},"demo-app",[72,1038,703],{"class":238},[72,1040,678],{"class":642},[72,1042,703],{"class":762},[72,1044,821],{"class":975},[72,1046,703],{"class":762},[72,1048,668],{"class":642},[72,1050,703],{"class":238},[72,1052,1036],{"class":82},[72,1054,703],{"class":238},[72,1056,1057],{"class":642},"},",[72,1059,703],{"class":762},[72,1061,1062],{"class":965},"values",[72,1064,703],{"class":762},[72,1066,1067],{"class":642},":[[",[72,1069,703],{"class":238},[72,1071,1072],{"class":82},"1785760821561036812",[72,1074,703],{"class":238},[72,1076,678],{"class":642},[72,1078,703],{"class":238},[72,1080,657],{"class":82},[72,1082,660],{"class":151},[72,1084,663],{"class":82},[72,1086,660],{"class":151},[72,1088,668],{"class":82},[72,1090,660],{"class":151},[72,1092,985],{"class":82},[72,1094,660],{"class":151},[72,1096,678],{"class":82},[72,1098,660],{"class":151},[72,1100,683],{"class":82},[72,1102,660],{"class":151},[72,1104,668],{"class":82},[72,1106,660],{"class":151},[72,1108,1109],{"class":82},"database connection refused",[72,1111,660],{"class":151},[72,1113,700],{"class":82},[72,1115,703],{"class":238},[72,1117,1118],{"class":642},"]]},",[72,1120,1122],{"class":1121},"sg798","...\n",[15,1124,1125,1126,1128],{},"อ่านไม่ไหวครับ ต่อ ",[19,1127,39],{}," เอาเฉพาะบรรทัด log ดีกว่า",[63,1130,1132],{"className":65,"code":1131,"language":67,"meta":68,"style":68},"curl -sG http://localhost:3100/loki/api/v1/query_range \\\n  --data-urlencode 'query={job=\"demo-app\"}' \\\n  --data-urlencode 'limit=10' | jq -r '.data.result[].values[][1]'\n",[19,1133,1134,1144,1156],{"__ignoreMap":68},[72,1135,1136,1138,1140,1142],{"class":74,"line":75},[72,1137,193],{"class":78},[72,1139,863],{"class":86},[72,1141,866],{"class":82},[72,1143,152],{"class":151},[72,1145,1146,1148,1150,1152,1154],{"class":74,"line":128},[72,1147,873],{"class":86},[72,1149,239],{"class":238},[72,1151,878],{"class":82},[72,1153,245],{"class":238},[72,1155,152],{"class":151},[72,1157,1158,1160,1162,1164,1166,1169,1172,1175,1177,1180],{"class":74,"line":135},[72,1159,873],{"class":86},[72,1161,239],{"class":238},[72,1163,891],{"class":82},[72,1165,245],{"class":238},[72,1167,1168],{"class":248}," |",[72,1170,1171],{"class":78}," jq",[72,1173,1174],{"class":86}," -r",[72,1176,239],{"class":238},[72,1178,1179],{"class":82},".data.result[].values[][1]",[72,1181,894],{"class":238},[63,1183,1186],{"className":1184,"code":1185,"language":99},[97],"{\"level\":\"error\",\"msg\":\"database connection refused\"}\n{\"level\":\"info\",\"msg\":\"handled request 3\"}\n{\"level\":\"info\",\"msg\":\"handled request 2\"}\n{\"level\":\"info\",\"msg\":\"handled request 1\"}\n{\"level\":\"info\",\"msg\":\"service started\"}\n",[19,1187,1185],{"__ignoreMap":68},[15,1189,1190],{},"ครบทั้ง 5 บรรทัดที่เขียนลงไฟล์ไป",[15,1192,1193,1194,1196],{},"กลับไปดูใน JSON ก้อนบนอีกทีจะเห็น ",[19,1195,976],{}," โผล่มาด้วย อันนี้ผมไม่ได้ใส่ไว้ใน config เลยครับ เป็น Loki ที่อ่านเนื้อ log แล้วแยกให้เองว่าบรรทัดไหน error บรรทัดไหน info ทั้งที่ผมไม่ได้เขียน parser อะไรไว้สักตัว",[15,1198,1199],{},"ถ้าอยากกรองเฉพาะ error ก็ใส่ filter ต่อท้าย query ได้",[63,1201,1203],{"className":65,"code":1202,"language":67,"meta":68,"style":68},"curl -sG http://localhost:3100/loki/api/v1/query_range \\\n  --data-urlencode 'query={job=\"demo-app\"} |= \"error\"' \\\n  --data-urlencode 'limit=10' | jq -r '.data.result[].values[][1]'\n",[19,1204,1205,1215,1228],{"__ignoreMap":68},[72,1206,1207,1209,1211,1213],{"class":74,"line":75},[72,1208,193],{"class":78},[72,1210,863],{"class":86},[72,1212,866],{"class":82},[72,1214,152],{"class":151},[72,1216,1217,1219,1221,1224,1226],{"class":74,"line":128},[72,1218,873],{"class":86},[72,1220,239],{"class":238},[72,1222,1223],{"class":82},"query={job=\"demo-app\"} |= \"error\"",[72,1225,245],{"class":238},[72,1227,152],{"class":151},[72,1229,1230,1232,1234,1236,1238,1240,1242,1244,1246,1248],{"class":74,"line":135},[72,1231,873],{"class":86},[72,1233,239],{"class":238},[72,1235,891],{"class":82},[72,1237,245],{"class":238},[72,1239,1168],{"class":248},[72,1241,1171],{"class":78},[72,1243,1174],{"class":86},[72,1245,239],{"class":238},[72,1247,1179],{"class":82},[72,1249,894],{"class":238},[63,1251,1254],{"className":1252,"code":1253,"language":99},[97],"{\"level\":\"error\",\"msg\":\"database connection refused\"}\n",[19,1255,1253],{"__ignoreMap":68},[10,1257,1259],{"id":1258},"ตรวจ-config-ก่อนรัน","ตรวจ config ก่อนรัน",[15,1261,1262,1263,1266],{},"Alloy มีคำสั่ง ",[19,1264,1265],{},"validate"," ให้ใช้ครับ ไม่ต้องรันจริงแล้วมานั่งดู log ว่าพังตรงไหน",[63,1268,1270],{"className":65,"code":1269,"language":67,"meta":68,"style":68},"docker run --rm -v ~/alloy/config.alloy:/c.alloy \\\n  grafana/alloy:latest validate /c.alloy\n",[19,1271,1272,1288],{"__ignoreMap":68},[72,1273,1274,1276,1278,1280,1283,1286],{"class":74,"line":75},[72,1275,79],{"class":78},[72,1277,83],{"class":82},[72,1279,87],{"class":86},[72,1281,1282],{"class":86}," -v",[72,1284,1285],{"class":82}," ~/alloy/config.alloy:/c.alloy",[72,1287,152],{"class":151},[72,1289,1290,1292,1295],{"class":74,"line":128},[72,1291,541],{"class":82},[72,1293,1294],{"class":82}," validate",[72,1296,1297],{"class":82}," /c.alloy\n",[15,1299,1300,1301,1304],{},"ถ้าผ่านจะไม่มีอะไรขึ้นมาเลย ทีนี้ลองทำให้มันพังดูบ้าง ผมสร้างไฟล์ ",[19,1302,1303],{},"bad.alloy"," ที่ใส่ attribute มั่ว ๆ เข้าไปหนึ่งตัว",[63,1306,1308],{"className":65,"code":1307,"language":67,"meta":68,"style":68},"cat > ~/alloy/bad.alloy \u003C\u003C'EOF'\nloki.write \"default\" {\n  endpoint {\n    url = \"http://loki-demo:3100/loki/api/v1/push\"\n  }\n  bogus_arg = 1\n}\nEOF\n\ndocker run --rm -v ~/alloy/bad.alloy:/bad.alloy \\\n  grafana/alloy:latest validate /bad.alloy\n",[19,1309,1310,1323,1327,1331,1335,1339,1344,1348,1352,1356,1371],{"__ignoreMap":68},[72,1311,1312,1314,1316,1319,1321],{"class":74,"line":75},[72,1313,273],{"class":78},[72,1315,249],{"class":248},[72,1317,1318],{"class":82}," ~/alloy/bad.alloy",[72,1320,281],{"class":248},[72,1322,285],{"class":284},[72,1324,1325],{"class":74,"line":128},[72,1326,361],{"class":82},[72,1328,1329],{"class":74,"line":135},[72,1330,367],{"class":82},[72,1332,1333],{"class":74,"line":155},[72,1334,373],{"class":82},[72,1336,1337],{"class":74,"line":166},[72,1338,379],{"class":82},[72,1340,1341],{"class":74,"line":177},[72,1342,1343],{"class":82},"  bogus_arg = 1\n",[72,1345,1346],{"class":74,"line":313},[72,1347,322],{"class":82},[72,1349,1350],{"class":74,"line":319},[72,1351,390],{"class":284},[72,1353,1354],{"class":74,"line":325},[72,1355,132],{"emptyLinePlaceholder":131},[72,1357,1358,1360,1362,1364,1366,1369],{"class":74,"line":330},[72,1359,79],{"class":78},[72,1361,83],{"class":82},[72,1363,87],{"class":86},[72,1365,1282],{"class":86},[72,1367,1368],{"class":82}," ~/alloy/bad.alloy:/bad.alloy",[72,1370,152],{"class":151},[72,1372,1373,1375,1377],{"class":74,"line":336},[72,1374,541],{"class":82},[72,1376,1294],{"class":82},[72,1378,1379],{"class":82}," /bad.alloy\n",[63,1381,1384],{"className":1382,"code":1383,"language":99},[97],"Error: /bad.alloy:5:3: unrecognized attribute name \"bogus_arg\"\n\n4 |   }\n5 |   bogus_arg = 1\n  |   ^^^^^^^^^^^^^\n6 | }\nError: validation failed\n2026/08/03 13:32:02 collector server run finished with error: validation failed\n",[19,1385,1383],{"__ignoreMap":68},[15,1387,1388],{},"ชี้ให้เลยว่าบรรทัด 5 ตัวอักษรที่ 3 พร้อมขีดเส้นใต้ให้ด้วย",[15,1390,1391,1392,1395,1396,1398,1399,1402,1403,1406,1407,1409,1410,1412],{},"ระวังอย่าไปสับสนกับคำสั่ง ",[19,1393,1394],{},"fmt"," นะครับ สองตัวนี้ตรวจคนละชั้นกัน ",[19,1397,1394],{}," ดูแค่ syntax คือวงเล็บปิดครบไหม โครงสร้างถูกไหม (ผมลองเอา config ที่ลืมปิดวงเล็บไปให้ มันฟ้อง ",[19,1400,1401],{},"expected }, got EOF"," แล้ว exit 1) แต่มันไม่เช็คว่าชื่อ attribute หรือ component นั้นมีอยู่จริงหรือเปล่า ตัว ",[19,1404,1405],{},"bogus_arg"," ข้างบนผ่าน ",[19,1408,1394],{}," ฉลุยด้วย exit 0 แถมยังพ่น config ที่จัดหน้าเรียบร้อยแล้วออกมาให้อีก ต้องใช้ ",[19,1411,1265],{}," ถึงจะจับได้",[10,1414,1416],{"id":1415},"ย้ายจาก-promtail","ย้ายจาก Promtail",[15,1418,1419,1420,1423],{},"ใครที่มี config Promtail อยู่แล้วไม่ต้องนั่งแปลมือครับ Alloy มีคำสั่ง ",[19,1421,1422],{},"convert"," ให้ ผมลองเอา config สั้น ๆ แบบนี้ไปแปลงดู",[63,1425,1427],{"className":65,"code":1426,"language":67,"meta":68,"style":68},"cat > ~/alloy/promtail.yaml \u003C\u003C'EOF'\nclients:\n  - url: http://localhost:3100/loki/api/v1/push\nscrape_configs:\n  - job_name: system\n    static_configs:\n      - targets: [localhost]\n        labels:\n          job: varlogs\n          __path__: /var/log/*.log\nEOF\n\ndocker run --rm -v ~/alloy/promtail.yaml:/p.yaml \\\n  grafana/alloy:latest convert --source-format=promtail /p.yaml\n",[19,1428,1429,1442,1447,1452,1457,1462,1467,1472,1477,1482,1487,1491,1495,1510],{"__ignoreMap":68},[72,1430,1431,1433,1435,1438,1440],{"class":74,"line":75},[72,1432,273],{"class":78},[72,1434,249],{"class":248},[72,1436,1437],{"class":82}," ~/alloy/promtail.yaml",[72,1439,281],{"class":248},[72,1441,285],{"class":284},[72,1443,1444],{"class":74,"line":128},[72,1445,1446],{"class":82},"clients:\n",[72,1448,1449],{"class":74,"line":135},[72,1450,1451],{"class":82},"  - url: http://localhost:3100/loki/api/v1/push\n",[72,1453,1454],{"class":74,"line":155},[72,1455,1456],{"class":82},"scrape_configs:\n",[72,1458,1459],{"class":74,"line":166},[72,1460,1461],{"class":82},"  - job_name: system\n",[72,1463,1464],{"class":74,"line":177},[72,1465,1466],{"class":82},"    static_configs:\n",[72,1468,1469],{"class":74,"line":313},[72,1470,1471],{"class":82},"      - targets: [localhost]\n",[72,1473,1474],{"class":74,"line":319},[72,1475,1476],{"class":82},"        labels:\n",[72,1478,1479],{"class":74,"line":325},[72,1480,1481],{"class":82},"          job: varlogs\n",[72,1483,1484],{"class":74,"line":330},[72,1485,1486],{"class":82},"          __path__: /var/log/*.log\n",[72,1488,1489],{"class":74,"line":336},[72,1490,390],{"class":284},[72,1492,1493],{"class":74,"line":342},[72,1494,132],{"emptyLinePlaceholder":131},[72,1496,1497,1499,1501,1503,1505,1508],{"class":74,"line":348},[72,1498,79],{"class":78},[72,1500,83],{"class":82},[72,1502,87],{"class":86},[72,1504,1282],{"class":86},[72,1506,1507],{"class":82}," ~/alloy/promtail.yaml:/p.yaml",[72,1509,152],{"class":151},[72,1511,1512,1514,1517,1520],{"class":74,"line":353},[72,1513,541],{"class":82},[72,1515,1516],{"class":82}," convert",[72,1518,1519],{"class":86}," --source-format=promtail",[72,1521,1522],{"class":82}," /p.yaml\n",[15,1524,1525],{},"ได้ผลออกมาแบบนี้",[63,1527,1531],{"className":1528,"code":1529,"language":1530,"meta":68,"style":68},"language-hcl shiki shiki-themes material-theme-lighter one-dark-pro github-dark","loki.source.file \"system\" {\n    targets = [{\n        __address__ = \"localhost\",\n        __path__    = \"/var/log/*.log\",\n        job         = \"varlogs\",\n    }]\n    forward_to = [loki.write.default.receiver]\n\n    file_match {\n        enabled = true\n    }\n    legacy_positions_file = \"/var/log/positions.yaml\"\n}\n\nloki.write \"default\" {\n    endpoint {\n        url = \"http://localhost:3100/loki/api/v1/push\"\n    }\n    external_labels = {}\n}\n","hcl",[19,1532,1533,1560,1574,1589,1603,1620,1628,1638,1642,1649,1660,1665,1680,1684,1688,1706,1713,1727,1731,1741],{"__ignoreMap":68},[72,1534,1535,1539,1542,1545,1547,1550,1552,1555,1557],{"class":74,"line":75},[72,1536,1538],{"class":1537},"sZDfs","loki",[72,1540,1541],{"class":248},".",[72,1543,1544],{"class":626},"source",[72,1546,1541],{"class":248},[72,1548,1549],{"class":626},"file",[72,1551,654],{"class":238},[72,1553,1554],{"class":82},"system",[72,1556,703],{"class":238},[72,1558,1559],{"class":642}," {\n",[72,1561,1562,1565,1569,1571],{"class":74,"line":128},[72,1563,1564],{"class":626},"    targets",[72,1566,1568],{"class":1567},"sMTEB"," =",[72,1570,791],{"class":1537},[72,1572,1573],{"class":642},"{\n",[72,1575,1576,1579,1581,1584,1586],{"class":74,"line":135},[72,1577,1578],{"class":1537},"        __address__ = ",[72,1580,703],{"class":238},[72,1582,1583],{"class":82},"localhost",[72,1585,703],{"class":238},[72,1587,1588],{"class":1537},",\n",[72,1590,1591,1594,1596,1599,1601],{"class":74,"line":155},[72,1592,1593],{"class":1537},"        __path__    = ",[72,1595,703],{"class":238},[72,1597,1598],{"class":82},"/var/log/*.log",[72,1600,703],{"class":238},[72,1602,1588],{"class":1537},[72,1604,1605,1608,1611,1613,1616,1618],{"class":74,"line":166},[72,1606,1607],{"class":626},"        job",[72,1609,1610],{"class":1567},"         =",[72,1612,654],{"class":238},[72,1614,1615],{"class":82},"varlogs",[72,1617,703],{"class":238},[72,1619,1588],{"class":1537},[72,1621,1622,1625],{"class":74,"line":177},[72,1623,1624],{"class":642},"    }",[72,1626,1627],{"class":1537},"]\n",[72,1629,1630,1633,1635],{"class":74,"line":313},[72,1631,1632],{"class":626},"    forward_to",[72,1634,1568],{"class":1567},[72,1636,1637],{"class":1537}," [loki.write.default.receiver]\n",[72,1639,1640],{"class":74,"line":319},[72,1641,132],{"emptyLinePlaceholder":131},[72,1643,1644,1647],{"class":74,"line":325},[72,1645,1646],{"class":1537},"    file_match ",[72,1648,1573],{"class":642},[72,1650,1651,1654,1656],{"class":74,"line":330},[72,1652,1653],{"class":626},"        enabled",[72,1655,1568],{"class":1567},[72,1657,1659],{"class":1658},"scCEF"," true\n",[72,1661,1662],{"class":74,"line":336},[72,1663,1664],{"class":642},"    }\n",[72,1666,1667,1670,1672,1674,1677],{"class":74,"line":342},[72,1668,1669],{"class":626},"    legacy_positions_file",[72,1671,1568],{"class":1567},[72,1673,654],{"class":238},[72,1675,1676],{"class":82},"/var/log/positions.yaml",[72,1678,1679],{"class":238},"\"\n",[72,1681,1682],{"class":74,"line":348},[72,1683,322],{"class":642},[72,1685,1686],{"class":74,"line":353},[72,1687,132],{"emptyLinePlaceholder":131},[72,1689,1690,1692,1694,1697,1699,1702,1704],{"class":74,"line":358},[72,1691,1538],{"class":1537},[72,1693,1541],{"class":248},[72,1695,1696],{"class":626},"write",[72,1698,654],{"class":238},[72,1700,1701],{"class":82},"default",[72,1703,703],{"class":238},[72,1705,1559],{"class":642},[72,1707,1708,1711],{"class":74,"line":364},[72,1709,1710],{"class":1537},"    endpoint ",[72,1712,1573],{"class":642},[72,1714,1715,1718,1720,1722,1725],{"class":74,"line":370},[72,1716,1717],{"class":626},"        url",[72,1719,1568],{"class":1567},[72,1721,654],{"class":238},[72,1723,1724],{"class":82},"http://localhost:3100/loki/api/v1/push",[72,1726,1679],{"class":238},[72,1728,1729],{"class":74,"line":376},[72,1730,1664],{"class":642},[72,1732,1733,1736,1738],{"class":74,"line":382},[72,1734,1735],{"class":626},"    external_labels",[72,1737,1568],{"class":1567},[72,1739,1740],{"class":642}," {}\n",[72,1742,1743],{"class":74,"line":387},[72,1744,322],{"class":642},[15,1746,1747,1748,1750,1751,1753,1754,1756],{},"สังเกตว่ามันเลือกใช้ ",[19,1749,469],{}," block ในตัวของ ",[19,1752,438],{}," แทนที่จะแยก ",[19,1755,424],{}," ออกมาเหมือนที่ผมเขียนไว้ข้างบน ซึ่งก็ถูกทั้งคู่ครับ",[15,1758,1759],{},"ใช้ได้เลยแต่แนะนำให้อ่านทวนก่อนสักรอบ อย่าเอาไปใช้ทั้งดุ้นเลยทีเดียว",[10,1761,1762],{"id":1762},"ลบของทิ้ง",[15,1764,1765],{},"ลองเสร็จแล้วเก็บกวาดด้วยนะครับ",[63,1767,1769],{"className":65,"code":1768,"language":67,"meta":68,"style":68},"docker rm -f alloy-demo loki-demo\ndocker network rm alloy-net\nrm -rf ~/alloy\n",[19,1770,1771,1786,1796],{"__ignoreMap":68},[72,1772,1773,1775,1778,1781,1783],{"class":74,"line":75},[72,1774,79],{"class":78},[72,1776,1777],{"class":82}," rm",[72,1779,1780],{"class":86}," -f",[72,1782,498],{"class":82},[72,1784,1785],{"class":82}," loki-demo\n",[72,1787,1788,1790,1792,1794],{"class":74,"line":128},[72,1789,79],{"class":78},[72,1791,119],{"class":82},[72,1793,1777],{"class":82},[72,1795,125],{"class":82},[72,1797,1798,1801,1804],{"class":74,"line":135},[72,1799,1800],{"class":78},"rm",[72,1802,1803],{"class":86}," -rf",[72,1805,1806],{"class":82}," ~/alloy\n",[10,1808,1809],{"id":1809},"สรุป",[15,1811,1812],{},"ที่ลองมาผมว่า Alloy เข้าใจง่ายกว่า Promtail อยู่พอสมควรครับ ตรงที่ config เป็น component ต่อกันเป็นท่อ แล้วมีหน้า UI ให้ดูว่าท่อมันต่อถูกไหม เวลาพังจะหาต้นตอง่ายกว่าเยอะ",[15,1814,1815],{},"ที่เขียนในบทความนี้เป็นแค่ log อย่างเดียวนะครับ จริง ๆ Alloy ทำ metrics กับ traces ได้ด้วยในตัวเดียวกัน ถ้ามีโอกาสจะมาเขียนต่อ",[15,1817,1818,1819,1821],{},"ส่วนใครที่ยังใช้ Promtail อยู่ ถึงตอนนี้มันยังทำงานได้ปกติก็จริง แต่ EOL ไปแล้วตั้งแต่เดือนมีนาคมครับ แปลว่าถ้ามีช่องโหว่โผล่มาก็จะไม่มีใครแก้ให้แล้ว ควรวางแผนย้ายไว้แต่เนิ่น ๆ ดีกว่า และมีคำสั่ง ",[19,1820,1422],{}," ช่วยอยู่แล้วด้วย",[10,1823,1825],{"id":1824},"references","References",[417,1827,1828,1837,1844,1851,1858],{},[420,1829,1830],{},[1831,1832,1836],"a",{"href":1833,"rel":1834},"https://grafana.com/docs/alloy/latest/",[1835],"nofollow","Grafana Alloy documentation",[420,1838,1839],{},[1831,1840,1843],{"href":1841,"rel":1842},"https://grafana.com/docs/alloy/latest/set-up/install/docker/",[1835],"Install Alloy on Docker",[420,1845,1846],{},[1831,1847,1850],{"href":1848,"rel":1849},"https://grafana.com/docs/alloy/latest/reference/components/loki/loki.source.file/",[1835],"loki.source.file component",[420,1852,1853],{},[1831,1854,1857],{"href":1855,"rel":1856},"https://grafana.com/docs/loki/latest/send-data/promtail/",[1835],"Promtail EOL notice",[420,1859,1860],{},[1831,1861,1864],{"href":1862,"rel":1863},"https://grafana.com/docs/agent/latest/",[1835],"Grafana Agent EOL announcement",[1866,1867,1868],"style",{},"html pre.shiki code .sosa_, html code.shiki .sosa_{--shiki-light:#E2931D;--shiki-default:#61AFEF;--shiki-dark:#B392F0}html pre.shiki code .sAlJX, html code.shiki .sAlJX{--shiki-light:#91B859;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sEoV_, html code.shiki .sEoV_{--shiki-light:#91B859;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sicAX, html code.shiki .sicAX{--shiki-light:#90A4AE;--shiki-default:#56B6C2;--shiki-dark:#79B8FF}html pre.shiki code .sJZfL, html code.shiki .sJZfL{--shiki-light:#6182B8;--shiki-default:#56B6C2;--shiki-dark:#79B8FF}html pre.shiki code .snfNA, html code.shiki .snfNA{--shiki-light:#39ADB5;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sbGrh, html code.shiki .sbGrh{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#F97583}html pre.shiki code .s2KDN, html code.shiki .s2KDN{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#9ECBFF}html pre.shiki code .s36IK, html code.shiki .s36IK{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#C678DD;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sLHrO, html code.shiki .sLHrO{--shiki-light:#90A4AE;--shiki-default:#E06C75;--shiki-dark:#E1E4E8}html pre.shiki code .stlKB, html code.shiki .stlKB{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sObbn, html code.shiki .sObbn{--shiki-light:#39ADB5;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .sVeMc, html code.shiki .sVeMc{--shiki-light:#9C3EDA;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .sLise, html code.shiki .sLise{--shiki-light:#E2931D;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .sxkdo, html code.shiki .sxkdo{--shiki-light:#F76D47;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .s9IQt, html code.shiki .s9IQt{--shiki-light:#E53935;--shiki-default:#E06C75;--shiki-dark:#79B8FF}html pre.shiki code .sg798, html code.shiki .sg798{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#FFFFFF;--shiki-default-font-style:inherit;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}html pre.shiki code .sZDfs, html code.shiki .sZDfs{--shiki-light:#90A4AE;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sMTEB, html code.shiki .sMTEB{--shiki-light:#39ADB5;--shiki-default:#56B6C2;--shiki-dark:#F97583}html pre.shiki code .scCEF, html code.shiki .scCEF{--shiki-light:#39ADB5;--shiki-default:#D19A66;--shiki-dark:#79B8FF}",{"title":68,"searchDepth":128,"depth":128,"links":1870},[1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881],{"id":12,"depth":128,"text":13},{"id":51,"depth":128,"text":52},{"id":104,"depth":128,"text":104},{"id":255,"depth":128,"text":256},{"id":579,"depth":128,"text":580},{"id":608,"depth":128,"text":609},{"id":1258,"depth":128,"text":1259},{"id":1415,"depth":128,"text":1416},{"id":1762,"depth":128,"text":1762},{"id":1809,"depth":128,"text":1809},{"id":1824,"depth":128,"text":1825},"2026-08-03T00:00:00.000Z","แนะนำ Grafana Alloy ตัวเก็บ telemetry รุ่นใหม่ของ Grafana ตั้งแต่ติดตั้งด้วย docker เขียน config ส่ง log เข้า Loki ไปจนถึงคำสั่ง validate และ convert จาก Promtail",false,"md",{},null,"Grafana Alloy With Loki","/blogs/2026-08-03-grafana-alloy-loki",[1891],"2025-05-18-from-old-notebook-to-home-lab-server.md",{"title":5,"description":1883},{"loc":1889},"blogs/2026-08-03-grafana-alloy-loki",[1896],"Homelab","2hw7Ju8fxAPnDcTaZM9OwdtFneNUMDuoG32UFZgTTsk",[1899],{"id":1900,"title":1901,"body":1902,"date":2127,"description":2128,"draft":1884,"extension":1885,"meta":2129,"navigation":131,"next":1887,"ogTitle":2130,"path":2131,"pin":1884,"prev":1887,"recommends":2132,"seo":2135,"sitemap":2136,"stem":2137,"tags":2138,"__hash__":2139},"content/blogs/2025-05-18-from-old-notebook-to-home-lab-server.md","เปลี่ยน Notebook (เก่า) ที่ไม่ได้ใช้งานเป็น Home Lab Server",{"type":7,"value":1903,"toc":2120},[1904,1909,1916,1920,1923,1944,1950,1962,1967,1970,1973,1993,1998,2009,2014,2020,2025,2028,2032,2050,2055,2058,2074,2078,2081,2083,2086,2089,2109,2114,2117],[15,1905,1906],{},[591,1907],{"alt":68,"src":1908},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-f67e4b1b-db83-40d3-82ed-3fbdc5562404.jpg",[15,1910,1911,1912,1915],{},"สวัสดีครับ พอดีผมมีโปรเจคนึงที่ต้องการใช้งาน Server ขนาดเล็ก ๆ เครื่องนึง กำลังจะหาซื้อเครื่อง Mini PC ใหม่มาเพิ่มพอดี แต่โปรเจคนี้ก็ยังไม่มั่นใจว่าจะไปต่อได้แค่ไหนก่อนที่จะซื้อ hardware มาใหม่ เลยจะลองหยิบเอา Notebook เครื่องเก่ามาลองรันดูก่อนครับ ไหน ๆ ก็ละเลยมาเขียนเป็นบทความสั้น ๆ เอาไว้แชร์เป็นไอเดียสำหรับคนที่ต้องการจะลองเล่น Home Lab แต่ยังไม่อยากจะซื้อเครื่องใหม่ จริง ๆ แล้ว ",[27,1913,1914],{},"notebook"," นายเองก็เป็นได้นะ server อะ !",[10,1917,1919],{"id":1918},"ข้อดีของการนำ-notebook-มาใช้งาน","ข้อดีของการนำ notebook มาใช้งาน",[15,1921,1922],{},"หลาย ๆ คนคงจะคุ้นชินกับการใช้งาน notebook ในแบบปกติคือการใช้งาน windows ทั่ว ๆ ไป แต่ก็อาจจะมีหลาย ๆ คนที่เป็น advanced user ขึ้นมาหน่อยจับมาลง Linux ตัวต่าง ๆ ใช้งาน วันนี้จะลองพามาเปลี่ยนจาก notebook ให้กลายเป็น server ขนาดเล็ก ๆ กันครับ แล้วมันเหมาะสมยังไง",[417,1924,1925,1928,1938,1941],{},[420,1926,1927],{},"มีแบตเตอร์รี่ในตัว ปกติแล้ว server หรือ home server ที่ดีควรจะมี UPS เพื่อช่วยสำรองไฟในกรณีที่ไฟตกหรือไฟดับจะช่วยทำให้อุปกรณ์เสียหายได้ยากขึ้น ซึ่ง notebook (ในสภาพปกติ) จะมีแบตเตอร์รี่ในตัวอยู่แล้ว",[420,1929,1930,1931,1935],{},"กินไฟน้อย ถ้าเป็น notebook ที่ไม่ใช้ gaming notebook นะครับ ปกติแล้วจะกินไฟน้อย อันนี้คือจังหวะที่กำลังชาร์จแบต + idle อยู่นะครับกินไฟอยู่ที่ประมาณ 30W เอง (อันนี้ใช้ performance mode ถ้าปรับเป็น balanced mode จะลงไปอยู่ที่ราว ๆ 15 W) (แต่ก็เยอะถ้าเทียบกับตระกูล mini PC ที่มี CPU N100) ",[1932,1933,1934],"em",{},"เดี๋ยวจะมาอัพเดทอีกทีหลังผ่านไป 1 เดือนนะครับว่ากินไฟไปกี่หน่วย",[591,1936],{"alt":68,"src":1937},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-661534a0-e4a4-4d14-9238-67f04d5de3a7.jpg",[420,1939,1940],{},"มีจอ, trackpad, keyboard ในตัว เวลาเครื่องมีปัญหาก็จะสามารถตรวจสอบได้เลย ไม่ต้องหาอุปกรณ์มาต่อเพิ่ม",[420,1942,1943],{},"ประหยัดค่าใช้จ่าย หลาย ๆ คนอยากจะเล่น Home Lab เป็นงานอดิเรกนะครับ ซึ่งการเอาอุปกรณ์ที่มีอยู่แล้วมาใช้งานก็จะช่วยประหยัดไปได้อีก",[15,1945,1946,1947],{},"ตอนที่ไม่ได้มีการใช้งานเปิดเครื่องทิ้งไว้เฉย ๆ กินไฟ 3W เอง (น้อยมากก)\n",[591,1948],{"alt":68,"src":1949},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-0bafd825-77ca-4f2c-b5ac-8ab9394dfb8f.jpg",[15,1951,1952,1953,1957,1958,1961],{},"ผมขอข้ามการติดตั้ง OS ไปนะครับ (ผมติดตั้งเป็น Ubuntu version 24 ไปกดรับ version pro ได้นะ ",[1831,1954,1956],{"href":1955},"/blogs/ubuntu-pro","วิธีรับ Ubuntu Pro",") เพราะทำแบบปกติทั่ว ๆ ไปเลยไม่ได้มีอะไรผิดปกติ แนะนำว่าให้เสียบสายแลนแทนการใช้งาน Wifi นะครับ เผื่อความ stable ของการใช้งาน หลังจากนั้นก็สามารถใช้ ",[19,1959,1960],{},"ssh"," เพื่อเชื่อมต่อเข้าไปได้เลย (IP address แนะนำให้ fixed ไว้ตอนติดตั้งนะครับ ไม่แนะนำให้ใช้ DHCP จะปวดหัวเอาทีหลัง)",[15,1963,1964],{},[591,1965],{"alt":68,"src":1966},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-1.png",[10,1968,1969],{"id":1969},"วิธีการทำให้หน้าจอของเครื่องดับ",[15,1971,1972],{},"ปกติแล้วในการใช้งาน ubuntu server จะไม่ได้ใช้งานหน้าจอหรืออุปกรณ์โดยตรงนะครับ ซึ่งตรงนี้เราจะสามารถปิดการใช้หลาย ๆ function ออกไปได้ ซึ่งในการปิดหน้าจอสามารถทำได้ตามนี้เลยครับ",[63,1974,1976],{"className":65,"code":1975,"language":67,"meta":68,"style":68},"sudo vim /etc/default/grub # หรือจะใช้ nano ก็ได้\n",[19,1977,1978],{"__ignoreMap":68},[72,1979,1980,1983,1986,1989],{"class":74,"line":75},[72,1981,1982],{"class":78},"sudo",[72,1984,1985],{"class":82}," vim",[72,1987,1988],{"class":82}," /etc/default/grub",[72,1990,1992],{"class":1991},"sDKbk"," # หรือจะใช้ nano ก็ได้\n",[15,1994,1995],{},[591,1996],{"alt":68,"src":1997},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-33c75f2a-a1f7-4294-a2d8-7b769330b6c6.jpg",[15,1999,2000,2001,2004,2005,2008],{},"โดยเพิ่ม ",[19,2002,2003],{},"consoleblank=120"," ไปยัง ",[19,2006,2007],{},"GRUB_CMDLINE_LINUX_DEFAULT="," สามารถปรับเวลาที่ต้องการได้เลย หน่วยเป็นวินาที",[15,2010,2011],{},[591,2012],{"alt":68,"src":2013},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-fd057b5b-b310-4d8c-b7e0-088c6481403f.jpg",[15,2015,2016,2017],{},"จากนั้นออกมาที่ terminal เหมือมเดิมแล้วรัน ",[19,2018,2019],{},"sudo update-grub",[15,2021,2022],{},[591,2023],{"alt":68,"src":2024},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-cad0302a-9626-4746-99da-7ef8acb21a57.jpg",[15,2026,2027],{},"จากนั้น reboot เครื่องแล้วรอตามเวลาที่ตั้งไว้ได้เลย ว่าหน้าจอจะดับหรือไม่ ของผมตั้งไว้ 120 ก็คือรอ 2 นาทีครับ",[10,2029,2031],{"id":2030},"ตรวจสอบว่า-sleep-mode-ถูกปิดใช้งานอยู่","ตรวจสอบว่า sleep mode ถูกปิดใช้งานอยู่",[63,2033,2035],{"className":65,"code":2034,"language":67,"meta":68,"style":68},"sudo systemctl status sleep.target\n",[19,2036,2037],{"__ignoreMap":68},[72,2038,2039,2041,2044,2047],{"class":74,"line":75},[72,2040,1982],{"class":78},[72,2042,2043],{"class":82}," systemctl",[72,2045,2046],{"class":82}," status",[72,2048,2049],{"class":82}," sleep.target\n",[15,2051,2052],{},[591,2053],{"alt":68,"src":2054},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-0f23e13d-d614-4174-852e-6257096028a1.jpg",[15,2056,2057],{},"วิธีการปิดใช้งาน",[63,2059,2061],{"className":65,"code":2060,"language":67,"meta":68,"style":68},"sudo systemctl mask sleep.target\n",[19,2062,2063],{"__ignoreMap":68},[72,2064,2065,2067,2069,2072],{"class":74,"line":75},[72,2066,1982],{"class":78},[72,2068,2043],{"class":82},[72,2070,2071],{"class":82}," mask",[72,2073,2049],{"class":82},[10,2075,2077],{"id":2076},"วิธีการปิดไฟ-black-light-ของ-keyboard","วิธีการปิดไฟ black light ของ keyboard",[15,2079,2080],{},"อันนี้จะขึ้นอยู่กับแต่ละรุ่นนะครับว่ารองรับการปิดใช้มั้ย ต้องเข้าไปดูใน bios เลยครับ ซึ่งของผมอันนี้ไม่รองรับ ต้องเดินไปกดปิดไฟหน้าเครื่องเอง (sad) ไว้จะมาลองหาวิธีอีกทีครับ",[10,2082,1809],{"id":1809},[15,2084,2085],{},"อันนี้ก็เป็นไอเดียนะครับว่าเราสามารถจับเอา notebook มาทำเป็น home server ขนาดเล็ก ๆ ได้ แต่อาจจะต้องปรับเปลี่ยนการตั้งค่านิดหน่อยเพื่อให้เหมาะสมกับการเป็น server จากนี้ก็ขึ้นอยู่กับจุดประสงค์ว่าจะเอาไปทำอะไรต่อ เช่น ลง docker + portainer ทำเป็น web server หรือจะลองลง proxmox ก็ได้นะ ผมมีเครื่อง notebook ที่ลองลง proxmox ไว้เหมือนกัน",[15,2087,2088],{},"สิ่งที่ทำเพิ่มได้",[417,2090,2091,2094,2097,2100,2103,2106],{},[420,2092,2093],{},"ติดตั้ง docker",[420,2095,2096],{},"ติดตั้ง zsh เพื่อปรับแต่ง terminal",[420,2098,2099],{},"ลง license เพื่อใช้งาน ubuntu pro (เคยเขียนบทความไว้แล้ว)",[420,2101,2102],{},"ติดตั้ง tailscale เพื่อใช้งานเครื่องนี้จากภายนอก",[420,2104,2105],{},"ติดตั้ง coder เพื่อทำเป็น remote dev server",[420,2107,2108],{},"ทำระบบ backup",[15,2110,2111],{},[591,2112],{"alt":68,"src":2113},"/images/2025-05-18-from-old-notebook-to-home-lab-server/images-ff8a1e4b-de92-477b-9e8a-a93b64ee8878.jpg",[15,2115,2116],{},"ขอบคุณที่อ่านจนจบครับบ เย่ ~",[1866,2118,2119],{},"html pre.shiki code .sosa_, html code.shiki .sosa_{--shiki-light:#E2931D;--shiki-default:#61AFEF;--shiki-dark:#B392F0}html pre.shiki code .sAlJX, html code.shiki .sAlJX{--shiki-light:#91B859;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sDKbk, html code.shiki .sDKbk{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7F848E;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":68,"searchDepth":128,"depth":128,"links":2121},[2122,2123,2124,2125,2126],{"id":1918,"depth":128,"text":1919},{"id":1969,"depth":128,"text":1969},{"id":2030,"depth":128,"text":2031},{"id":2076,"depth":128,"text":2077},{"id":1809,"depth":128,"text":1809},"2025-05-18T00:00:00.000Z","อยากลองเล่น Home Lab แต่ไม่อยากซื้ออุปกรณ์ใหม่ ลองเอา notebook เครื่องเก่ามาลองใช้ก่อนได้นะ",{},"Home Lab Server","/blogs/2025-05-18-from-old-notebook-to-home-lab-server",[2133,2134],"2025-04-15-ubuntu-pro.md","2024-01-14-setup-ubuntu-server.md",{"title":1901,"description":2128},{"loc":2131},"blogs/2025-05-18-from-old-notebook-to-home-lab-server",[1896],"ysRLE_0FyCjnNaxas0CmI7-MhEH2U1XUr6fn9BkBUyA",[2141,2997,3363,3556,3775,3940,4382,4497,4586],{"id":2142,"title":2143,"body":2144,"date":2986,"description":2987,"draft":1884,"extension":1885,"meta":2988,"navigation":131,"next":1887,"ogTitle":2989,"path":2990,"pin":1884,"prev":1887,"recommends":2991,"seo":2992,"sitemap":2993,"stem":2994,"tags":2995,"__hash__":2996},"content/blogs/2024-01-14-setup-ubuntu-server.md","ตั้งค่า Ubuntu Server",{"type":7,"value":2145,"toc":2970},[2146,2148,2151,2154,2159,2188,2195,2213,2235,2252,2256,2283,2287,2322,2326,2332,2359,2366,2372,2410,2416,2455,2458,2469,2473,2480,2522,2526,2576,2587,2670,2677,2736,2742,2753,2756,2797,2808,2860,2863,2867,2924,2927,2967],[10,2147,13],{"id":12},[15,2149,2150],{},"รวม command ที่ต้องใช้บ่อย ๆ เมื่อมีการ Setup เครื่อง Ubuntu ใหม่ (Version 20, 22, 24)",[10,2152,2153],{"id":2153},"หมวดหมู่การตั้งค่าพื้นฐาน",[2155,2156,2158],"h3",{"id":2157},"update-packages-ต่าง-ๆ-ที่ติดตั้งมาใน-os-ให้เป็น-version-ล่าสุด","Update Packages ต่าง ๆ ที่ติดตั้งมาใน OS ให้เป็น Version ล่าสุด",[63,2160,2162],{"className":65,"code":2161,"language":67,"meta":68,"style":68},"sudo apt update && sudo apt upgrade -y\n",[19,2163,2164],{"__ignoreMap":68},[72,2165,2166,2168,2171,2174,2177,2180,2182,2185],{"class":74,"line":75},[72,2167,1982],{"class":78},[72,2169,2170],{"class":82}," apt",[72,2172,2173],{"class":82}," update",[72,2175,2176],{"class":642}," &&",[72,2178,2179],{"class":78}," sudo",[72,2181,2170],{"class":82},[72,2183,2184],{"class":82}," upgrade",[72,2186,2187],{"class":86}," -y\n",[2155,2189,2191,2192],{"id":2190},"แก้ไข-timezone-ให้เป็น-asiabangkok","แก้ไข timezone ให้เป็น ",[19,2193,2194],{},"Asia/Bangkok",[63,2196,2198],{"className":65,"code":2197,"language":67,"meta":68,"style":68},"sudo timedatectl set-timezone Asia/Bangkok\n",[19,2199,2200],{"__ignoreMap":68},[72,2201,2202,2204,2207,2210],{"class":74,"line":75},[72,2203,1982],{"class":78},[72,2205,2206],{"class":82}," timedatectl",[72,2208,2209],{"class":82}," set-timezone",[72,2211,2212],{"class":82}," Asia/Bangkok\n",[2155,2214,2216,2217,2220,2221,2224,2225,2224,2228,2224,2231,2234],{"id":2215},"ติดตั้ง-packages-ที่สำคัญสำหรับการพัฒนา-development-โดยภายใน-build-essential-จะมีการรวมเอา-packages-ที่สำคัญเอาไว้เช่น-gcc-c-make-lib6-dev-และอื่น-ๆ-อีกมากมาย","ติดตั้ง Packages ที่สำคัญสำหรับการพัฒนา (Development) โดยภายใน ",[19,2218,2219],{},"Build Essential"," จะมีการรวมเอา Packages ที่สำคัญเอาไว้เช่น ",[19,2222,2223],{},"gcc",", ",[19,2226,2227],{},"c++",[19,2229,2230],{},"make",[19,2232,2233],{},"lib6-dev"," และอื่น ๆ อีกมากมาย",[63,2236,2238],{"className":65,"code":2237,"language":67,"meta":68,"style":68},"sudo apt install build-essential\n",[19,2239,2240],{"__ignoreMap":68},[72,2241,2242,2244,2246,2249],{"class":74,"line":75},[72,2243,1982],{"class":78},[72,2245,2170],{"class":82},[72,2247,2248],{"class":82}," install",[72,2250,2251],{"class":82}," build-essential\n",[2155,2253,2255],{"id":2254},"แก้ไข-hostname","แก้ไข Hostname",[63,2257,2259],{"className":65,"code":2258,"language":67,"meta":68,"style":68},"sudo hostnamectl set-hostname \u003Chostname>\n",[19,2260,2261],{"__ignoreMap":68},[72,2262,2263,2265,2268,2271,2274,2277,2280],{"class":74,"line":75},[72,2264,1982],{"class":78},[72,2266,2267],{"class":82}," hostnamectl",[72,2269,2270],{"class":82}," set-hostname",[72,2272,2273],{"class":248}," \u003C",[72,2275,2276],{"class":82},"hostnam",[72,2278,2279],{"class":1537},"e",[72,2281,2282],{"class":248},">\n",[2155,2284,2286],{"id":2285},"ปิดการใช้งาน-cloud-init-network","ปิดการใช้งาน Cloud-init network",[63,2288,2290],{"className":65,"code":2289,"language":67,"meta":68,"style":68},"sudo nano  /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg\n\n# เอาไปใส่ในไฟล์\nnetwork: {config: disabled}\n",[19,2291,2292,2302,2306,2311],{"__ignoreMap":68},[72,2293,2294,2296,2299],{"class":74,"line":75},[72,2295,1982],{"class":78},[72,2297,2298],{"class":82}," nano",[72,2300,2301],{"class":82},"  /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg\n",[72,2303,2304],{"class":74,"line":128},[72,2305,132],{"emptyLinePlaceholder":131},[72,2307,2308],{"class":74,"line":135},[72,2309,2310],{"class":1991},"# เอาไปใส่ในไฟล์\n",[72,2312,2313,2316,2319],{"class":74,"line":155},[72,2314,2315],{"class":78},"network:",[72,2317,2318],{"class":82}," {config:",[72,2320,2321],{"class":82}," disabled}\n",[2155,2323,2325],{"id":2324},"ขั้นตอนการติดตั้ง-docker-ใน-version-daemon","ขั้นตอนการติดตั้ง docker ใน version daemon",[15,2327,2328,2329,2331],{},"ติดตั้ง ",[19,2330,193],{}," สำหรับการเรียกใช้งาน Script",[63,2333,2335],{"className":65,"code":2334,"language":67,"meta":68,"style":68},"sudo apt update\nsudo apt install curl -y\n",[19,2336,2337,2346],{"__ignoreMap":68},[72,2338,2339,2341,2343],{"class":74,"line":75},[72,2340,1982],{"class":78},[72,2342,2170],{"class":82},[72,2344,2345],{"class":82}," update\n",[72,2347,2348,2350,2352,2354,2357],{"class":74,"line":128},[72,2349,1982],{"class":78},[72,2351,2170],{"class":82},[72,2353,2248],{"class":82},[72,2355,2356],{"class":82}," curl",[72,2358,2187],{"class":86},[15,2360,2361,2362,2365],{},"ติดตั้งโดยใช้ script จาก ",[19,2363,2364],{},"get.docker.com"," ซึ่งจะช่วยในการติดตั้ง docker แบบง่ายมาก ๆ",[2367,2368,2369],"blockquote",{},[15,2370,2371],{},"script นี้จำเป็นต้องใช้ root หรือ sudo ในการทำงานนะครับ",[63,2373,2375],{"className":65,"code":2374,"language":67,"meta":68,"style":68},"cd /tmp\ncurl -fsSL https://get.docker.com -o get-docker.sh\nsudo sh get-docker.sh\n",[19,2376,2377,2385,2401],{"__ignoreMap":68},[72,2378,2379,2382],{"class":74,"line":75},[72,2380,2381],{"class":234},"cd",[72,2383,2384],{"class":82}," /tmp\n",[72,2386,2387,2389,2392,2395,2398],{"class":74,"line":128},[72,2388,193],{"class":78},[72,2390,2391],{"class":86}," -fsSL",[72,2393,2394],{"class":82}," https://get.docker.com",[72,2396,2397],{"class":86}," -o",[72,2399,2400],{"class":82}," get-docker.sh\n",[72,2402,2403,2405,2408],{"class":74,"line":135},[72,2404,1982],{"class":78},[72,2406,2407],{"class":82}," sh",[72,2409,2400],{"class":82},[15,2411,2412,2413,2415],{},"หากต้องการรัน docker โดยไม่ต้องรัน ",[19,2414,1982],{}," นำหน้าสามารถเพิ่ม user ดังกล่าวเข้าไปใน group docker ได้ครับ",[63,2417,2419],{"className":65,"code":2418,"language":67,"meta":68,"style":68},"# run docker without sudo\nsudo gpasswd -a $USER docker\nsudo service docker restart\n",[19,2420,2421,2426,2442],{"__ignoreMap":68},[72,2422,2423],{"class":74,"line":75},[72,2424,2425],{"class":1991},"# run docker without sudo\n",[72,2427,2428,2430,2433,2436,2439],{"class":74,"line":128},[72,2429,1982],{"class":78},[72,2431,2432],{"class":82}," gpasswd",[72,2434,2435],{"class":86}," -a",[72,2437,2438],{"class":626}," $USER",[72,2440,2441],{"class":82}," docker\n",[72,2443,2444,2446,2449,2452],{"class":74,"line":135},[72,2445,1982],{"class":78},[72,2447,2448],{"class":82}," service",[72,2450,2451],{"class":82}," docker",[72,2453,2454],{"class":82}," restart\n",[15,2456,2457],{},"ทดสอบเรียกใช้งาน",[63,2459,2461],{"className":65,"code":2460,"language":67,"meta":68,"style":68},"docker --version\n",[19,2462,2463],{"__ignoreMap":68},[72,2464,2465,2467],{"class":74,"line":75},[72,2466,79],{"class":78},[72,2468,93],{"class":86},[10,2470,2472],{"id":2471},"ติดตั้ง-helm","ติดตั้ง helm",[15,2474,2475,2476],{},"Credit: ",[1831,2477,2478],{"href":2478,"rel":2479},"https://helm.sh/docs/intro/install/#from-script",[1835],[63,2481,2483],{"className":65,"code":2482,"language":67,"meta":68,"style":68},"cd /tmp\ncurl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3\nchmod 700 get_helm.sh\n./get_helm.sh\n",[19,2484,2485,2491,2505,2517],{"__ignoreMap":68},[72,2486,2487,2489],{"class":74,"line":75},[72,2488,2381],{"class":234},[72,2490,2384],{"class":82},[72,2492,2493,2495,2497,2499,2502],{"class":74,"line":128},[72,2494,193],{"class":78},[72,2496,2391],{"class":86},[72,2498,2397],{"class":86},[72,2500,2501],{"class":82}," get_helm.sh",[72,2503,2504],{"class":82}," https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3\n",[72,2506,2507,2510,2514],{"class":74,"line":135},[72,2508,2509],{"class":78},"chmod",[72,2511,2513],{"class":2512},"snOyU"," 700",[72,2515,2516],{"class":82}," get_helm.sh\n",[72,2518,2519],{"class":74,"line":155},[72,2520,2521],{"class":78},"./get_helm.sh\n",[10,2523,2525],{"id":2524},"ติดตั้ง-zsh-p10k-configure-เพื่อให้ใช้งาน-terminal-ได้ง่ายยิ่งขึ้น","ติดตั้ง ZSH + P10k Configure เพื่อให้ใช้งาน terminal ได้ง่ายยิ่งขึ้น",[63,2527,2529],{"className":65,"code":2528,"language":67,"meta":68,"style":68},"sudo apt install curl wget git zsh -y\n\nsh -c \"$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)\"\n\n",[19,2530,2531,2552,2556],{"__ignoreMap":68},[72,2532,2533,2535,2537,2539,2541,2544,2547,2550],{"class":74,"line":75},[72,2534,1982],{"class":78},[72,2536,2170],{"class":82},[72,2538,2248],{"class":82},[72,2540,2356],{"class":82},[72,2542,2543],{"class":82}," wget",[72,2545,2546],{"class":82}," git",[72,2548,2549],{"class":82}," zsh",[72,2551,2187],{"class":86},[72,2553,2554],{"class":74,"line":128},[72,2555,132],{"emptyLinePlaceholder":131},[72,2557,2558,2560,2563,2566,2568,2570,2573],{"class":74,"line":135},[72,2559,67],{"class":78},[72,2561,2562],{"class":86}," -c",[72,2564,2565],{"class":238}," \"$(",[72,2567,193],{"class":78},[72,2569,2391],{"class":86},[72,2571,2572],{"class":82}," https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh",[72,2574,2575],{"class":238},")\"\n",[15,2577,2578,2579,2582,2583,2586],{},"ติดตั้ง plugins เพิ่มเติมโดยแนะนำเป็น ",[19,2580,2581],{},"zsh-syntax-highlighting"," เพื่อช่วยในการ highlight command และ ",[19,2584,2585],{},"zsh-autosuggestions"," ซึ่งจะเป็นการนำเอา history มาแสดงให้ขณะพิมพ์ command",[63,2588,2590],{"className":65,"code":2589,"language":67,"meta":68,"style":68},"# Install plugins\ngit clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting\ngit clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions\n",[19,2591,2592,2597,2638],{"__ignoreMap":68},[72,2593,2594],{"class":74,"line":75},[72,2595,2596],{"class":1991},"# Install plugins\n",[72,2598,2599,2602,2605,2608,2611,2614,2617,2620,2623,2625,2628,2630,2633,2635],{"class":74,"line":128},[72,2600,2601],{"class":78},"git",[72,2603,2604],{"class":82}," clone",[72,2606,2607],{"class":82}," https://github.com/zsh-users/zsh-syntax-highlighting.git",[72,2609,2610],{"class":642}," ${",[72,2612,2613],{"class":626},"ZSH_CUSTOM",[72,2615,2616],{"class":248},":-",[72,2618,2619],{"class":1537},"~",[72,2621,2622],{"class":248},"/",[72,2624,1541],{"class":1537},[72,2626,2627],{"class":626},"oh-my-zsh",[72,2629,2622],{"class":248},[72,2631,2632],{"class":626},"custom",[72,2634,700],{"class":642},[72,2636,2637],{"class":82},"/plugins/zsh-syntax-highlighting\n",[72,2639,2640,2642,2644,2647,2649,2651,2653,2655,2657,2659,2661,2663,2665,2667],{"class":74,"line":135},[72,2641,2601],{"class":78},[72,2643,2604],{"class":82},[72,2645,2646],{"class":82}," https://github.com/zsh-users/zsh-autosuggestions",[72,2648,2610],{"class":642},[72,2650,2613],{"class":626},[72,2652,2616],{"class":248},[72,2654,2619],{"class":1537},[72,2656,2622],{"class":248},[72,2658,1541],{"class":1537},[72,2660,2627],{"class":626},[72,2662,2622],{"class":248},[72,2664,2632],{"class":626},[72,2666,700],{"class":642},[72,2668,2669],{"class":82},"/plugins/zsh-autosuggestions\n",[15,2671,2672,2673,2676],{},"แก้ไข ",[19,2674,2675],{},".zshrc"," file เพื่อทำการเพิ่ม plugins เข้าไป",[63,2678,2680],{"className":65,"code":2679,"language":67,"meta":68,"style":68},"nano ~/.zshrc\n\n# Update plugins\nplugins=(\n    git\n    zsh-syntax-highlighting # \u003C- Add\n    zsh-autosuggestions     # \u003C- Add\n)\n",[19,2681,2682,2690,2694,2699,2710,2715,2723,2731],{"__ignoreMap":68},[72,2683,2684,2687],{"class":74,"line":75},[72,2685,2686],{"class":78},"nano",[72,2688,2689],{"class":82}," ~/.zshrc\n",[72,2691,2692],{"class":74,"line":128},[72,2693,132],{"emptyLinePlaceholder":131},[72,2695,2696],{"class":74,"line":135},[72,2697,2698],{"class":1991},"# Update plugins\n",[72,2700,2701,2704,2707],{"class":74,"line":155},[72,2702,2703],{"class":626},"plugins",[72,2705,2706],{"class":1567},"=",[72,2708,2709],{"class":642},"(\n",[72,2711,2712],{"class":74,"line":166},[72,2713,2714],{"class":82},"    git\n",[72,2716,2717,2720],{"class":74,"line":177},[72,2718,2719],{"class":82},"    zsh-syntax-highlighting",[72,2721,2722],{"class":1991}," # \u003C- Add\n",[72,2724,2725,2728],{"class":74,"line":313},[72,2726,2727],{"class":82},"    zsh-autosuggestions",[72,2729,2730],{"class":1991},"     # \u003C- Add\n",[72,2732,2733],{"class":74,"line":319},[72,2734,2735],{"class":642},")\n",[15,2737,2738,2739,2741],{},"จากนั้น reload ",[19,2740,2675],{}," file เพื่อทำการ reload การตั้งค่า",[63,2743,2745],{"className":65,"code":2744,"language":67,"meta":68,"style":68},"source ~/.zshrc\n",[19,2746,2747],{"__ignoreMap":68},[72,2748,2749,2751],{"class":74,"line":75},[72,2750,1544],{"class":234},[72,2752,2689],{"class":82},[15,2754,2755],{},"ลง P10K เพิ่มเพื่อทำให้ terminal ดูสวยงามมากยิ่งขึ้น",[63,2757,2759],{"className":65,"code":2758,"language":67,"meta":68,"style":68},"git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k\n\n",[19,2760,2761],{"__ignoreMap":68},[72,2762,2763,2765,2767,2770,2773,2775,2777,2779,2782,2784,2786,2788,2790,2792,2794],{"class":74,"line":75},[72,2764,2601],{"class":78},[72,2766,2604],{"class":82},[72,2768,2769],{"class":86}," --depth=1",[72,2771,2772],{"class":82}," https://github.com/romkatv/powerlevel10k.git",[72,2774,2610],{"class":642},[72,2776,2613],{"class":626},[72,2778,2616],{"class":248},[72,2780,2781],{"class":626},"$HOME",[72,2783,2622],{"class":248},[72,2785,1541],{"class":1537},[72,2787,2627],{"class":626},[72,2789,2622],{"class":248},[72,2791,2632],{"class":626},[72,2793,700],{"class":642},[72,2795,2796],{"class":82},"/themes/powerlevel10k\n",[15,2798,2799,2800,2803,2804,2807],{},"จากนั้นแก้ไข ",[19,2801,2802],{},"ZSH_THEME"," ให้เป็น ",[19,2805,2806],{},"powerlevel10k/powerlevel10k"," เพื่อ load theme ดังกล่าวเข้าไป",[63,2809,2811],{"className":65,"code":2810,"language":67,"meta":68,"style":68},"# Update .zshrc file\nnano ~/.zshrc\n\n# Update Theme\nZSH_THEME=\"powerlevel10k/powerlevel10k\"\n\n# Reload\nsource ~/.zshrc\n",[19,2812,2813,2818,2824,2828,2833,2845,2849,2854],{"__ignoreMap":68},[72,2814,2815],{"class":74,"line":75},[72,2816,2817],{"class":1991},"# Update .zshrc file\n",[72,2819,2820,2822],{"class":74,"line":128},[72,2821,2686],{"class":78},[72,2823,2689],{"class":82},[72,2825,2826],{"class":74,"line":135},[72,2827,132],{"emptyLinePlaceholder":131},[72,2829,2830],{"class":74,"line":155},[72,2831,2832],{"class":1991},"# Update Theme\n",[72,2834,2835,2837,2839,2841,2843],{"class":74,"line":166},[72,2836,2802],{"class":626},[72,2838,2706],{"class":1567},[72,2840,703],{"class":238},[72,2842,2806],{"class":82},[72,2844,1679],{"class":238},[72,2846,2847],{"class":74,"line":177},[72,2848,132],{"emptyLinePlaceholder":131},[72,2850,2851],{"class":74,"line":313},[72,2852,2853],{"class":1991},"# Reload\n",[72,2855,2856,2858],{"class":74,"line":319},[72,2857,1544],{"class":234},[72,2859,2689],{"class":82},[2861,2862],"hr",{},[10,2864,2866],{"id":2865},"ติดตั้ง-nodejs-v22","ติดตั้ง NodeJS (v.22)",[63,2868,2870],{"className":65,"code":2869,"language":67,"meta":68,"style":68},"curl -sL https://deb.nodesource.com/setup_22.x -o /tmp/nodesource_setup.sh\nsudo bash /tmp/nodesource_setup.sh\nsudo apt install nodejs\n\n# Verify\nnode -v\n",[19,2871,2872,2887,2896,2907,2911,2916],{"__ignoreMap":68},[72,2873,2874,2876,2879,2882,2884],{"class":74,"line":75},[72,2875,193],{"class":78},[72,2877,2878],{"class":86}," -sL",[72,2880,2881],{"class":82}," https://deb.nodesource.com/setup_22.x",[72,2883,2397],{"class":86},[72,2885,2886],{"class":82}," /tmp/nodesource_setup.sh\n",[72,2888,2889,2891,2894],{"class":74,"line":128},[72,2890,1982],{"class":78},[72,2892,2893],{"class":82}," bash",[72,2895,2886],{"class":82},[72,2897,2898,2900,2902,2904],{"class":74,"line":135},[72,2899,1982],{"class":78},[72,2901,2170],{"class":82},[72,2903,2248],{"class":82},[72,2905,2906],{"class":82}," nodejs\n",[72,2908,2909],{"class":74,"line":155},[72,2910,132],{"emptyLinePlaceholder":131},[72,2912,2913],{"class":74,"line":166},[72,2914,2915],{"class":1991},"# Verify\n",[72,2917,2918,2921],{"class":74,"line":177},[72,2919,2920],{"class":78},"node",[72,2922,2923],{"class":86}," -v\n",[15,2925,2926],{},"ติดตั้ง yarn เพิ่มเติม",[63,2928,2930],{"className":65,"code":2929,"language":67,"meta":68,"style":68},"# Install yarn\nsudo npm install -g yarn\n\n# Verify\nyarn --version\n",[19,2931,2932,2937,2952,2956,2960],{"__ignoreMap":68},[72,2933,2934],{"class":74,"line":75},[72,2935,2936],{"class":1991},"# Install yarn\n",[72,2938,2939,2941,2944,2946,2949],{"class":74,"line":128},[72,2940,1982],{"class":78},[72,2942,2943],{"class":82}," npm",[72,2945,2248],{"class":82},[72,2947,2948],{"class":86}," -g",[72,2950,2951],{"class":82}," yarn\n",[72,2953,2954],{"class":74,"line":135},[72,2955,132],{"emptyLinePlaceholder":131},[72,2957,2958],{"class":74,"line":155},[72,2959,2915],{"class":1991},[72,2961,2962,2965],{"class":74,"line":166},[72,2963,2964],{"class":78},"yarn",[72,2966,93],{"class":86},[1866,2968,2969],{},"html pre.shiki code .sosa_, html code.shiki .sosa_{--shiki-light:#E2931D;--shiki-default:#61AFEF;--shiki-dark:#B392F0}html pre.shiki code .sAlJX, html code.shiki .sAlJX{--shiki-light:#91B859;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .stlKB, html code.shiki .stlKB{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sEoV_, html code.shiki .sEoV_{--shiki-light:#91B859;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbGrh, html code.shiki .sbGrh{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#F97583}html pre.shiki code .sZDfs, html code.shiki .sZDfs{--shiki-light:#90A4AE;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sDKbk, html code.shiki .sDKbk{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7F848E;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sJZfL, html code.shiki .sJZfL{--shiki-light:#6182B8;--shiki-default:#56B6C2;--shiki-dark:#79B8FF}html pre.shiki code .sLHrO, html code.shiki .sLHrO{--shiki-light:#90A4AE;--shiki-default:#E06C75;--shiki-dark:#E1E4E8}html pre.shiki code .snOyU, html code.shiki .snOyU{--shiki-light:#F76D47;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html pre.shiki code .snfNA, html code.shiki .snfNA{--shiki-light:#39ADB5;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .sMTEB, html code.shiki .sMTEB{--shiki-light:#39ADB5;--shiki-default:#56B6C2;--shiki-dark:#F97583}",{"title":68,"searchDepth":128,"depth":128,"links":2971},[2972,2973,2983,2984,2985],{"id":12,"depth":128,"text":13},{"id":2153,"depth":128,"text":2153,"children":2974},[2975,2976,2978,2980,2981,2982],{"id":2157,"depth":135,"text":2158},{"id":2190,"depth":135,"text":2977},"แก้ไข timezone ให้เป็น Asia/Bangkok",{"id":2215,"depth":135,"text":2979},"ติดตั้ง Packages ที่สำคัญสำหรับการพัฒนา (Development) โดยภายใน Build Essential จะมีการรวมเอา Packages ที่สำคัญเอาไว้เช่น gcc, c++, make, lib6-dev และอื่น ๆ อีกมากมาย",{"id":2254,"depth":135,"text":2255},{"id":2285,"depth":135,"text":2286},{"id":2324,"depth":135,"text":2325},{"id":2471,"depth":128,"text":2472},{"id":2524,"depth":128,"text":2525},{"id":2865,"depth":128,"text":2866},"2024-01-14T00:00:00.000Z","โน๊ตนี้คือ commands ที่มักจะใช้บ่อย ๆ เมื่อต้อง setup ubuntu server (20.04, 22.04)",{},"Setup Ubuntu Server","/blogs/2024-01-14-setup-ubuntu-server",[2133],{"title":2143,"description":2987},{"loc":2990},"blogs/2024-01-14-setup-ubuntu-server",[1896],"gsB_-Bl6gGjQt19qa_rgRyVndHu_SegnBJ0Oixpyw44",{"id":2998,"title":2999,"body":3000,"date":3354,"description":3006,"draft":1884,"extension":1885,"meta":3355,"navigation":131,"next":1887,"ogTitle":2999,"path":3356,"pin":1884,"prev":1887,"recommends":3357,"seo":3358,"sitemap":3359,"stem":3360,"tags":3361,"__hash__":3362},"content/blogs/2024-01-19-setup-uptime-kuma.md","Setup Uptime Kuma",{"type":7,"value":3001,"toc":3347},[3002,3004,3007,3017,3021,3072,3076,3169,3173,3272,3277,3281,3344],[10,3003,13],{"id":12},[15,3005,3006],{},"โน๊ตนี้คือ วิธีการ setup uptime kuma แบบไม่ใช้ docker",[417,3008,3009],{},[420,3010,3011,3012],{},"สำหรับข้อมูลฉบับเต็มสามารถดูได้ที่ ",[1831,3013,3016],{"href":3014,"rel":3015},"https://github.com/louislam/uptime-kuma",[1835],"louislam/uptime-kuma",[10,3018,3020],{"id":3019},"_1-basic-setup","1. Basic setup",[63,3022,3024],{"className":65,"code":3023,"language":67,"meta":68,"style":68},"sudo apt update && sudo apt upgrade -y\nsudo timedatectl set-timezone Asia/Bangkok\n\nsudo apt install curl git -y\n",[19,3025,3026,3044,3054,3058],{"__ignoreMap":68},[72,3027,3028,3030,3032,3034,3036,3038,3040,3042],{"class":74,"line":75},[72,3029,1982],{"class":78},[72,3031,2170],{"class":82},[72,3033,2173],{"class":82},[72,3035,2176],{"class":642},[72,3037,2179],{"class":78},[72,3039,2170],{"class":82},[72,3041,2184],{"class":82},[72,3043,2187],{"class":86},[72,3045,3046,3048,3050,3052],{"class":74,"line":128},[72,3047,1982],{"class":78},[72,3049,2206],{"class":82},[72,3051,2209],{"class":82},[72,3053,2212],{"class":82},[72,3055,3056],{"class":74,"line":135},[72,3057,132],{"emptyLinePlaceholder":131},[72,3059,3060,3062,3064,3066,3068,3070],{"class":74,"line":155},[72,3061,1982],{"class":78},[72,3063,2170],{"class":82},[72,3065,2248],{"class":82},[72,3067,2356],{"class":82},[72,3069,2546],{"class":82},[72,3071,2187],{"class":86},[10,3073,3075],{"id":3074},"_2-install-nodejs-v22-and-pm2","2. Install nodejs (v.22) and pm2",[63,3077,3079],{"className":65,"code":3078,"language":67,"meta":68,"style":68},"curl -sL https://deb.nodesource.com/setup_22.x -o /tmp/nodesource_setup.sh\n\nsudo bash /tmp/nodesource_setup.sh\n\nsudo apt install nodejs\n\n# Verify\nnode -v\n\n# Install yarn\nsudo npm install -g pm2\n\n# Verify\npm2 --version\n",[19,3080,3081,3093,3097,3105,3109,3119,3123,3127,3133,3137,3141,3154,3158,3162],{"__ignoreMap":68},[72,3082,3083,3085,3087,3089,3091],{"class":74,"line":75},[72,3084,193],{"class":78},[72,3086,2878],{"class":86},[72,3088,2881],{"class":82},[72,3090,2397],{"class":86},[72,3092,2886],{"class":82},[72,3094,3095],{"class":74,"line":128},[72,3096,132],{"emptyLinePlaceholder":131},[72,3098,3099,3101,3103],{"class":74,"line":135},[72,3100,1982],{"class":78},[72,3102,2893],{"class":82},[72,3104,2886],{"class":82},[72,3106,3107],{"class":74,"line":155},[72,3108,132],{"emptyLinePlaceholder":131},[72,3110,3111,3113,3115,3117],{"class":74,"line":166},[72,3112,1982],{"class":78},[72,3114,2170],{"class":82},[72,3116,2248],{"class":82},[72,3118,2906],{"class":82},[72,3120,3121],{"class":74,"line":177},[72,3122,132],{"emptyLinePlaceholder":131},[72,3124,3125],{"class":74,"line":313},[72,3126,2915],{"class":1991},[72,3128,3129,3131],{"class":74,"line":319},[72,3130,2920],{"class":78},[72,3132,2923],{"class":86},[72,3134,3135],{"class":74,"line":325},[72,3136,132],{"emptyLinePlaceholder":131},[72,3138,3139],{"class":74,"line":330},[72,3140,2936],{"class":1991},[72,3142,3143,3145,3147,3149,3151],{"class":74,"line":336},[72,3144,1982],{"class":78},[72,3146,2943],{"class":82},[72,3148,2248],{"class":82},[72,3150,2948],{"class":86},[72,3152,3153],{"class":82}," pm2\n",[72,3155,3156],{"class":74,"line":342},[72,3157,132],{"emptyLinePlaceholder":131},[72,3159,3160],{"class":74,"line":348},[72,3161,2915],{"class":1991},[72,3163,3164,3167],{"class":74,"line":353},[72,3165,3166],{"class":78},"pm2",[72,3168,93],{"class":86},[10,3170,3172],{"id":3171},"_3-install-uptime-kuma","3. Install Uptime Kuma",[63,3174,3176],{"className":65,"code":3175,"language":67,"meta":68,"style":68},"git clone https://github.com/louislam/uptime-kuma.git\n\ncd uptime-kuma\n\nnpm run setup\n\nnpm install pm2 -g && pm2 install pm2-logrotate\n\npm2 start server/server.js --name uptime-kuma\n\npm2 save && pm2 startup\n",[19,3177,3178,3187,3191,3198,3202,3212,3216,3236,3240,3254,3258],{"__ignoreMap":68},[72,3179,3180,3182,3184],{"class":74,"line":75},[72,3181,2601],{"class":78},[72,3183,2604],{"class":82},[72,3185,3186],{"class":82}," https://github.com/louislam/uptime-kuma.git\n",[72,3188,3189],{"class":74,"line":128},[72,3190,132],{"emptyLinePlaceholder":131},[72,3192,3193,3195],{"class":74,"line":135},[72,3194,2381],{"class":234},[72,3196,3197],{"class":82}," uptime-kuma\n",[72,3199,3200],{"class":74,"line":155},[72,3201,132],{"emptyLinePlaceholder":131},[72,3203,3204,3207,3209],{"class":74,"line":166},[72,3205,3206],{"class":78},"npm",[72,3208,83],{"class":82},[72,3210,3211],{"class":82}," setup\n",[72,3213,3214],{"class":74,"line":177},[72,3215,132],{"emptyLinePlaceholder":131},[72,3217,3218,3220,3222,3225,3227,3229,3231,3233],{"class":74,"line":313},[72,3219,3206],{"class":78},[72,3221,2248],{"class":82},[72,3223,3224],{"class":82}," pm2",[72,3226,2948],{"class":86},[72,3228,2176],{"class":642},[72,3230,3224],{"class":78},[72,3232,2248],{"class":82},[72,3234,3235],{"class":82}," pm2-logrotate\n",[72,3237,3238],{"class":74,"line":319},[72,3239,132],{"emptyLinePlaceholder":131},[72,3241,3242,3244,3247,3250,3252],{"class":74,"line":325},[72,3243,3166],{"class":78},[72,3245,3246],{"class":82}," start",[72,3248,3249],{"class":82}," server/server.js",[72,3251,145],{"class":86},[72,3253,3197],{"class":82},[72,3255,3256],{"class":74,"line":330},[72,3257,132],{"emptyLinePlaceholder":131},[72,3259,3260,3262,3265,3267,3269],{"class":74,"line":336},[72,3261,3166],{"class":78},[72,3263,3264],{"class":82}," save",[72,3266,2176],{"class":642},[72,3268,3224],{"class":78},[72,3270,3271],{"class":82}," startup\n",[15,3273,3274],{},[19,3275,3276],{},"http://ip:3001",[10,3278,3280],{"id":3279},"_4-update-uptime-kuma","4. Update Uptime Kuma",[63,3282,3284],{"className":65,"code":3283,"language":67,"meta":68,"style":68},"git fetch --all\ngit checkout 1.23.16 --force\n\nnpm install --production\nnpm run download-dist\n\npm2 restart uptime-kuma\n",[19,3285,3286,3296,3309,3313,3322,3331,3335],{"__ignoreMap":68},[72,3287,3288,3290,3293],{"class":74,"line":75},[72,3289,2601],{"class":78},[72,3291,3292],{"class":82}," fetch",[72,3294,3295],{"class":86}," --all\n",[72,3297,3298,3300,3303,3306],{"class":74,"line":128},[72,3299,2601],{"class":78},[72,3301,3302],{"class":82}," checkout",[72,3304,3305],{"class":2512}," 1.23.16",[72,3307,3308],{"class":86}," --force\n",[72,3310,3311],{"class":74,"line":135},[72,3312,132],{"emptyLinePlaceholder":131},[72,3314,3315,3317,3319],{"class":74,"line":155},[72,3316,3206],{"class":78},[72,3318,2248],{"class":82},[72,3320,3321],{"class":86}," --production\n",[72,3323,3324,3326,3328],{"class":74,"line":166},[72,3325,3206],{"class":78},[72,3327,83],{"class":82},[72,3329,3330],{"class":82}," download-dist\n",[72,3332,3333],{"class":74,"line":177},[72,3334,132],{"emptyLinePlaceholder":131},[72,3336,3337,3339,3342],{"class":74,"line":313},[72,3338,3166],{"class":78},[72,3340,3341],{"class":82}," restart",[72,3343,3197],{"class":82},[1866,3345,3346],{},"html pre.shiki code .sosa_, html code.shiki .sosa_{--shiki-light:#E2931D;--shiki-default:#61AFEF;--shiki-dark:#B392F0}html pre.shiki code .sAlJX, html code.shiki .sAlJX{--shiki-light:#91B859;--shiki-default:#98C379;--shiki-dark:#9ECBFF}html pre.shiki code .stlKB, html code.shiki .stlKB{--shiki-light:#39ADB5;--shiki-default:#ABB2BF;--shiki-dark:#E1E4E8}html pre.shiki code .sEoV_, html code.shiki .sEoV_{--shiki-light:#91B859;--shiki-default:#D19A66;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sDKbk, html code.shiki .sDKbk{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7F848E;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sJZfL, html code.shiki .sJZfL{--shiki-light:#6182B8;--shiki-default:#56B6C2;--shiki-dark:#79B8FF}html pre.shiki code .snOyU, html code.shiki .snOyU{--shiki-light:#F76D47;--shiki-default:#D19A66;--shiki-dark:#79B8FF}",{"title":68,"searchDepth":128,"depth":128,"links":3348},[3349,3350,3351,3352,3353],{"id":12,"depth":128,"text":13},{"id":3019,"depth":128,"text":3020},{"id":3074,"depth":128,"text":3075},{"id":3171,"depth":128,"text":3172},{"id":3279,"depth":128,"text":3280},"2024-01-19T00:00:00.000Z",{},"/blogs/2024-01-19-setup-uptime-kuma",[],{"title":2999,"description":3006},{"loc":3356},"blogs/2024-01-19-setup-uptime-kuma",[1896],"Cf2-dDJLipPdktPEvOWowFogH8zgHN0sz3YTU7Xqsqs",{"id":3364,"title":3365,"body":3366,"date":3545,"description":3546,"draft":1884,"extension":1885,"meta":3547,"navigation":131,"next":1887,"ogTitle":3548,"path":3549,"pin":1884,"prev":1887,"recommends":3550,"seo":3551,"sitemap":3552,"stem":3553,"tags":3554,"__hash__":3555},"content/blogs/2025-04-15-ubuntu-pro.md","วิธีการติดตั้ง Ubuntu Version Pro แบบฟรี",{"type":7,"value":3367,"toc":3540},[3368,3371,3381,3385,3450,3460,3464,3479,3485,3488,3493,3498,3508,3513,3520,3522,3525],[15,3369,3370],{},"หลายคนอาจเคยเห็นว่า Ubuntu มีเวอร์ชัน Pro ให้ใช้งาน ไม่ว่าจะในหน้าจอติดตั้งระบบ หรือเป็นหน้าต่างแจ้งเตือนเมื่อเข้าสู่ระบบปฏิบัติการแล้ว",[15,3372,3373,3374,3377,3378],{},"ทาง Ubuntu เปิดให้ใช้งานเวอร์ชัน Pro ได้ฟรี สำหรับผู้ใช้แบบส่วนตัวสูงสุด ",[19,3375,3376],{},"5 active machines"," และสำหรับสมาชิก Ubuntu community สูงสุด ",[19,3379,3380],{},"50 active machines",[10,3382,3384],{"id":3383},"ความแตกต่างหลักระหว่าง-ubuntu-ปกติ-และ-ubuntu-pro","ความแตกต่างหลักระหว่าง Ubuntu ปกติ และ Ubuntu Pro",[3386,3387,3388,3404],"table",{},[3389,3390,3391],"thead",{},[3392,3393,3394,3398,3401],"tr",{},[3395,3396,3397],"th",{},"คุณสมบัติ",[3395,3399,3400],{},"Ubuntu ปกติ",[3395,3402,3403],{},"Ubuntu Pro (ฟรี)",[3405,3406,3407,3419,3430,3439],"tbody",{},[3392,3408,3409,3413,3416],{},[3410,3411,3412],"td",{},"ระยะเวลารับอัปเดต",[3410,3414,3415],{},"5 ปี",[3410,3417,3418],{},"10 ปี",[3392,3420,3421,3424,3427],{},[3410,3422,3423],{},"Livepatch",[3410,3425,3426],{},"-",[3410,3428,3429],{},"✓",[3392,3431,3432,3435,3437],{},[3410,3433,3434],{},"การ hardening ระบบ",[3410,3436,3426],{},[3410,3438,3429],{},[3392,3440,3441,3444,3447],{},[3410,3442,3443],{},"จำนวนเครื่องที่รองรับ",[3410,3445,3446],{},"ไม่จำกัด",[3410,3448,3449],{},"5 เครื่อง (ส่วนตัว)",[2367,3451,3452],{},[15,3453,3454,3455,3459],{},"สามารถอ่านเพิ่มเติมได้ที่ ",[1831,3456,3457],{"href":3457,"rel":3458},"https://ubuntu.com/pricing/pro",[1835]," ตรง Ubuntu Pro for personal users",[10,3461,3463],{"id":3462},"ขั้นตอนการกดรับ-license","ขั้นตอนการกดรับ License",[3465,3466,3467],"ol",{},[420,3468,3469,3470,3474,3475],{},"สมัคร account ที่ ",[1831,3471,3472],{"href":3472,"rel":3473},"https://ubuntu.com",[1835]," ให้เรียบร้อยจากนั้นไปที่หน้า ",[1831,3476,3477],{"href":3477,"rel":3478},"https://ubuntu.com/pro",[1835],[15,3480,3481],{},[591,3482],{"alt":3483,"src":3484},"Ubuntu Pro","/images/2025-04-15-ubuntu-pro/image-1.png",[15,3486,3487],{},"แล้วกดที่ปุ่ม \"Get Ubuntu Pro now\" ได้เลยครับ",[3465,3489,3490],{"start":128},[420,3491,3492],{},"จากนั้นเลือกเป็น \"Myself\" ได้เลยครับ จะเป็นการกดรับ license free กด continue to card ได้เลย",[15,3494,3495],{},[591,3496],{"alt":3483,"src":3497},"/images/2025-04-15-ubuntu-pro/image-2.png",[3465,3499,3500],{"start":135},[420,3501,3502,3503,3507],{},"เมื่อเสร็จสิ้นขั้นตอนให้ไปยัง ",[1831,3504,3505],{"href":3505,"rel":3506},"https://ubuntu.com/pro/dashboard",[1835]," ตรงเมนู \"Your subscriptions\" จะเจอกับ Token ซึ่งสามารถนำไปใช้งานได้เลยครับ",[15,3509,3510],{},[591,3511],{"alt":3483,"src":3512},"/images/2025-04-15-ubuntu-pro/image-3.png",[15,3514,3515,3516,3519],{},"หากเป็นการติดตั้งระบบปฏิบัติการใหม่ สามารถกรอก Token ได้ในขั้นตอนติดตั้ง แต่หากติดตั้ง Ubuntu ไปแล้ว สามารถใช้คำสั่ง ",[19,3517,3518],{},"sudo pro attach \u003CTOKEN>"," เพื่อเปิดใช้งาน License ได้เลย",[2861,3521],{},[10,3523,3524],{"id":3524},"แหล่งข้อมูลเพิ่มเติม",[417,3526,3527,3534],{},[420,3528,3529],{},[1831,3530,3533],{"href":3531,"rel":3532},"https://ubuntu.com/legal/ubuntu-pro/personal",[1835],"Ubuntu Pro for Personal Use",[420,3535,3536],{},[1831,3537,3539],{"href":3457,"rel":3538},[1835],"Ubuntu Pro Pricing",{"title":68,"searchDepth":128,"depth":128,"links":3541},[3542,3543,3544],{"id":3383,"depth":128,"text":3384},{"id":3462,"depth":128,"text":3463},{"id":3524,"depth":128,"text":3524},"2025-04-15T00:00:00.000Z","เราสามารถขอ Ubuntu Pro มาใช้งานในแบบ personal use ได้ฟรี !!",{},"Ubuntu Pro Version","/blogs/2025-04-15-ubuntu-pro",[2134],{"title":3365,"description":3546},{"loc":3549},"blogs/2025-04-15-ubuntu-pro",[1896],"LBlubj7jR5TdzskoZjwzBYsgosWhA--Mewk4A_60rms",{"id":3557,"title":3558,"body":3559,"date":3764,"description":3765,"draft":1884,"extension":1885,"meta":3766,"navigation":131,"next":1887,"ogTitle":3767,"path":3768,"pin":1884,"prev":1887,"recommends":3769,"seo":3770,"sitemap":3771,"stem":3772,"tags":3773,"__hash__":3774},"content/blogs/2025-05-12-next-dns.md","ผมย้ายจาก Pihole & Adguard มาใช้ NextDNS",{"type":7,"value":3560,"toc":3751},[3561,3566,3570,3573,3576,3579,3583,3588,3598,3601,3605,3608,3612,3615,3618,3622,3625,3628,3631,3636,3639,3642,3648,3651,3654,3659,3662,3673,3676,3682,3685,3690,3694,3699,3702,3706,3709,3714,3718,3721,3726,3728,3731,3734,3741,3748],[15,3562,3563],{},[591,3564],{"alt":68,"src":3565},"/images/2025-05-12-next-dns/images-7cc8fbe7-61fd-422c-90fd-f1f87ff3201e.jpg",[10,3567,3569],{"id":3568},"nextdns-คือ","NextDNS คือ",[15,3571,3572],{},"DNS Server ที่สามารถช่วยในการป้องกัน security threads, block โฆษณา หรือ block การ tracking ของ website หรือ application ต่าง ๆ โดยที่เราสามารถตั้งค่าได้ว่าในแต่ละ device จะใช้ policy ใดในการป้องกัน",[15,3574,3575],{},"โดยวิธีการทำงานตัว NextDNS จะมี list ของ domain ที่เป็นอันตราย (สามารถใช้ Blacklist มาตรฐานทั่ว ๆ ไปของ Adguard หรือ PiHole ได้) เมื่อมีการพยายาม query ข้อมูลที่เป็นอันตรายจาก domain ที่อยู่ใน blacklist ตัว NextDNS ก็จะทำการ block คำขอดังกล่าวแทน",[15,3577,3578],{},"วิธีการใช้งานตั้งค่าจะคล้าย ๆ กับ Pihole หรือ Adguard เลยครับ แต่ต่างตรงที่เราไม่ต้อง self-hosted เอง, สามารถจัดการเองได้บน website \"my.nextdns.io\" ครับ",[10,3580,3582],{"id":3581},"pricing","Pricing",[15,3584,3585],{},[591,3586],{"alt":68,"src":3587},"/images/2025-05-12-next-dns/images-21282f92-db55-4b79-aa63-67fc9aa7303a.jpg",[15,3589,3590,3593,3594,3597],{},[1932,3591,3592],{},"ข้อมูล ณ วันที่ 12/5/68","\nจะมีให้ใช้ 4 Plan หลัก ๆ ด้วยกันโดยที่มี version free ให้ใช้ด้วยครับ สามารถตั้งค่าได้เหมือนกับ version เสียตัง แต่จะแตกต่างตรงที่หากครบ 300,000 queries ต่อเดือนแล้วหลังจากนั้น",[27,3595,3596],{},"จะไม่มีการ block query"," (จะกลายเป็นเหมือน DNS ธรรมดาทั่ว ๆ ไป) เลยไม่ต้องกังวลไปนะครับว่าหลังจากครบโควต้าฟรีแล้วจะใช้งาน DNS ไม่ได้",[15,3599,3600],{},"ส่วนตัวผมเลือกเป็น Version Pro ครับ ปีละ 590 บาท (ทดลองใช้ตัวฟรีประมาณ 1 สัปดาห์ก็ตัดสินใจจ่ายเงินเลยครับ)",[10,3602,3604],{"id":3603},"ควรเลือก-plan-ไหนดี","ควรเลือก Plan ไหนดี",[15,3606,3607],{},"สำหรับผมแล้ว 300,000 queries ต่อเดือน บอกเลยครับว่า \"ไม่พอ\" 5555 เลยตัดสินใจ subscription เป็นตัว pro แทน แต่ก็แนะนำว่าให้ลองใช้ดูก่อนก็ได้ครับ ว่าเข้ากับ lifestyle ของตัวเองรึเปล่า ถ้าถูกใจค่อยจ่ายตังก็ได้ครับ เพราะตัว free มี featureเหมือนกับตัว pro หรือตัวเสียตังเลย",[10,3609,3611],{"id":3610},"เอาเงินค่า-subscription-ไปเช่า-server-แล้ว-self-hosted-เองจะดีกว่ามั้ย","เอาเงินค่า subscription ไปเช่า server แล้ว self-hosted เองจะดีกว่ามั้ย",[15,3613,3614],{},"เครื่อง server 1 ปีในราคา 590 บาทถ้าถามว่ามีมั้ย ก็ต้องบอกว่าพอจะหาได้ครับ ผมเองก็เป็นสาย Self-hosted, Home Lab ที่ชอบการ self-hosted อะไรหลาย ๆ อย่าง แต่ผมมีความคิดนึงครับว่าจะมีอยู่ไม่กี่อย่างที่จะไม่ self-hosted เองได้แก่ Email Server, Bitwarden (password manager) และ DNS เพราะสิ่งเหล่านี้การดูแลรักษาให้ใช้งานได้และปลอดภัยถือว่าเป็น challenge มากครับ ถ้าใช้งานไม่ได้ขึ้นมางานหยาบทันที ดังนั้นยอมเสียตังหน่อยเพื่อใช้ความ stable ตรงนี้ดีกว่าครับ (อันนี้มุมมองผมนะ)",[15,3616,3617],{},"แล้วก็เคยมีประสบการณ์ที่ Internal ช้าเพราะว่า Setup Pihole & Adguard ไม่ดีทำให้จังหวะ query มันแปลก ๆ กว่าจะหาเหตุผลเจอว่าเป็นที่การตั้งค่าของตัวเอง ก็โทษ ISP อยู่หลายวัน 55555 (อันนี้ยอมรับว่าเป็น skill issue ของตัวเอง) แต่ก็อยากแชร์เป็น use-case ให้ฟังครับ",[10,3619,3621],{"id":3620},"dns-over-https","DNS over HTTPS",[15,3623,3624],{},"อันนี้เป็นอีกเหตุผลนึงที่ผมย้ายมาใช้ NextDNS เพราะว่ามี DoH ให้ใช้ อธิบายให้เห็นภาพง่าย ๆ ให้มองว่าถ้าเราใช้ DNS แบบปกติทางผู้ให้บริการ internal หรือผู้ดูแลระบบจะสามารถดู DNS query ได้ (DNS query จะไม่ได้มีการเข้ารหัสไว้) ซึ่งการมาใช้ DoH จะทำให้มี Privacy ในส่วนนี้มากยิ่งขึ้น จะเป็นการ encryption DNS query อีกทั้งยังสามารถป้องกันการโดน DNS Proxy จากผู้ดูแลได้อีกด้วย (สำหรับคนที่กังวลในเรื่อง Privacy แบบผมอันนี้คือจุดสำคัญเลยครับ)",[10,3626,3627],{"id":3627},"วิธีการใช้งาน",[15,3629,3630],{},"ต้องบอกว่าสามารถใช้งานได้ในแทบทุกอุปกรณ์เลย ส่วนตัวผมเองใช้งานบน Windows, MacOS, IPAD OS, iOS โดยจะมีการตั้งค่าหลายวิธีเลยครับ แต่แนะนำว่าให้ใช้วิธีการติดตั้ง Application ดีกว่า ตัวอย่างเช่น iOS",[15,3632,3633],{},[591,3634],{"alt":68,"src":3635},"/images/2025-05-12-next-dns/images-44fe4e0e-4f38-4ed5-abd5-c165444b4de7.jpg",[15,3637,3638],{},"ซึ่งสามารถใช้งานได้ 2 วิธีคือการลง Profile กับติดตั้ง Application บอกตรง ๆ ว่าผมไม่กล้าเลือกการติดตั้งโดยใช้ Profile ครับ เลยเลือกเป็น Download Application จาก App Store แทน",[15,3640,3641],{},"วิธีการใช้งานง่ายมากจริง ๆ อ่านตรงข้างล่างก็ทำตามได้แล้วครับ",[15,3643,3644,3645],{},"ผมเองใช้งานทั้งในรูปแบบของการติดตั้งบน end devices และติดตั้งบน router ที่บ้านเลยครับ แต่ถ้าเป็นการติดตั้งบน router ที่ไม่ได้รองรับการ setup next dns (อุุปกรณ์ที่รองรับเช่น Mikrotik, Tailscale, pfSense) จำเป็นต้องตั้งค่า DNS แบบปกติ (เอา IP มาใส่) แล้ว Update ตรง \"Linked IP\"\n",[591,3646],{"alt":68,"src":3647},"/images/2025-05-12-next-dns/images-5da350b0-f339-429e-a108-edfefb194df2.jpg",[15,3649,3650],{},"ให้ IP เป็นของบ้านเรา แล้วจะสามารถใช้ Profile นั้น ๆ ได้ จะใช้เป็นตั้งค่า DDNS หรือทำ scheduler เพื่อไป update ip ก็ได้ครับ (ผมใช้ n8n ทำ workflows ให้ loop fetch เรื่อย ๆ)",[10,3652,3653],{"id":3653},"ป้องกันอะไรได้บ้าง",[15,3655,3656],{},[591,3657],{"alt":68,"src":3658},"/images/2025-05-12-next-dns/images-0eae9706-37a8-4bc3-ab47-0e7f86206438.jpg",[15,3660,3661],{},"ภายใน Tab Security จะมี options ให้ตั้งค่าได้ครับว่า Profile นี้จะให้มีการป้องกันอะไรบ้าง เช่น",[417,3663,3664,3667,3670],{},[420,3665,3666],{},"Threat Intelligence Feeds: ป้องกัน domain ที่เป็นอันตรายเช่น Phishing, c2 server",[420,3668,3669],{},"DNS Rebinding Protection: ป้องกัน DNS ประเภทที่ Mapping เป็น Private IP",[420,3671,3672],{},"Typosquatting Protection: ป้องกัน domain ประเภทที่เจตนาเล่นกับการพิมพ์ผิด เช่น gooogle.com เป็นต้น (เว็บจริงคือ google.com)",[15,3674,3675],{},"และอื่น ๆ อีกตั้งค่าได้เยอะประมาณนึงเลยครับ",[15,3677,3678,3679],{},"เลือก Blacklists เองได้ เหมือนกับ Adguard & Pihole เลย\n",[591,3680],{"alt":68,"src":3681},"/images/2025-05-12-next-dns/images-1d87500f-04aa-4aaa-b6f8-d46c4f0b7da4.jpg",[15,3683,3684],{},"มี Parental Control ใช้สำหรับการสร้าง Profile เพื่อป้องกันเด็ก ๆ ที่บ้านดูในสิ่งที่ไม่ควรจะดูได้ สามารถ block การเข้าถึง application ต่าง ๆ ได้ ตั้งเวลาในการเข้าใช้งาน domain ต่าง ๆ ได้ครับ",[15,3686,3687],{},[591,3688],{"alt":68,"src":3689},"/images/2025-05-12-next-dns/images-890aa801-ef39-44e6-bfa4-d13f15d97025.jpg",[10,3691,3693],{"id":3692},"รองรับหลาย-profile","รองรับหลาย Profile",[15,3695,3696],{},[591,3697],{"alt":68,"src":3698},"/images/2025-05-12-next-dns/images-76b242e0-e379-4af6-ad5e-75eec5ac5c51.jpg",[15,3700,3701],{},"ในบางกรณีจะนำไปใช้ในการควบคุมการเข้าถึงของบุคคลอื่น ๆ เช่นผู้สูงอายุที่บ้าน, เด็ก ๆ ที่บ้าน ทาง NextDNS เองก็มีการให้ตั้งค่า Profile ได้เช่นเดียวกัน โดยที่แต่ละ Profile จะมี ID ของตัวเองและตั้งค่าแยกกันโดยอิสระ ในเครื่องที่ต้องการใช้ Profile อื่นก็ให้นำ ID ใน Tab Setup ไปใส่ได้เลยครับ",[10,3703,3705],{"id":3704},"ดู-query-logs-ได้","ดู query logs ได้",[15,3707,3708],{},"สามารถดู Logs การ query domain ต่าง ๆ ได้ครับ สิ่งจะเห็นทุก ๆ อุปกรณ์ที่ใช้ Profile ID นี้ แต่ตรงนี้สามารถปิดได้นะครับ (ปกติก็ผมจะปิดไว้)",[15,3710,3711],{},[591,3712],{"alt":68,"src":3713},"/images/2025-05-12-next-dns/images-aaeef8ce-564a-4afb-abb2-e9fdbbd29f9b.jpg",[10,3715,3717],{"id":3716},"server-มีที่ไหนบ้าง","Server มีที่ไหนบ้าง",[15,3719,3720],{},"มีหลาย Server มากครับโดยใกล้สุดคืออยู่ที่กรุงเทพ ซึ่ง Ping เพียงแค่ \"7ms\" น้อยมาก ๆ อันนี้เลยเป็นอีกเหตุผลที่ผมเลือกใช้",[15,3722,3723],{},[591,3724],{"alt":68,"src":3725},"/images/2025-05-12-next-dns/images-509d5eaf-58e3-46b7-a425-01b7b562443d.jpg",[10,3727,1809],{"id":1809},[15,3729,3730],{},"ผมใช้งานมาได้ประมาณ 1 เดือนแล้วครับ ตอนนี้ก็เอา Adgaurd ออกจาก Home Server แล้ว จากที่ใช้มายังไม่เจอเหตุการณ์ที่ Server Down แล้วทำให้ใช้งานไม่ได้เลยครับ ส่วนตัวให้ 9/10 หัก 1 คะแนนตรงที่ ถ้ามี Custom DNS record ให้ใช้จะดีเลยครับ แต่อันนี้ไม่มี",[15,3732,3733],{},"สนใจสมัครได้ที่",[15,3735,3736,3737],{},"(affiliate link): ",[1831,3738,3739],{"href":3739,"rel":3740},"https://nextdns.io/?from=2ggah5wn",[1835],[15,3742,3743,3744],{},"(link ปกติ): ",[1831,3745,3746],{"href":3746,"rel":3747},"https://my.nextdns.io/",[1835],[15,3749,3750],{},"กดสมัครผ่าน affiliate link เพื่อเป็นกำลังใจเล็ก ๆ น้อย ๆ ได้นะครับ ~",{"title":68,"searchDepth":128,"depth":128,"links":3752},[3753,3754,3755,3756,3757,3758,3759,3760,3761,3762,3763],{"id":3568,"depth":128,"text":3569},{"id":3581,"depth":128,"text":3582},{"id":3603,"depth":128,"text":3604},{"id":3610,"depth":128,"text":3611},{"id":3620,"depth":128,"text":3621},{"id":3627,"depth":128,"text":3627},{"id":3653,"depth":128,"text":3653},{"id":3692,"depth":128,"text":3693},{"id":3704,"depth":128,"text":3705},{"id":3716,"depth":128,"text":3717},{"id":1809,"depth":128,"text":1809},"2025-05-12T00:00:00.000Z","การมี DNS ที่ช่วยในการ Block โฆษณาหรือการ Tracking ในยุคสมัยนี้ถือว่าเป็นสิ่งที่ควรจะมี",{},"NextDNS","/blogs/2025-05-12-next-dns",[],{"title":3558,"description":3765},{"loc":3768},"blogs/2025-05-12-next-dns",[1896],"yzSZ8H3XjboRBw6VQcJMxcXqLhFst_hdKafByCGQvF8",{"id":1900,"title":1901,"body":3776,"date":2127,"description":2128,"draft":1884,"extension":1885,"meta":3935,"navigation":131,"next":1887,"ogTitle":2130,"path":2131,"pin":1884,"prev":1887,"recommends":3936,"seo":3937,"sitemap":3938,"stem":2137,"tags":3939,"__hash__":2139},{"type":7,"value":3777,"toc":3928},[3778,3782,3786,3788,3790,3804,3808,3814,3818,3820,3822,3836,3840,3846,3850,3854,3858,3860,3862,3876,3880,3882,3896,3898,3900,3902,3904,3906,3920,3924,3926],[15,3779,3780],{},[591,3781],{"alt":68,"src":1908},[15,3783,1911,3784,1915],{},[27,3785,1914],{},[10,3787,1919],{"id":1918},[15,3789,1922],{},[417,3791,3792,3794,3800,3802],{},[420,3793,1927],{},[420,3795,1930,3796,3798],{},[1932,3797,1934],{},[591,3799],{"alt":68,"src":1937},[420,3801,1940],{},[420,3803,1943],{},[15,3805,1946,3806],{},[591,3807],{"alt":68,"src":1949},[15,3809,1952,3810,1957,3812,1961],{},[1831,3811,1956],{"href":1955},[19,3813,1960],{},[15,3815,3816],{},[591,3817],{"alt":68,"src":1966},[10,3819,1969],{"id":1969},[15,3821,1972],{},[63,3823,3824],{"className":65,"code":1975,"language":67,"meta":68,"style":68},[19,3825,3826],{"__ignoreMap":68},[72,3827,3828,3830,3832,3834],{"class":74,"line":75},[72,3829,1982],{"class":78},[72,3831,1985],{"class":82},[72,3833,1988],{"class":82},[72,3835,1992],{"class":1991},[15,3837,3838],{},[591,3839],{"alt":68,"src":1997},[15,3841,2000,3842,2004,3844,2008],{},[19,3843,2003],{},[19,3845,2007],{},[15,3847,3848],{},[591,3849],{"alt":68,"src":2013},[15,3851,2016,3852],{},[19,3853,2019],{},[15,3855,3856],{},[591,3857],{"alt":68,"src":2024},[15,3859,2027],{},[10,3861,2031],{"id":2030},[63,3863,3864],{"className":65,"code":2034,"language":67,"meta":68,"style":68},[19,3865,3866],{"__ignoreMap":68},[72,3867,3868,3870,3872,3874],{"class":74,"line":75},[72,3869,1982],{"class":78},[72,3871,2043],{"class":82},[72,3873,2046],{"class":82},[72,3875,2049],{"class":82},[15,3877,3878],{},[591,3879],{"alt":68,"src":2054},[15,3881,2057],{},[63,3883,3884],{"className":65,"code":2060,"language":67,"meta":68,"style":68},[19,3885,3886],{"__ignoreMap":68},[72,3887,3888,3890,3892,3894],{"class":74,"line":75},[72,3889,1982],{"class":78},[72,3891,2043],{"class":82},[72,3893,2071],{"class":82},[72,3895,2049],{"class":82},[10,3897,2077],{"id":2076},[15,3899,2080],{},[10,3901,1809],{"id":1809},[15,3903,2085],{},[15,3905,2088],{},[417,3907,3908,3910,3912,3914,3916,3918],{},[420,3909,2093],{},[420,3911,2096],{},[420,3913,2099],{},[420,3915,2102],{},[420,3917,2105],{},[420,3919,2108],{},[15,3921,3922],{},[591,3923],{"alt":68,"src":2113},[15,3925,2116],{},[1866,3927,2119],{},{"title":68,"searchDepth":128,"depth":128,"links":3929},[3930,3931,3932,3933,3934],{"id":1918,"depth":128,"text":1919},{"id":1969,"depth":128,"text":1969},{"id":2030,"depth":128,"text":2031},{"id":2076,"depth":128,"text":2077},{"id":1809,"depth":128,"text":1809},{},[2133,2134],{"title":1901,"description":2128},{"loc":2131},[1896],{"id":3941,"title":3942,"body":3943,"date":4372,"description":4373,"draft":1884,"extension":1885,"meta":4374,"navigation":131,"next":1887,"ogTitle":4375,"path":4376,"pin":1884,"prev":1887,"recommends":1887,"seo":4377,"sitemap":4378,"stem":4379,"tags":4380,"__hash__":4381},"content/blogs/2025-08-26-xponology-on-old-pc.md","ติดตั้ง Xpenology บน PC เครื่องเก่ากัน",{"type":7,"value":3944,"toc":4364},[3945,3949,3952,3955,3958,3962,3965,3979,3982,3987,3990,3998,4001,4004,4014,4019,4022,4027,4038,4041,4044,4057,4062,4081,4086,4089,4093,4096,4101,4104,4109,4112,4117,4120,4125,4128,4133,4136,4141,4144,4149,4152,4157,4160,4165,4168,4173,4176,4181,4184,4189,4194,4197,4202,4205,4210,4213,4218,4221,4225,4233,4238,4241,4246,4251,4256,4259,4264,4269,4274,4277,4282,4285,4290,4293,4298,4303,4306,4311,4314,4319,4324,4327,4332,4335,4340,4343,4348,4350],[10,3946,3948],{"id":3947},"xpenology-คืออะไร","Xpenology คืออะไร?",[15,3950,3951],{},"Xpenology เป็นส่วนของซอฟต์แวร์แบบ “bootloader” ที่ทำให้ระบบปฏิบัติการของ Synology ซึ่งเรียกว่า DSM (DiskStation Manager) สามารถรันบน hardware ทั่วไปได้ แทนที่จะต้องใช้เฉพาะเครื่อง NAS ของ Synology เท่านั้น",[15,3953,3954],{},"DSM เป็นระบบปฏิบัติการที่ Synology พัฒนาบน Linux ออกแบบมาเพื่อทำงานบนเครื่อง NAS มีฟีเจอร์ที่จำเป็นสำหรับการเก็บข้อมูล แชร์ไฟล์ steaming และอื่น ๆ อีกมากมาย",[15,3956,3957],{},"ซึ่งการติดตั้ง Xpenology พูดง่าย ๆ คือการที่จะทำให้เราสามารถใช้งาน Synology OS บน Hardware ทั่ว ๆ ไปได้นั่นเอง โดยในวันนี้ผมจะมาติดตั้งบน PC เครื่องเก่ากันนะครับ",[10,3959,3961],{"id":3960},"hardware-วันนี้","Hardware วันนี้",[15,3963,3964],{},"โดยเครื่องนี้จะเป็น",[417,3966,3967,3970,3973,3976],{},[420,3968,3969],{},"CPU: I3 7100",[420,3971,3972],{},"Ram: 8GB DDR4",[420,3974,3975],{},"HDD: 1TB 2 ลูก",[420,3977,3978],{},"SSD: 256GB สำหรับติดตั้ง OS",[15,3980,3981],{},"โดย PC เครื่องนี้ผมซื้อมือ 2 มาจาก facebook marketplace โดยตอนซื้อมาจะมีแค่ CPU, RAM, HDD 1 ลูก โดยเงื่อนไขของการทำ DIY NAS ของผมคือต้องใส่ HDD อย่างน้อยได้ 2 ลูก เพื่อทำ RAID 1 (RAID Software ก็ได้)",[15,3983,3984],{},[591,3985],{"alt":68,"src":3986},"/images/2025-08-26-xponology-on-old-pc/images-e8de1f9e-b6b3-4964-9299-d404f3f70541.jpg",[15,3988,3989],{},"ปัญหาต่อมาคืออยากจะใช้ SSD เพื่อทำให้ OS ทำงานได้ไวขึ้น มี 2 ทางเลือกครับ (บอร์ดรุ่นเก่าไม่มีช่อง M.2 ให้เสียบ sadddd)",[417,3991,3992,3995],{},[420,3993,3994],{},"ซื้อ SSD แบบ SATA มาเสียบเพิ่ม เพราะช่อง SATA มี 4 ช่อง (ใช้ไปแล้ว 2)",[420,3996,3997],{},"ซื้อตัวแปร PCI-E เป็น M.2 แล้วเสียบ SSD แบบ M.2",[15,3999,4000],{},"ตอนแรกทางเลือกแรกคือทางเลือกที่ดีสำหรับผม แต่แล้วเมื่อตรวจสอบสายไฟจาก POWER แล้วก็ทำให้น้ำตาไหล เพราะว่ามีสายไฟสำหรับ HDD แค่ 2 ช่อง (ใช้ครบแล้ว) เลยทำให้ต้องไปทางเลือกที่ 2 นั่นก็คือซื้อ PCE to M.2",[15,4002,4003],{},"สิ่งที่ลุ้นและขี้เกียจก็คือซื้อมาแล้ว Mainboard จะรองรับมั้ย ซึ่งตามหลัก Engineer ก็คือต้องเปิด Datasheet เพื่อหาข้อมูล แต่ไม่ทำ (5555) ซื้อเลย ได้ไม่ได้ค่อยว่ากันอีกที เพราะตั้งใจจะทำ DIY อยู่แล้ว เลยไปเจอใน shopee มาครับเป็นตัวนี้",[15,4005,4006,4009,4010],{},[27,4007,4008],{},"JEYI PCIe X4 to M.2 NVMe",": ",[1831,4011,4012],{"href":4012,"rel":4013},"https://s.shopee.co.th/VwlrEE0hL",[1835],[15,4015,4016],{},[591,4017],{"alt":68,"src":4018},"/images/2025-08-26-xponology-on-old-pc/images-1183b11d-997c-413e-aa3a-f0caf0a40d9d.jpg",[15,4020,4021],{},"เมื่อประกอบ SSD เข้าไปจะหน้าตาประมาณนี้ครับ",[15,4023,4024],{},[591,4025],{"alt":68,"src":4026},"/images/2025-08-26-xponology-on-old-pc/images-43be6af3-b251-4c21-86fd-37d63fa4d4aa.jpg",[417,4028,4029,4032,4035],{},[420,4030,4031],{},"โดย Adapter ตัวนี้จะเสียบลงไปที่ช่อง PCI-E ได้ทั้ง x4 x8 x16 เลย",[420,4033,4034],{},"SSD ตัวนี้เป็น M.2 NVME Gen 4 ความเร็วก็คือวิ่งได้ที่ระดับ Gen 4 เลยครับ",[420,4036,4037],{},"รองรับ mainboard ในหลาย ๆ รุ่นจากที่ลองหาข้อมูลดูนะครับ ตัวอย่างผมซื้อมาใช้กับ Asrock H11M-K รุ่นค่อนข้างเก่าเลย แต่ก็ยังใช้งานได้",[15,4039,4040],{},"ต่อไปมาเริ่มติดตั้ง OS กันครับ ~",[10,4042,4043],{"id":4043},"เตรียมการก่อนเริ่มติดตั้ง",[3465,4045,4046],{},[420,4047,4048,4049,4053,4054],{},"download img จาก ",[1831,4050,4051],{"href":4051,"rel":4052},"https://github.com/AuxXxilium/arc/releases/",[1835]," โดยเลือกเป็น .img.zip นะครับ โดยในตัวอย่างผมติดตั้งเป็น version ",[1932,4055,4056],{},"2.6.5",[15,4058,4059],{},[591,4060],{"alt":68,"src":4061},"/images/2025-08-26-xponology-on-old-pc/images-d9342298-65c4-4b3d-925d-b18be0afcfdb.jpg",[3465,4063,4064,4075],{"start":128},[420,4065,4066,4067,4071,4072],{},"สำหรับโปรแกรมที่ใช้การสร้าง bootloader ผมจะใช้เป็น ตัวนี้นะครับ สามารถโหลดได้จาก ",[1831,4068,4069],{"href":4069,"rel":4070},"https://etcher.balena.io",[1835]," ผมใช้ตัวนี้เป็นประจำ หากมีเครื่องมือตัวอื่นที่ถนัดก็สามารถใช้ได้เหมือนกัน",[591,4073],{"alt":68,"src":4074},"/images/2025-08-26-xponology-on-old-pc/images-be9017e4-edbe-41bc-8b98-67ae7ec9e1f2.jpg",[420,4076,4077,4078],{},"ต้องมี Flashdrive ขนาด 4GB++ ด้วยนะครับ โดยเลือก image เป็น ARC ส่วนของ Target Drive ก็เลือกเป็น Flashdrive แล้วนั่งรอได้เลย ",[591,4079],{"alt":68,"src":4080},"/images/2025-08-26-xponology-on-old-pc/images-a68d5af0-d0c5-46e5-92f6-e5b6cb141946.jpg",[15,4082,4083],{},[591,4084],{"alt":68,"src":4085},"/images/2025-08-26-xponology-on-old-pc/images-dce47f43-fc8c-41e3-880b-ee970b3c54ce.jpg",[15,4087,4088],{},"เมื่อเสร็จแล้วสามารถนำไปเสียบกับ PC แล้วเลือกให้ Boot จาก Flashdrive ได้เลย (วิธีการขึ้นอยู่กับ Hardware โดยปกติก็เข้า bios แล้วปรับให้ boot จาก flashdrive ก่อนได้เลย)",[10,4090,4092],{"id":4091},"ติดตั้ง-xpenology","ติดตั้ง Xpenology",[15,4094,4095],{},"ของผมจะเป็น Mainboard ASUS เมื่อเข้ามา Bios ได้แล้วให้กด F8 แล้วเลือก Flashdrive",[15,4097,4098],{},[591,4099],{"alt":68,"src":4100},"/images/2025-08-26-xponology-on-old-pc/images-a9e1330c-551a-48b3-9be2-44cef6cfc9af.jpg",[15,4102,4103],{},"กด Arc Config Mode เพื่อเริ่มการตั้งค่าได้เลย (ผมเองก็ยังมือใหม่นะ ลองผิดลองถูกมาหลายรอบเหมือนกัน 5555)",[15,4105,4106],{},[591,4107],{"alt":68,"src":4108},"/images/2025-08-26-xponology-on-old-pc/images-684d99e1-c4dc-4992-929c-1f2c43c233d3.jpg",[15,4110,4111],{},"Choose Model",[15,4113,4114],{},[591,4115],{"alt":68,"src":4116},"/images/2025-08-26-xponology-on-old-pc/images-103a577d-9d02-497d-b32e-f0134880c992.jpg",[15,4118,4119],{},"ผมจะเลือกเป็น DS920+ (แนะนำให้เลือกเป็นตัวที่มี + จะทำอะไรได้เยอะกว่า)",[15,4121,4122],{},[591,4123],{"alt":68,"src":4124},"/images/2025-08-26-xponology-on-old-pc/images-4ec24e02-3a07-4e8d-9715-ade4c1fc5a13.jpg",[15,4126,4127],{},"ขั้นตอนนี้ผมจะเลือกเป็น No นะเพื่อดูการตั้งค่าเพิ่มเติม",[15,4129,4130],{},[591,4131],{"alt":68,"src":4132},"/images/2025-08-26-xponology-on-old-pc/images-50b1276f-aebd-4e3d-b2d8-c2e422ac2d65.jpg",[15,4134,4135],{},"เลือกเป็น \"Use random SN/Mac (Reduced DSM Features)\"",[15,4137,4138],{},[591,4139],{"alt":68,"src":4140},"/images/2025-08-26-xponology-on-old-pc/images-168b3668-464c-4bdc-b74a-55377d806109.jpg",[15,4142,4143],{},"ติดตั้ง Addons ผมจะเลือกเป็น default ไปเลยครับ",[15,4145,4146],{},[591,4147],{"alt":68,"src":4148},"/images/2025-08-26-xponology-on-old-pc/images-86186fc1-f851-4d02-b009-3ad9ca1bf2cb.jpg",[15,4150,4151],{},"ในส่วนของ Power option จะเลือกเป็น conservative ตามคำแนะนำเลย เพราะจะ balance ระหว่าง performance และการประหยัดไฟ แต่ถ้าใครอยากประหยัดไฟสุด ๆ ก็เลือกเป็น powersave ได้เหมือนกันนะ",[15,4153,4154],{},[591,4155],{"alt":68,"src":4156},"/images/2025-08-26-xponology-on-old-pc/images-7d83a70d-3bea-40d7-9c1a-1fcbc8417e19.jpg",[15,4158,4159],{},"ผมจะยังไม่ build ครับ จะไปแก้ไขการตั้งค่าเพิ่มเติมอีกนิด",[15,4161,4162],{},[591,4163],{"alt":68,"src":4164},"/images/2025-08-26-xponology-on-old-pc/images-adab944f-3d00-4f12-ab3c-cb24e08f2fee.jpg",[15,4166,4167],{},"จากนั้นผมจะ Format Disk ตัวหลักสำหรับลง OS ไป โดยเลือกในหัวข้อ \"Show Loader Options\" แล้วไปที่ \"Format Disks\"",[15,4169,4170],{},[591,4171],{"alt":68,"src":4172},"/images/2025-08-26-xponology-on-old-pc/images-9fa91ef7-7702-473e-afd2-9001bf83ea29.jpg",[15,4174,4175],{},"เลือก drive ที่ต้องการ format ในที่นี้ผมจะ format /dev/nvme0 นะครับ",[15,4177,4178],{},[591,4179],{"alt":68,"src":4180},"/images/2025-08-26-xponology-on-old-pc/images-ccd646d7-e3cb-4478-a9af-43162f3393c2.jpg",[15,4182,4183],{},"จากนั้นผมจะทำการ Clone bootloader จาก flashdrive ไปยัง SSD ที่ได้มีการ format ในขั้นตอนก่อนหน้า",[15,4185,4186],{},[591,4187],{"alt":68,"src":4188},"/images/2025-08-26-xponology-on-old-pc/images-972237ff-6eb8-4809-b141-86dd087ac4a2.jpg",[15,4190,4191],{},[591,4192],{"alt":68,"src":4193},"/images/2025-08-26-xponology-on-old-pc/images-a2e1e489-d07d-45c1-a477-aaf84a95f1cf.jpg",[15,4195,4196],{},"จากนั้นก็นั่งรอระบบทำการ Clone ให้ครับ",[15,4198,4199],{},[591,4200],{"alt":68,"src":4201},"/images/2025-08-26-xponology-on-old-pc/images-81d93c17-e52b-4e7c-ba52-f6a58d8a456e.jpg",[15,4203,4204],{},"เมื่อเสร็จแล้วก็ให้ถอด flashdrive ออกได้เลยย แล้วก็ reboot ได้เลยครับ",[15,4206,4207],{},[591,4208],{"alt":68,"src":4209},"/images/2025-08-26-xponology-on-old-pc/images-baf17eec-c164-4342-a35c-06d5f8d2fc14.jpg",[15,4211,4212],{},"ระบบจะ boot แล้วกลับมาหน้านี้ (อย่าลืมถอด flashdrive ก่อนนะ ไม่งั้นอาจจะยังเป็นการ boot จาก flashdrive อยู่)",[15,4214,4215],{},[591,4216],{"alt":68,"src":4217},"/images/2025-08-26-xponology-on-old-pc/images-55c9740c-54ab-4047-bf63-3d32566019f5.jpg",[15,4219,4220],{},"ถ้ายังใช้ไม่ได้ให้กด Arc Config Mode -> Build อีกทีดูนะครับ",[10,4222,4224],{"id":4223},"setup-synology","Setup Synology",[15,4226,4227,4228,4232],{},"เปิด Browser เข้าไปที่ ",[1831,4229,4230],{"href":4230,"rel":4231},"http://finds.synology.com/",[1835]," จากนั้นจะเจอกับ synology เครื่องใหม่ของเราครับ ตรง model name อาจจะยังไม่ตรงอยู่ไม่เป็นไร",[15,4234,4235],{},[591,4236],{"alt":68,"src":4237},"/images/2025-08-26-xponology-on-old-pc/images-f8a9ccd4-c797-4619-8fef-2f3ebcb2b754.jpg",[15,4239,4240],{},"จากนั้นก็ Next Next Next",[15,4242,4243],{},[591,4244],{"alt":68,"src":4245},"/images/2025-08-26-xponology-on-old-pc/images-53c51d89-810e-4606-8fb5-9a9764e17bd5.jpg",[15,4247,4248],{},[591,4249],{"alt":68,"src":4250},"/images/2025-08-26-xponology-on-old-pc/images-5d0ad6a6-f349-4b30-8e49-a72a2d74576c.jpg",[15,4252,4253],{},[591,4254],{"alt":68,"src":4255},"/images/2025-08-26-xponology-on-old-pc/images-466bd21f-e423-4a16-860c-f83d875cc79f.jpg",[15,4257,4258],{},"แล้วก็นั่งรอแบบ จ๊อง จ๊อง",[15,4260,4261],{},[591,4262],{"alt":68,"src":4263},"/images/2025-08-26-xponology-on-old-pc/images-fde692f4-1653-4fb8-a25d-45f786e58ea1.jpg",[15,4265,4266],{},[591,4267],{"alt":68,"src":4268},"/images/2025-08-26-xponology-on-old-pc/images-b0d91faa-8ab0-42b5-ba03-36dd055ec016.jpg",[15,4270,4271],{},[591,4272],{"alt":68,"src":4273},"/images/2025-08-26-xponology-on-old-pc/images-04e06b92-7e9c-498a-a82b-3d35afd09afa.jpg",[15,4275,4276],{},"ตรงนี้ก็ตั้ง user/password ได้เลย บาง step ผมจะข้าม ๆ ไปนะ ใช้ sense ได้เลยครับ",[15,4278,4279],{},[591,4280],{"alt":68,"src":4281},"/images/2025-08-26-xponology-on-old-pc/images-af6b4954-f9d3-4073-896d-35efcbf2acff.jpg",[15,4283,4284],{},"ต่อมาจะเป็นการตั้งค่า storage นะ",[15,4286,4287],{},[591,4288],{"alt":68,"src":4289},"/images/2025-08-26-xponology-on-old-pc/images-41946753-83ef-4480-b1c7-394b639a4540.jpg",[15,4291,4292],{},"โดยผมจะเลือกเป็น RAID 1 คือ 2 ลูก mirror กัน",[15,4294,4295],{},[591,4296],{"alt":68,"src":4297},"/images/2025-08-26-xponology-on-old-pc/images-a7392138-9df9-499e-8feb-3f4c0febc9f9.jpg",[15,4299,4300],{},[591,4301],{"alt":68,"src":4302},"/images/2025-08-26-xponology-on-old-pc/images-a7b843e5-fdf7-4fc6-905f-f385b3e7ca26.jpg",[15,4304,4305],{},"ขั้นตอนนี้จะเป็นการตรวจสอบสภาพของ HDD แนะนำให้ทำก่อนก็ดีครับ จะได้มั่นใจว่าข้อมูลจะไม่หาย",[15,4307,4308],{},[591,4309],{"alt":68,"src":4310},"/images/2025-08-26-xponology-on-old-pc/images-2df346bb-85da-430e-8746-fd2fe051f056.jpg",[15,4312,4313],{},"โดยความจุของ RAID 1 จะเป็นไปตามขนาดของ Disk ที่เล็กที่สุด ให้กดปุ่ม Max เพื่อตั้งค่าได้เลย",[15,4315,4316],{},[591,4317],{"alt":68,"src":4318},"/images/2025-08-26-xponology-on-old-pc/images-31528bb1-07aa-4938-919f-b54efcc45b23.jpg",[15,4320,4321],{},[591,4322],{"alt":68,"src":4323},"/images/2025-08-26-xponology-on-old-pc/images-f7f0e1e1-2a27-4835-91a5-3460b11d78fb.jpg",[15,4325,4326],{},"ตรงนี้แนะนำให้เปิด Disk Encryption ด้วยครับ",[15,4328,4329],{},[591,4330],{"alt":68,"src":4331},"/images/2025-08-26-xponology-on-old-pc/images-b5ee381d-566a-4e8c-9295-056fbd02ebe7.jpg",[15,4333,4334],{},"แล้วรอนั่งรอตัวระบบทำการตรวจสอบ Health ของ Disk ครับ",[15,4336,4337],{},[591,4338],{"alt":68,"src":4339},"/images/2025-08-26-xponology-on-old-pc/images-c1934bff-cdb7-47de-89ea-cfa4e381613b.jpg",[15,4341,4342],{},"เรียบร้อยแล้วครับ เพียงเท่านี้เราก็จะมี Synology ใช้บน Hardware ที่เราเลือกเองได้ ผิดถูกตรงไหนขออภัยด้วยครับ หวังว่าจะพอเป็นแนวทางให้ได้ หากต้องการใช้งานจริงจังแนะนำอ่าน Docs ของทาง Xpenology เพิ่มเติมจะได้ข้อมูลที่แม่นยำมากยิ่งขึ้นฮะ",[15,4344,4345],{},[591,4346],{"alt":68,"src":4347},"/images/2025-08-26-xponology-on-old-pc/images-12cdc78c-2d2e-4b00-9fac-a475d6b2404a.jpg",[10,4349,1825],{"id":1824},[417,4351,4352,4358],{},[420,4353,4354],{},[1831,4355,4356],{"href":4356,"rel":4357},"https://github.com/AuxXxilium/arc",[1835],[420,4359,4360],{},[1831,4361,4362],{"href":4362,"rel":4363},"https://xpenology.org/",[1835],{"title":68,"searchDepth":128,"depth":128,"links":4365},[4366,4367,4368,4369,4370,4371],{"id":3947,"depth":128,"text":3948},{"id":3960,"depth":128,"text":3961},{"id":4043,"depth":128,"text":4043},{"id":4091,"depth":128,"text":4092},{"id":4223,"depth":128,"text":4224},{"id":1824,"depth":128,"text":1825},"2025-08-26T00:00:00.000Z","แนะนำวิธีการลง Xpenology เพื่อสร้าง NAS บน PC",{},"How To Setup Xpenology","/blogs/2025-08-26-xponology-on-old-pc",{"title":3942,"description":4373},{"loc":4376},"blogs/2025-08-26-xponology-on-old-pc",[1896],"3qFHB1A3kyz-XtOwOmF_yNDqzP6UtfpcS0TBft88z1g",{"id":4383,"title":4384,"body":4385,"date":4486,"description":4487,"draft":1884,"extension":1885,"meta":4488,"navigation":131,"next":1887,"ogTitle":4489,"path":4490,"pin":1884,"prev":1887,"recommends":4491,"seo":4492,"sitemap":4493,"stem":4494,"tags":4495,"__hash__":4496},"content/blogs/2025-09-19-chuwi-minibook-x.md","Chuwi Minibook X Linux แบบพกพาง่าย",{"type":7,"value":4386,"toc":4481},[4387,4390,4395,4398,4402,4405,4416,4419,4422,4425,4430,4435,4449,4454,4465,4472,4475,4478],[15,4388,4389],{},"เบื่อไหมกับการที่ต้องพก Notebook ขนาดใหญ่ไปไหนมาไหนแล้วมันไม่สะดวก หรือจะเป็นการที่อยากได้ Notebook ขนาดเล็ก ๆ เอาไว้พกพาไปใช้งาน (ขำ ๆ) วันนี้ผมเจอ Notebook รุ่นนึงมานำเสนอครับ นั่นก็คืออออ \"Chuwi minibook X\" นั่นเอง",[15,4391,4392],{},[591,4393],{"alt":68,"src":4394},"/images/2025-09-19-chuwi-minibook-x/preview.jpg",[15,4396,4397],{},"เอาจริง ๆ ผมเองก็เพิ่งเคยได้ยินชื่อแบรนนี้เมื่อไม่กี่วันก่อนมาจากใน Reddit ครับ ด้วยความที่กำลังมองหา Notebook ขนาดเล็ก เอามาลง Linux เพื่อใช้งานตอนที่ไม่ได้จริงจังมาก ก็เลยได้ยินคนในกลุ่มแนะนำรุ่นนี้มา เลยลองมาหาข้อมูลดูก็พบว่ามีขายในไทยด้วย !!",[10,4399,4401],{"id":4400},"spec","Spec",[15,4403,4404],{},"สิ่งที่ทำให้ผมตัดสินใจซื้อคือตัว CPU ครับ ส่วนตัวผมเองชอบ CPU ตระกูล N ของ Intel อยู่แล้ว เช่น N95, N100, N150 ซึ่งเป็น CPU ที่ประหยัดพลังงาน แต่ก็ยังคงประสิทธิภาพไว้อยู่ (ผมมี Mini PC ที่เป็น N100 รันอยู่ปีกว่าแล้วครับนิ่ง ๆ เลย) โดย Notebook รุ่นนี้ที่ผมได้มาเป็น Spec",[417,4406,4407,4410,4413],{},[420,4408,4409],{},"CPU: N150",[420,4411,4412],{},"Ram: 16GB",[420,4414,4415],{},"SSD: 512GB",[15,4417,4418],{},"จริง ๆ Spec ลองไปดูใน website ก็ได้นะครับ ในส่วนอื่น ๆ อีกอย่างที่ผมชอบคือขนาดเพียง 10\" นิด ๆ แต่มี Keyboard + Trackpad มาให้ด้วย รุ่นนี้เป็นจอ Touch Screen พลิกกลับไปเป็น Tablet ได้ด้วยนะะ",[10,4420,4421],{"id":4421},"รีวิวส่วนตัว",[15,4423,4424],{},"จากที่ผมลองใช้งานมานะครับ ผมขอสรุปเป็นข้อดีข้อเสียดังนี้",[15,4426,4427],{},[591,4428],{"alt":68,"src":4429},"/images/2025-09-19-chuwi-minibook-x/btop.jpg",[15,4431,4432],{},[27,4433,4434],{},"ข้อดี",[417,4436,4437,4440,4443,4446],{},[420,4438,4439],{},"ขนาดเล็ก พกพาง่าย",[420,4441,4442],{},"CPU N150 ทำงานได้ค่อนข้างดี เหมาะกับงานที่ไม่ได้หนักมาก",[420,4444,4445],{},"มี Keyboard และ Trackpad ซึ่งความรู้สึกในการใช้งานคือดีเลย ไม่ก๊องแก๊ง",[420,4447,4448],{},"Port การเชื่อมต่อ Type-C ชาร์จได้ ต่อจอได้ (ผมลองเสียบกับจอ Dell ของผมที่เป็น Type C แบบ one-wire ใช้งานได้ปกติ)",[15,4450,4451],{},[27,4452,4453],{},"ข้อเสีย",[417,4455,4456,4459,4462],{},[420,4457,4458],{},"นิ้วเบียด พิมพ์ผิดบ่อย ด้วยความที่ keyboard ขนาดเล็กครับ ฝั่งซ้ายมันจะเล็ก (zone: Tab, Capslock, Shift) เลยทำให้จังหวะแรกที่พิมพ์ผมมักพิมพ์ผิดบ่อย ๆ",[420,4460,4461],{},"เครื่องร้อนง่าย (แต่พอเปลี่ยนซิริโคลนแล้วดีขึ้นนะครับ)",[420,4463,4464],{},"UI ตอน Boot จะบัค ถ้าเอามาลง Linux",[15,4466,4467,4468],{},"แต่โดยรวม ๆ ผมให้ 8/10 ครับ ตอนที่ตัดสินใจซื้อมาจริง ๆ แล้วก็ไม่ได้คาดหวังว่ามันจะออกมา perfect หรอกครับ แต่แค่นี้ผมก็รู้สึกไม่ผิดหวังแล้ว ราคาใน Shopee ปกติจะอยู่ที่ประมาณ 12XXX บาทครับ แต่ผมได้ช่วง Flash Sell + 9.9 มาเหลือประมาณ 89XX บาท (ถูกมากกก) ผมกดจากอันนี้ฮะ ",[1831,4469,4470],{"href":4470,"rel":4471},"https://s.shopee.co.th/qaEfmoOmu",[1835],[10,4473,4474],{"id":4474},"สุดท้าย",[15,4476,4477],{},"ความตั้งใจของผมคือเอาพกติดกระเป๋าเอาไว้ใช้งานตอนออกไปข้างนอก เผื่อต้อง remote ไปทำอะไรที่มันด่วน ๆ จะได้ทำได้เลย เพราะเครื่องนี้น้ำหนักประมาณ 1KG ครับ เบามาก ก่อนหน้านี้เคยลองซื้อ IPAD Mini 7 + Keyboard Case มา แต่ก็ไม่ไหวพกพาไม่สะดวกเลยครับ พอมาเจอตัวนี้ ง่ายขึ้นเยอะะะะ",[15,4479,4480],{},"ตัดสินใจลงเป็น Linux Ubuntu เอาไว้ ต้องมานั่ง Custom พอสมควรเลยเช่น Tablet mode, Touch Screen ใช้เวลาพอสมควรเลย แต่ก็สนุกดีครับ หาอะไรลองเล่นไปเรื่อยยยย ~",{"title":68,"searchDepth":128,"depth":128,"links":4482},[4483,4484,4485],{"id":4400,"depth":128,"text":4401},{"id":4421,"depth":128,"text":4421},{"id":4474,"depth":128,"text":4474},"2025-09-19T00:00:00.000Z","รีวิว Notebook พกพาขนาดเล็กกก เอามาเป็นเครื่องไว้ใช้งานสำหรับ Remote โดยการติดตั้ง Ubuntu Desktop",{},"Chuwi Miniboox X","/blogs/2025-09-19-chuwi-minibook-x",[2134,2133],{"title":4384,"description":4487},{"loc":4490},"blogs/2025-09-19-chuwi-minibook-x",[1896],"bpIjYUCXNmn4Z3vK8xjlA54X8jfJLr0dlJent9vCEcc",{"id":4498,"title":4499,"body":4500,"date":4576,"description":4577,"draft":1884,"extension":1885,"meta":4578,"navigation":131,"next":1887,"ogTitle":4579,"path":4580,"pin":1884,"prev":1887,"recommends":1887,"seo":4581,"sitemap":4582,"stem":4583,"tags":4584,"__hash__":4585},"content/blogs/2025-10-30-3d-printer-bambu-lab-a1.md","มือใหม่หัดเล่น 3D Printer (bambu lab a1) ปริ้นอะไรดี ?",{"type":7,"value":4501,"toc":4566},[4502,4506,4510,4518,4521,4525,4533,4536,4539,4547,4550,4554,4558],[10,4503,4505],{"id":4504},"แนะนำของที่ต้องมี-ด้วยการซื้อ","แนะนำของที่ต้องมี (ด้วยการซื้อ)",[10,4507,4509],{"id":4508},"_3d-printer-bambu-lab-a1","3D Printer Bambu Lab A1",[417,4511,4512],{},[420,4513,4514],{},[1831,4515,4516],{"href":4516,"rel":4517},"https://s.shopee.co.th/6psUuYdq3G",[1835],[15,4519,4520],{},"แนะนำตัวนี้เพราะว่า Plate มีขนาดถึง 26x26x26 เป็นขนาดที่พอเหมาะ ไม่เล็กและไม่ใหญ่จนเกินไป (ถ้าไปตัวเล็กกว่านี้จะพิมพ์อะไรได้น้อยกว่า)",[2155,4522,4524],{"id":4523},"เส้น-3d-esun-pla","เส้น 3D ESun PLA",[417,4526,4527],{},[420,4528,4529],{},[1831,4530,4531],{"href":4531,"rel":4532},"https://s.shopee.co.th/2g2vwxaUCS",[1835],[15,4534,4535],{},"ลองเปลี่ยนมาหลายรุ่นแล้ว สุดท้ายก็มาจบที่ตัวนี้ครับ (มี profile บน bambu lab ด้วยนะเอออ)",[2155,4537,4538],{"id":4538},"หัวพิมพ์สำรอง",[417,4540,4541],{},[420,4542,4543],{},[1831,4544,4545],{"href":4545,"rel":4546},"https://s.shopee.co.th/gHrZLuAGC",[1835],[15,4548,4549],{},"อันนี้ผมซื้อเอาไว้สำรองครับ เผื่อหัวหลักมีปัญหา เลยลองเอารุ่นทดแทนมาใช้ (ไม่ใช่ของแท้)",[10,4551,4553],{"id":4552},"ป้ายยา-model-3d-ที่เคยพิมพ์มา","ป้ายยา Model 3D ที่เคยพิมพ์มา",[2155,4555,4557],{"id":4556},"นกฮูกสำหรับวางแว่นสุด-cute","นกฮูกสำหรับวางแว่นสุด Cute",[417,4559,4560],{},[420,4561,4562],{},[1831,4563,4564],{"href":4564,"rel":4565},"https://makerworld.com/en/models/580423-owl-glasses-holder",[1835],{"title":68,"searchDepth":128,"depth":128,"links":4567},[4568,4569,4573],{"id":4504,"depth":128,"text":4505},{"id":4508,"depth":128,"text":4509,"children":4570},[4571,4572],{"id":4523,"depth":135,"text":4524},{"id":4538,"depth":135,"text":4538},{"id":4552,"depth":128,"text":4553,"children":4574},[4575],{"id":4556,"depth":135,"text":4557},"2025-10-30T00:00:00.000Z","รวบรวม Item และ Model ที่เคยพิมพ์จากที่เล่น 3D Printer มา",{},"Bambu Lab A1","/blogs/2025-10-30-3d-printer-bambu-lab-a1",{"title":4499,"description":4577},{"loc":4580},"blogs/2025-10-30-3d-printer-bambu-lab-a1",[1896],"Nqusvp0vg-I1ETIsU2iCHqsMNre3crVbX1khdI08uco",{"id":4587,"title":4588,"body":4589,"date":4638,"description":4639,"draft":1884,"extension":1885,"meta":4640,"navigation":131,"next":1887,"ogTitle":4641,"path":4642,"pin":1884,"prev":1887,"recommends":1887,"seo":4643,"sitemap":4644,"stem":4645,"tags":4646,"__hash__":4647},"content/blogs/2025-11-09-nanokvm-kvm.md","รีวิว nanokvm - kvm ขนาดเล็กพกพาง่าย",{"type":7,"value":4590,"toc":4636},[4591,4598,4603,4606,4609,4612,4615,4618,4623,4628,4631],[15,4592,4593,4594],{},"แวะมาป้ายยา item สำหรับสาย homelab ที่มีชื่อว่า nanovkm usb ",[1831,4595,4596],{"href":4596,"rel":4597},"https://wiki.sipeed.com/hardware/en/kvm/NanoKVM_USB/introduction.html",[1835],[15,4599,4600],{},[591,4601],{"alt":68,"src":4602},"/images/2025-11-09-nanokvm-kvm/nano_kvm_01.jpg",[15,4604,4605],{},"โดยความสามารถของอุปกรณ์ตัวนี้คือการเชื่อมสามารถใช้ type C 1 เส้น ในการแสดงผลภาพและส่ง mouse keyboard ของ macbook ไปยังเครื่องปลายทางได้ครับ",[15,4607,4608],{},"ฝั่ง Host: เสียบ type C 1 เส้นเข้ากับอุปกรณ์ เช่น notebook, macbook ได้เลย",[15,4610,4611],{},"ฝั่ง Target: เสียบ HDMI, USB เพื่อส่งภาพและ virtual mouse keyboard ไปยังเครื่องปลายทาง",[15,4613,4614],{},"โดยอุปกรณ์นี้ผมได้มาในราคาประมาณ 1200 บาท สามารถสั่งเว็บตรงของทางผู้ผลิตได้เลย ใช้เวลาจัดส่งประมาณ 2-3 สัปดาห์ครับ หลังจากได้ที่มาชอบมากกก เพราะทำให้ตอนที่ต้อง connect minipc, server, raspberry pi ไม่จำเป็นต้องเสียบหน้าจออีกต่อไป สามารถใช้ macbook ควบคุมได้เลย",[15,4616,4617],{},"จริง ๆ ยังมีอีกหลายรุ่นนะครับ แต่ผมกดรุ่นนี้มาเพราะรูปทรง + features เหมาะกับการใช้งานของผมพอดี",[15,4619,4620],{},[591,4621],{"alt":68,"src":4622},"/images/2025-11-09-nanokvm-kvm/nano_kvm_02.jpg",[15,4624,4625],{},[591,4626],{"alt":68,"src":4627},"/images/2025-11-09-nanokvm-kvm/nano_kvm_03.jpg",[15,4629,4630],{},"สามารถใช้งานผ่าน web browser ได้เลย",[15,4632,4633],{},[591,4634],{"alt":68,"src":4635},"/images/2025-11-09-nanokvm-kvm/nano_kvm_web.jpg",{"title":68,"searchDepth":128,"depth":128,"links":4637},[],"2025-11-09T00:00:00.000Z","เบื่อไหมกับการต้องเสียบจอ เมาส์ คีบอร์ด เมื่อต้องการเชื่อมต่อกับ mini pc?",{},"NanoKVM","/blogs/2025-11-09-nanokvm-kvm",{"title":4588,"description":4639},{"loc":4642},"blogs/2025-11-09-nanokvm-kvm",[1896],"4fY0ir4IUMCeLgjWtmevPt72MHKhjLb1QE6sqAl0MOU",1785765445166]