EST. 2026 — บันทึกงานเซิร์ฟเวอร์จริง SYSADMIN · SECURITY · AI · DIRECTADMIN เล่มที่ 01
THE SYSADMIN ALMANAC
หน้าหลัก / แท็ก / Deployment
Deployment

#Deployment

15 บทความ
Workflow
ส่งไฟล์ขึ้นโฮสต์แล้วทับกันเงียบๆ สามกับดักตอนคัดลอกไฟล์
Linux

ส่งไฟล์ขึ้นโฮสต์แล้วทับกันเงียบๆ สามกับดักตอนคัดลอกไฟล์

ส่งไฟล์สองตัวที่ชื่อซ้ำกันขึ้นโฮสต์พร้อมกัน ตัวหลังทับตัวแรกเงียบๆ ไม่มี error ไม่มี exit code ผิด เว็บยังตอบ 200 ทุกหน้า แค่หน้าภาษาอังกฤษกลายเป็นหน้าภาษาไทย นี่คือสามกับดักที่ทำให้การคัดลอกไฟล์เสียหายโดยไม่มีอะไรเตือน

#deployment#pscp#plink#putty
อ่าน 8 นาที·24 ต.ค.
Build APM บน Windows: สารบัญ ทำ Apache + PHP 8.4 + MariaDB เอง
Web

Build APM บน Windows: สารบัญ ทำ Apache + PHP 8.4 + MariaDB เอง

ซีรีส์ 7 ตอนพาคอมไพล์ Apache 2.4.69, PHP 8.4.27 และ MariaDB 11.8.9 บน Windows 11 จาก source เอง ให้เวลาที่ PHP ออกแพตช์ความปลอดภัย แก้เลขเวอร์ชันในไฟล์เดียวแล้ว build ใหม่ได้ภายในวัน หน้านี้คือสารบัญ ภาพรวม เวลา ดิสก์ และทางลัดสามคำสั่ง

#devops#php#apache#mariadb
อ่าน 9 นาที·22 ต.ค.
Build APM บน Windows ตอนที่ 7: Deploy รัน และอัปเดต security patch
Web

Build APM บน Windows ตอนที่ 7: Deploy รัน และอัปเดต security patch

ตอนจบของซีรีส์ build Apache + PHP + MariaDB บน Windows ติดตั้งลง C:\APM สตาร์ตครั้งแรกและทดสอบ เปิดให้เครื่องใน LAN เข้าแบบปลอดภัย เล่าบั๊กจริงหกตัว (PidFile, plugin MariaDB, พอร์ต DB, ASLR 500, พาธมีช่องว่างและวงเล็บ) และขั้นตอนอัปเดตเวลามี security release ใหม่

#devops#windows#apache#php
อ่าน 20 นาที·22 ต.ค.
Build APM บน Windows ตอนที่ 5: คอมไพล์ ImageMagick 7 ให้ PHP imagick
Web

Build APM บน Windows ตอนที่ 5: คอมไพล์ ImageMagick 7 ให้ PHP imagick

ตอนที่ 5 ของซีรีส์ Build APM บน Windows พาคอมไพล์ ImageMagick 7.1.2-34 กับ delegate library ราว 40 ตัวจาก source ด้วย toolchain ทางการ พร้อมแพตช์ channel mask 64 เป็น 32 ที่ทำให้ imagick build ผ่าน และเหตุผลที่ HEIC เขียนไม่ได้

#windows#php#devops#powershell
อ่าน 14 นาที·22 ต.ค.
Build APM บน Windows ตอนที่ 1: เตรียมเครื่องมือและแตก build kit
Web

Build APM บน Windows ตอนที่ 1: เตรียมเครื่องมือและแตก build kit

ตอนแรกของซีรีส์ build Apache + PHP 8.4 + MariaDB เองบน Windows ติดตั้ง Visual Studio 2022 Build Tools พร้อม component ที่จำเป็น Git CMake Ninja PowerShell 7 ตั้ง Defender แตก build kit ลง C:\apm-build แล้วไล่ดูโฟลเดอร์ versions.json และสคริปต์ lib.ps1 กับ build-all.ps1 ทีละบรรทัด

#windows#devops#powershell#cpp
อ่าน 14 นาที·22 ต.ค.
ฟอร์มแจ้งปัญหาบนเว็บ static ที่ไม่มีแบ็กเอนด์สักตัว
Web

ฟอร์มแจ้งปัญหาบนเว็บ static ที่ไม่มีแบ็กเอนด์สักตัว

เว็บคำนวณที่เป็นไฟล์นิ่งล้วน ไม่มีเซิร์ฟเวอร์ให้รับฟอร์ม แต่ยังต้องมีช่องให้คนใช้แจ้งว่าสูตรผิดตรงไหน บทความนี้คือเส้นทางเดียวที่ผมเลือกใช้ คือ worker ไฟล์เดียวที่รับ POST เส้นทางเดียว ตรวจ Turnstile ฝั่งเซิร์ฟเวอร์ด้วยไอพีจริง รับรูปที่ผู้ใช้กดวางจากคลิปบอร์ด แล้วยิงเมลออกจากขอบเครือข่าย พร้อมกับดักสามอย่างที่กินเวลาผมไปทั้งคืน

#cloudflare#static-site#javascript#web-security
อ่าน 9 นาที·21 ต.ค.
เว็บสองภาษา 26 หน้า ทำไมต้องกลายเป็น .php แล้วลิงก์พังทั้งเว็บ
Web

เว็บสองภาษา 26 หน้า ทำไมต้องกลายเป็น .php แล้วลิงก์พังทั้งเว็บ

หน้าโปรดักชันโชว์แท็ก PHP เป็นตัวหนังสือดิบ เพราะเว็บเซิร์ฟเวอร์เสิร์ฟ .html เป็นไฟล์ static พอเปลี่ยนทั้ง 26 หน้าเป็น .php ลิงก์ก็พังทั้งเว็บ แล้วพอทำ clean URL ต่อหน้าย่อยก็เด้งกลับเป็น .php เพราะ rewrite กับ 301 ทำครึ่งเดียว บทความนี้คือ .htaccess เต็ม กติกา $base แปดกรณี และสคริปต์ที่ทำทีเดียวทั้งเว็บ

#htaccess#apache#nginx#php
อ่าน 9 นาที·19 ต.ค.
หน้าเว็บว่างเปล่า ไม่มี error สักบรรทัด เพราะตั้งชื่อฟังก์ชันว่า top
Web

หน้าเว็บว่างเปล่า ไม่มี error สักบรรทัด เพราะตั้งชื่อฟังก์ชันว่า top

deploy ขึ้นไปแล้วหน้าว่าง ไม่มี error ในล็อก ไม่มีอะไรผิดใน node --check แต่เบราว์เซอร์ฆ่าทั้งสคริปต์ตั้งแต่บรรทัดแรกเพราะมีฟังก์ชันชื่อ top ไปชนกับ window.top พร้อมรายชื่อที่ต้องเลี่ยง กับดักลำดับการโหลดสคริปต์ และด่านตรวจด้วย Playwright ที่ควรมีทุกโปรเจกต์

#javascript#debugging#troubleshooting#playwright
อ่าน 8 นาที·18 ต.ค.
deploy แล้วเว็บไม่อัปเดต — ไล่แคชห้าชั้นให้จบในครั้งเดียว
DirectAdmin

deploy แล้วเว็บไม่อัปเดต — ไล่แคชห้าชั้นให้จบในครั้งเดียว

อัปไฟล์ขึ้นแล้ว เปิดดูยังเป็นของเก่า กด Ctrl+F5 ก็ยังเก่า — เพราะระหว่างไฟล์บนดิสก์กับสิ่งที่คนเห็นมีแคชคั่นอยู่ห้าชั้น แต่ละชั้นล้างคนละวิธี บทความนี้คือลำดับล้างที่ผมใช้ประจำ พร้อมกับดักที่ทำให้เว็บ 500 ค้างหลังสั่งล้าง view cache

#deployment#laravel#php#php-fpm
อ่าน 10 นาที·8 ต.ค.
route:cache แล้วทุก GET กลายเป็น 405 — กับดักแอปใต้ sub-path
DirectAdmin

route:cache แล้วทุก GET กลายเป็น 405 — กับดักแอปใต้ sub-path

deploy เสร็จ กด optimize ตามคู่มือ แล้วทุกหน้าตอบ 405 Method Not Allowed ทั้งที่ route:list ยืนยันว่า route ถูกต้อง — เรื่องของ route cache ที่พังเฉพาะบางเครื่อง วิธีแยกให้ขาดใน 30 วินาที และของแถมอีกสามอย่างที่เจอพร้อมกันตอนเอาแอปไปวางใต้ sub-path

#laravel#php#deployment#apache
อ่าน 9 นาที·7 ต.ค.
php -l ผ่าน แต่หน้าเว็บ 500 — ประตูตรวจก่อน commit ที่คอมไพล์จริง
Linux

php -l ผ่าน แต่หน้าเว็บ 500 — ประตูตรวจก่อน commit ที่คอมไพล์จริง

เทมเพลตพังสองรอบในเดือนเดียวทั้งที่ php -l ผ่านหมด เพราะ php -l ไม่รู้จักไวยากรณ์ของ Blade บทความนี้คือประตูตรวจ 6 ด่านที่ผมวางไว้ก่อน commit — คอมไพล์ view จริงแล้ว lint ไฟล์ที่คอมไพล์ออกมาซ้ำอีกชั้น พร้อมสคริปต์กวาด GET ทุก route ผ่าน Kernel

#laravel#php#blade#testing
อ่าน 9 นาที·7 ต.ค.
โค้ดชุดเดียวสองบทบาท เว็บอยู่โฮสต์ worker อยู่เครื่องที่บ้าน
Linux

โค้ดชุดเดียวสองบทบาท เว็บอยู่โฮสต์ worker อยู่เครื่องที่บ้าน

ระบบทั้งตัวเคยวิ่งอยู่บนเครื่องเดียวหลังเน็ตบ้าน เครื่องดับทีเดียวทีมใช้อะไรไม่ได้เลย ผมเลยแยกเป็นสองบทบาทด้วยโค้ดชุดเดิม — เว็บอยู่โฮสต์ที่เปิดตลอด งานหนักอยู่เครื่องที่บ้านแล้ววิ่งมาดึงงานเอง พร้อมตาราง claim แบบ atomic และแผนสลับ 18 ขั้นที่มีทางถอย

#laravel#php#queue#worker
อ่าน 12 นาที·6 ต.ค.
งานอัตโนมัติหยุดส่งรูป 4 วัน เพราะ subprocess เลือก ssh ตาม PATH
Linux

งานอัตโนมัติหยุดส่งรูป 4 วัน เพราะ subprocess เลือก ssh ตาม PATH

เขียน subprocess.run(["ssh", ...]) แล้วปล่อยให้ระบบเลือกไบนารีตาม PATH ของคนเรียก วันหนึ่งคนเรียกเปลี่ยน ไบนารีเปลี่ยนตาม งานส่งไฟล์ตายเงียบ 4 วันโดยรายงานว่าสำเร็จทุกครั้ง บทความนี้คือวิธีจับอาการ และตัวช่วยที่ probe ไบนารีจริงก่อนใช้ พร้อมด่านตรวจความครบก่อนบอกว่าเสร็จ

#ssh#python#automation#scp
อ่าน 9 นาที·21 ก.ย.
โฮสต์ static บน DirectAdmin แล้ว GET ได้ 404 แต่ HEAD ได้ 200
DirectAdmin

โฮสต์ static บน DirectAdmin แล้ว GET ได้ 404 แต่ HEAD ได้ 200

อัปเว็บ static ขึ้น public_html แล้วเปิดไม่ได้ ไฟล์เล็กออกปกติ ไฟล์ใหญ่ 404 แต่ยิง HEAD กลับได้ 200 ทุกไฟล์ ต้นเหตุคือ .htaccess ของ Laravel ที่นั่งอยู่ที่ docroot ดูดทุกอย่างเข้า front controller บทความนี้เล่าทั้งการวินิจฉัยและทางออกสามทาง

#directadmin#cloudflare#apache#htaccess
อ่าน 9 นาที·14 ก.ย.
เขียนสคริปต์บน Windows ไปรันบน Linux — สองกับดักที่ทำไฟล์ค้างเซิร์ฟเวอร์
Linux

เขียนสคริปต์บน Windows ไปรันบน Linux — สองกับดักที่ทำไฟล์ค้างเซิร์ฟเวอร์

เขียน helper script บน Windows แล้ว scp ขึ้นไปรันบน Linux เป็นงานประจำ แต่มีสองอย่างที่กัดซ้ำ ๆ — path แบบ d:\ ที่ฝังในสคริปต์กลายเป็นชื่อไฟล์ประหลาดใน /tmp จนโดน file monitor จับ และไฟล์ token/payload ที่ลืมลบทิ้งไว้บนเซิร์ฟเวอร์ บทความนี้สรุปกฎกันพลาด

#automation#windows#linux#sysadmin
อ่าน 6 นาที·16 ก.ค.