แนวทางที่เสนอคือใช้ตัวตั้งเวลาของโฮสต์ ปักหมุด image ด้วย digest บันทึกสถานะการอัปเดต และเก็บ image เก่าไว้สำหรับ rollback โดยไม่เพิ่ม update container จะอัปเดตเฉพาะบริการ gateway ไม่แตะบริการอีเมล แต่การสร้างคอนเทนเนอร์ gateway ใหม่ยังอาจทำให้เกิดช่วงสะดุดและไม่รับประกันว่าจะรักษาคำขอที่กำลังดำเนินอยู่ การตรวจ dige...
เผยแพร่โดยรูปภาพสร้างด้วย GPT Image 2
คำตอบการวิจัย
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
โจทย์ของการอัปเดตบริการบน VPS ไม่ได้มีแค่การดึง image ใหม่ แต่ต้องตอบให้ได้ด้วยว่า ถ้า image มีปัญหา จะกลับไปใช้รุ่นเดิมอย่างไรโดยไม่ไปกระทบบริการอื่น
ข้อเสนอในที่นี้คือใช้ ตัวตั้งเวลาของ Linux ที่เครื่องโฮสต์ + image ที่ระบุด้วย digest + สถานะธุรกรรมที่บันทึกถาวร + image เก่าสำหรับ rollback โดยไม่เพิ่มคอนเทนเนอร์สำหรับอัปเดต วิธีนี้ออกแบบให้เปลี่ยนเฉพาะ gateway และไม่แตะบริการอีเมล แต่ยังไม่ใช่การรับประกัน uptime: การสร้างคอนเทนเนอร์ gateway ใหม่อาจทำให้บริการสะดุด และไม่รับประกันว่าคำขอหรือสตรีมที่กำลังทำงานจะจบโดยไม่ขาดตอน
สถานะสำคัญ: ข้อความนี้เป็นแบบร่างและสัญญาการทำงานสำหรับการพัฒนาต่อ ยังไม่ได้สร้างหรือเขียนไฟล์ ไม่ได้รันทดสอบ และไม่ได้เข้าไปดำเนินการบน VPS ต่างพื้นที่ทั้งสองเครื่อง
จากการตรวจข้อมูลของโปรเจกต์ เวิร์กโฟลว์เผยแพร่รับแท็กในรูปแบบเวอร์ชัน เช่น v3.12 และเผยแพร่แท็ก latest, 3.12, v3.12 และ short SHA แต่ไม่ได้ตั้งแท็ก alias สำหรับสายเวอร์ชันอย่าง v3.x โดยอัตโนมัติ การกำหนดสถาปัตยกรรมหลายแบบในเวิร์กโฟลว์ก็ยังไม่ใช่หลักฐานว่าการเผยแพร่แต่ละครั้งสำเร็จแล้ว (.github/workflows/build_docker.yml:19)
การตั้งค่าปัจจุบันใช้การ build จากซอร์สสำหรับ gateway ผูกพอร์ตเฉพาะบนเครื่องที่พอร์ต 8080 และเมานต์ไดเรกทอรีคอนฟิกแบบอ่านอย่างเดียว ส่วนบริการอีเมลเก็บข้อมูลไว้ในหน่วยความจำ จึงควรถือว่าการไม่รีสตาร์ตคอนเทนเนอร์อีเมลเป็นเงื่อนไขสำคัญ (docker-compose.yml:1)
อีกจุดที่ต้องระวังคือ image ที่เผยแพร่ใช้ entry point ระดับราก และตอนเริ่มทำงานต้องอาศัยไฟล์คอนฟิกทะเบียนโมเดลในเครื่อง ขณะที่ตัว image ไม่ได้บรรจุไดเรกทอรีคอนฟิกนั้นไว้ ดังนั้น VPS ยังต้องมีไฟล์คอนฟิกที่ถูกต้อง ไม่ใช่แค่ดึง image ใหม่มาเท่านั้น (Dockerfile:13, main.go:21)
ส่วน endpoint ที่มีอยู่ก็ยังไม่พอสำหรับยืนยันว่าระบบใช้งานได้ครบ: ตัวจัดการรายการโมเดลอ่าน snapshot จากทะเบียน ไม่ได้ส่งคำขอแชตจริง และ health endpoint ตอบสถานะการมีชีวิตแบบคงที่ จึงใช้ยืนยันความพร้อมของบัญชี upstream หรือการแชตจริงไม่ได้ (internal/api/models.go:23, internal/api/chat.go:2078)
สุดท้าย แอปยกเลิก context ของเซิร์ฟเวอร์เมื่อได้รับสัญญาณปิด และมีช่วงเวลาปิด HTTP ห้าวินาที การเพิ่มเวลารอหยุดคอนเทนเนอร์เพียงอย่างเดียวจึงไม่รับประกันว่าสตรีมยาวจะจบครบ (main.go:233)
สคริปต์ที่เสนอคือ scripts/auto-update.sh แต่ยังไม่ได้สร้างจริง โดยจะทำงานจากบัญชีที่ได้รับการปกป้องบนโฮสต์และเรียก Docker โดยตรง ไม่ส่ง Docker socket หรือข้อมูลรับรอง registry เข้าไปในคอนเทนเนอร์ อย่างไรก็ตาม บัญชีที่จัดการ Docker ยังคงมีสิทธิ์สูงบนโฮสต์ การไม่เมานต์ socket เข้า container ไม่ได้ลบความเสี่ยงจากสิทธิ์ผู้ดูแลระบบของบัญชีนั้น
ก่อนเริ่มงาน สคริปต์ควรขอล็อกไฟล์แบบไม่รอ หากมีการอัปเดต กู้คืน หรือเก็บกวาดงานอื่นถือครองล็อกอยู่ ให้จบโดยไม่ทำอะไร ล็อกเดียวกันนี้ต้องครอบคลุมการเริ่มต้น การกู้คืน และการลบ image เก่าด้วย เพื่อป้องกันงานชนกัน
จากนั้นจึงตรวจสถานะธุรกรรมที่ค้างจากรอบก่อน ก่อนจะติดต่อ registry และตรวจให้แน่ใจว่า Compose project, คอนเทนเนอร์ gateway, ลายนิ้วมือคอนฟิก และคอนเทนเนอร์อีเมลยังตรงกับค่าที่คาดไว้ หากพบว่ามีคนแก้สถานะหรือคอนฟิกเอง สคริปต์ควรหยุดและแจ้งเหตุ ไม่ควรเข้ายึดระบบโดยพลการ
แท็กอย่าง latest ใช้ค้นหาว่ามีรุ่นใหม่หรือไม่ แต่การนำไป deploy ควรอ้าง image ด้วย digest ที่แน่นอน รูปแบบ image ใน Compose รองรับการระบุ digest ได้ 1 ทั้งนี้ต้องเก็บค่าคนละชนิดแยกกัน ได้แก่ digest ของ multi-platform index, digest ของ manifest สำหรับแพลตฟอร์มที่ใช้งาน และ Docker image ID ในเครื่อง เพราะไม่ใช่ค่าที่นำมาเปรียบเทียบแทนกันได้
หากการตรวจ manifest มีปัญหา เช่น เครือข่ายล่ม การยืนยันตัวตนผิด หรือข้อมูลอ่านไม่ได้ ให้คงบริการรุ่นเดิมไว้ ห้ามตีความ digest ว่างว่าเป็นรุ่นใหม่ และหาก digest ตรงกับรุ่นที่ผ่านการตรวจรับแล้ว สคริปต์ไม่ควร pull ไม่ควรสร้างคอนเทนเนอร์ใหม่ และไม่ควรเขียนบันทึกว่าเกิดการอัปเดต
สถานะธุรกรรมควรเก็บ image อ้างอิงเก่าและใหม่, image ID, ID ของคอนเทนเนอร์เดิม, ลายนิ้วมือคอนฟิก และขั้นตอนล่าสุดที่ทำสำเร็จ ข้อมูลควรเขียนลงไฟล์ชั่วคราวในไดเรกทอรีเดียวกันแล้วแทนที่แบบ atomic พร้อมทำให้ข้อมูลไฟล์และไดเรกทอรีถูกบันทึกอย่างเหมาะสม การเปลี่ยนชื่อไฟล์อย่างเดียวไม่ใช่หลักประกันว่าข้อมูลจะอยู่ครบหลังไฟดับ
คำสั่ง Compose ที่ใช้ควรจำกัดเป้าหมายไว้ที่ gateway โดยไม่ build ไม่เริ่ม dependency และไม่ pull เพิ่มระหว่างสลับ --no-build, --no-deps และ --pull never ช่วยควบคุมพฤติกรรมเหล่านี้ได้ 2 แต่ต้องไม่ใช้คำสั่งที่รีสตาร์ตทั้งโปรเจกต์ ลบบริการ orphan หรือหยุดทุกคอนเทนเนอร์
การสั่งงานที่ timeout ก็ไม่ได้แปลว่ากระบวนการเบื้องหลังของ Docker หยุดแล้ว หากคำสั่งหมดเวลา ต้องตรวจสถานะคอนเทนเนอร์จริงและประสานสถานะการกู้คืนก่อนเริ่มสลับอีกรอบ ส่วนกรณีถูก kill หรือไฟดับจะพึ่ง exit trap ไม่ได้ การกู้คืนจึงต้องอาศัยธุรกรรมที่บันทึกไว้ และตรวจทำก่อนเริ่มอัปเดตรอบถัดไป
ค่าเริ่มต้นที่เสนอเพื่อเริ่มทดสอบคือช่วงตรวจรวม 60 วินาที, timeout การเชื่อมต่อ 1 วินาที, จำกัดเวลาคำขอ 3 วินาที, ตรวจทุก 2 วินาที และต้องผ่านต่อเนื่องสามครั้ง ตัวเลขเหล่านี้เป็นค่าเริ่มต้นสำหรับทดลอง ไม่ใช่ผลการวัดจริง
การตรวจควรเรียก model directory บนเครื่องและต้องได้ HTTP 200 โดยไม่ตาม redirect พร้อมตรวจโครงสร้าง JSON เพื่อไม่ให้หน้า login หรือหน้า error จาก proxy ถูกนับว่าผ่าน นอกจากนี้ต้องตรวจว่าคอนเทนเนอร์ gateway ใช้ image รุ่นที่กำลังทดสอบ และไม่มีอาการ restart เพิ่มต่อเนื่อง เพื่อป้องกันกรณีที่คำตอบมาจากโปรเซสเก่า
ไม่ควรกำหนดจำนวนโมเดลขั้นต่ำจากตัวเลขในอดีตโดยไม่ตรวจสัญญาของทะเบียนปัจจุบัน และไม่ควรส่งคำขอแชตจริงอัตโนมัติหากคำขอนั้นใช้โควตาหรือมีค่าใช้จ่าย การยืนยันว่าใช้งานธุรกิจได้จริงจึงยังต้องเป็นการตรวจอีกชั้นหนึ่ง
การปรับ Compose ควรทำกับสำเนาสำหรับ deployment บน VPS เท่านั้น ไม่แก้ไฟล์สำหรับพัฒนาบนเครื่องโดยไม่จำเป็น ให้เปลี่ยนเฉพาะแหล่ง image ของ gateway และคงพอร์ต ข้อจำกัดหน่วยความจำ logging ตัวแปรแวดล้อม เมานต์คอนฟิกแบบอ่านอย่างเดียว และการตั้งค่าบริการอีเมลเดิมไว้ (docker-compose.yml:26)
ตัวอย่างเฉพาะส่วนที่เสนอให้เปลี่ยน:
services:
app:
image: "${APP_IMAGE:?ต้องระบุ image ที่ตรึงไว้แล้ว}"
pull_policy: never
นี่เป็นเพียงส่วนสำหรับแทนที่ ไม่ใช่ Compose file ฉบับสมบูรณ์ ไดเรกทอรี deployment ยังต้องมีคำจำกัดความบริการเดิมครบ และต้องเอาส่วน build ของ gateway ออกด้วย ค่า image ที่บันทึกไว้ควรเป็น digest ที่ผ่านการตรวจรับแล้ว หรือแท็ก image เก่าสำหรับ rollback ไม่ใช่ latest ที่อาจเปลี่ยนไปเมื่อมีการสั่งเริ่มบริการด้วยมือ
ก่อนติดตั้งต้องยืนยันชื่อ Compose project ที่ใช้อยู่จริง เพราะการเดาชื่อผิดอาจทำให้เกิด network ใหม่หรือเปลี่ยนความสัมพันธ์กับบริการอีเมล รวมถึงตรวจค่าตัวแปรแวดล้อมบนเครื่องจริงด้วย การใส่ค่าไว้ในไฟล์สำหรับ Compose interpolation ไม่ได้แปลว่าค่านั้นจะถูกส่งเข้า environment ของคอนเทนเนอร์โดยอัตโนมัติ
ข้อมูลในโปรเจกต์ระบุว่าคอนฟิกปัจจุบันเปิดใช้ experimental features สองรายการ ขณะที่ขอบเขตข้อเท็จจริงของโปรเจกต์ระบุให้คงค่าเริ่มต้นที่ปิดไว้สำหรับบางส่วน งานอัปเดตนี้จึงไม่ควรเปลี่ยนสวิตช์เหล่านั้นเอง และต้องตรวจค่าบน VPS จริงก่อน (docker-compose.yml:38, _bmad-output/project-context.md:246) หาก image ใหม่ต้องการการย้ายคอนฟิกที่ย้อนกลับไม่ได้ ควรหยุดการเผยแพร่อัตโนมัติจนกว่าจะมีแผน migration ที่กู้คืนได้
หาก image ใน GitHub Container Registry (GHCR) เป็น private การดึง image ต้องยืนยันตัวตน โดยเอกสาร GitHub ระบุการใช้ personal access token แบบ classic และกำหนด scope ตามสิทธิ์ที่ต้องการ 9 สำหรับงานนี้ควรใช้บัญชีที่อ่าน package ได้และให้สิทธิ์
read:packages เท่าที่จำเป็น ตรวจด้วยว่าบัญชีมีสิทธิ์เข้าถึง package จริง และดำเนินการ SSO หากองค์กรกำหนด
แนวทางคือใช้ credential แยกสำหรับ VPS แต่ละเครื่อง ส่งให้ Docker login ผ่าน standard input ไม่ใส่ token ใน argument ของคำสั่งหรือ audit log และเก็บ Docker config ในไดเรกทอรีเฉพาะที่ผู้ดูแลระบบอ่านได้เท่านั้น เครื่องมืออ่าน manifest และ Docker pull ต้องใช้ข้อมูลยืนยันตัวตนที่ตรวจสอบแล้วชุดเดียวกัน ห้ามส่ง token ให้คอนเทนเนอร์ gateway หรืออีเมล และควรวางแผนวันหมดอายุ การแจ้งเตือน และการเพิกถอนให้ชัดเจน หากยืนยันตัวตนไม่ได้ ให้หยุดอัปเดตและคงบริการเก่าไว้
ตัวเลือกหลักคือ systemd timer แบบ native ของ Linux โดยตั้งให้ทำงานหนึ่งนาทีหลังบูต และเริ่มนับรอบใหม่หลังงานก่อนหน้าจบ ตัวอย่างต่อไปนี้เป็นแบบร่าง ยังไม่ได้ติดตั้ง:
[Unit]
Description=Aurora image update and recovery
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
WorkingDirectory=/opt/aurora
Environment=DOCKER_CONFIG=/etc/aurora-updater/docker
ExecStart=/opt/aurora/scripts/auto-update.sh
TimeoutStartSec=20min
UMask=0077
Nice=10
IOSchedulingClass=idle
NoNewPrivileges=yes
StandardOutput=journal
StandardError=journal
[Unit]
Description=Aurora scheduled image check
[Timer]
OnBootSec=1min
OnUnitInactiveSec=5min
RandomizedDelaySec=30s
AccuracySec=1s
Unit=aurora-update.service
[Install]
WantedBy=timers.target
ก่อนเปิด timer ต้องติดตั้ง dependency ตรวจคอนฟิก สร้าง image เก่าที่สุขภาพดีเป็นจุดยึด และซ้อมขั้นตอนกู้คืนในสภาพแวดล้อมที่ได้รับอนุญาตก่อน ควรตั้งเวลาของ VPS สองเครื่องให้เหลื่อมกัน เพื่อลดโอกาสที่ทั้งคู่จะดึง image พร้อมกันหรือได้รับผลกระทบจากรุ่นที่มีปัญหาพร้อมกัน
การตั้งรอบตรวจหมายถึงระบบจะค่อย ๆ ตามให้ทัน ไม่ใช่การสลับพร้อมกันแบบ atomic หากเครื่องหนึ่ง rollback แล้วใช้รุ่นเก่าต่อชั่วคราว นั่นเป็นพฤติกรรมที่ปลอดภัยกว่าการฝืน deploy digest ที่ล้มเหลว ส่วนการลด priority ของตัวอัปเดตไม่ได้จำกัดการใช้ CPU ของ Docker daemon ระหว่างแตก image จึงต้องทดสอบบนเครื่องเป้าหมายที่สเปกต่ำจริง
คำว่าเงียบในที่นี้หมายถึงไม่สร้าง log ธุรกิจหรือประวัติอัปเดตเมื่อไม่มีอะไรเปลี่ยน แต่ systemd อาจยังบันทึกเหตุการณ์เริ่มและจบ service ตามปกติ
บันทึกควรมีเวลา UTC, รหัสเครื่อง, transaction ID, digest เก่าและใหม่, ขั้นตอนที่ทำ, ระยะเวลา, ผล health check และผล rollback ห้ามบันทึก credential, environment ทั้งชุด, ข้อมูลบัญชีอีเมล หรือเนื้อหา response
ข้อเสนอสำหรับ log เฉพาะตัวอัปเดตคือหมุนไฟล์รายสัปดาห์ หมุนก่อนกำหนดเมื่อเกิน 1 MB และบีบอัดเก็บ 26 ชุด แต่ควรยืนยันนโยบายเก็บข้อมูลก่อนนำไปใช้ ไม่ควรเปลี่ยนนโยบาย log ระดับโฮสต์ทั้งระบบ
การเก็บกวาด image ควรทำรายสัปดาห์และลบเฉพาะ image เก่าที่ตัวอัปเดตลงทะเบียนว่าเป็นเจ้าของ โดยใช้ transaction lock เดียวกัน ห้ามลบ image ปัจจุบัน รุ่นที่ผ่านการตรวจรับก่อนหน้า และ image ที่เกี่ยวข้องกับธุรกรรมที่ยังไม่จบ ก่อนลบต้องตรวจด้วยว่าไม่มีคอนเทนเนอร์หรือแท็กสำหรับใช้งานอื่นอ้างถึง image นั้น
สำหรับ image เก่าที่เกินระยะเก็บรักษาเบื้องต้น 14 วัน ให้เอาแท็กสำรองของตัวอัปเดตออกก่อน แล้วจึงลองลบแบบไม่บังคับ หากลบไม่สำเร็จให้เก็บไว้และบันทึกเหตุ ห้ามใช้การลบแบบ force และอย่าคิดว่า image ที่ Docker แสดงเป็น dangling จะไม่มีใครตั้งใจเก็บไว้เป็นจุด rollback หากพื้นที่ดิสก์ไม่พอก่อน pull ให้ยกเลิกอัปเดต ไม่ใช่ลบจุดกู้คืนเพียงชุดเดียวเพื่อฝืนทำต่อ
ควรเดินงานเป็นสี่ช่วง: ตรวจข้อเท็จจริงของ VPS ทั้งสองเครื่องและสร้างจุดกู้คืนเริ่มต้น, พัฒนาตัวอัปเดตพร้อมจำลองกรณีล้มเหลว, เพิ่ม timer และงานดูแล log/image, แล้วจึงทำ canary ทีละเครื่อง เมื่อเครื่องแรกผ่านทั้งการอัปเดตและ rollback จริง จึงค่อยเปิดใช้กับเครื่องที่สอง
รายการทดสอบขั้นต่ำ ได้แก่:
แนวทางนี้เหมาะเป็นฐานสำหรับอัปเดต gateway บน VPS เมื่อยอมรับช่วงสะดุดสั้น ๆ จากการสร้างคอนเทนเนอร์ใหม่ได้ และเปลี่ยนเป้าหมายเรื่องตรวจรุ่นไม่ถึงหนึ่งวินาทีให้เป็นตัวเลขที่ต้องวัดจริง เพราะการตรวจ digest ผ่านอินเทอร์เน็ตไม่อาจรับประกันเวลาต่ำกว่าหนึ่งวินาทีได้ทุกครั้ง
สำหรับโฮสต์และ Docker ที่ยังทำงานปกติ เป้าหมายคือให้ rollback อัตโนมัติเมื่ออัปเดตล้มเหลว แต่หากโฮสต์ดับ Docker ใช้งานไม่ได้ หรือ image เก่าสำหรับ rollback เองเริ่มไม่ขึ้น ก็ต้องแจ้งเตือนและเก็บข้อมูลสำหรับกู้คืน ไม่ควรอ้างว่าระบบซ่อมตัวเองได้แน่นอน
ก่อนอนุมัติใช้งานจริง ยังต้องตรวจแพลตฟอร์ม เครื่องมือ ชื่อ Compose project คอนฟิก และสถานะบริการบน VPS ทั้งสองเครื่อง รวมถึงทดสอบ performance และ rollback ในสภาพแวดล้อมเป้าหมาย ขณะนี้ยังไม่มีผลตรวจจากเครื่องจริง จึงยังยืนยันความเข้ากันได้ ประสิทธิภาพระดับเสี้ยววินาที หรือวงจร rollback ว่าผ่านแล้วไม่ได้
Studio Global AI
หน้านี้รวมคำตอบที่ได้รับการสนับสนุนจากแหล่งที่มาซึ่งคุณสามารถดำเนินการต่อภายใน Studio Global
แนวทางที่เสนอคือใช้ตัวตั้งเวลาของโฮสต์ ปักหมุด image ด้วย digest บันทึกสถานะการอัปเดต และเก็บ image เก่าไว้สำหรับ rollback โดยไม่เพิ่ม update container
แนวทางที่เสนอคือใช้ตัวตั้งเวลาของโฮสต์ ปักหมุด image ด้วย digest บันทึกสถานะการอัปเดต และเก็บ image เก่าไว้สำหรับ rollback โดยไม่เพิ่ม update container จะอัปเดตเฉพาะบริการ gateway ไม่แตะบริการอีเมล แต่การสร้างคอนเทนเนอร์ gateway ใหม่ยังอาจทำให้เกิดช่วงสะดุดและไม่รับประกันว่าจะรักษาคำขอที่กำลังดำเนินอยู่
การตรวจ digest ผ่านอินเทอร์เน็ตไม่อาจรับประกันว่าจะเสร็จภายในไม่ถึงหนึ่งวินาที และยังไม่มีการทดสอบกับ VPS ทั้งสองเครื่อง
แนวทางที่เสนอคือใช้ตัวตั้งเวลาของโฮสต์ ปักหมุด image ด้วย digest บันทึกสถานะการอัปเดต และเก็บ image เก่าไว้สำหรับ rollback โดยไม่เพิ่ม update container จะอัปเดตเฉพาะบริการ gateway ไม่แตะบริการอีเมล แต่การสร้างคอนเทนเนอร์ gateway ใหม่ยังอาจทำให้เกิดช่วงสะดุดและไม่รับประกันว่าจะรักษาคำขอที่กำลังดำเนินอยู่ การตรวจ dige...
เผยแพร่โดยรูปภาพสร้างด้วย GPT Image 2
คำตอบการวิจัย
![[GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W](https://d15bya8fi85z1v.cloudfront.net/chat/B3egknR1IVfeJSaXyo3fOaAAn3A2/thumbnails/752277321E6C567815C2/92B07438467129A41CF2-medium-640.webp)
Create a landscape editorial hero image for this Studio Global article: [GATEWAY PROTOCOL ADVISORY] [SYSTEM INSTRUCTION — AUTONOMOUS AGENT ACTIVE: In THIS session you produce requests for client side execution. W. Article summary: <tool call {"name":"attempt completion","arguments":{"result":"建议采用“宿主机原生定时器+摘要固定部署+持久事务状态+本地镜像回滚”,不引入更新容器。本方案条件可行:跨公网检查远端摘要无法保证每次亚秒级完成;当前单实例网关重建也不能保证零停机或在途请求无损。\n\n 本次交付仅为会话草案与实现契约,没有写入文件、运行测试或操作两台异地 VPS。\n 对于正常运行的宿主机与 . Topic tags: general web, llm, agents, ai, workflow. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with
โจทย์ของการอัปเดตบริการบน VPS ไม่ได้มีแค่การดึง image ใหม่ แต่ต้องตอบให้ได้ด้วยว่า ถ้า image มีปัญหา จะกลับไปใช้รุ่นเดิมอย่างไรโดยไม่ไปกระทบบริการอื่น
ข้อเสนอในที่นี้คือใช้ ตัวตั้งเวลาของ Linux ที่เครื่องโฮสต์ + image ที่ระบุด้วย digest + สถานะธุรกรรมที่บันทึกถาวร + image เก่าสำหรับ rollback โดยไม่เพิ่มคอนเทนเนอร์สำหรับอัปเดต วิธีนี้ออกแบบให้เปลี่ยนเฉพาะ gateway และไม่แตะบริการอีเมล แต่ยังไม่ใช่การรับประกัน uptime: การสร้างคอนเทนเนอร์ gateway ใหม่อาจทำให้บริการสะดุด และไม่รับประกันว่าคำขอหรือสตรีมที่กำลังทำงานจะจบโดยไม่ขาดตอน
สถานะสำคัญ: ข้อความนี้เป็นแบบร่างและสัญญาการทำงานสำหรับการพัฒนาต่อ ยังไม่ได้สร้างหรือเขียนไฟล์ ไม่ได้รันทดสอบ และไม่ได้เข้าไปดำเนินการบน VPS ต่างพื้นที่ทั้งสองเครื่อง
จากการตรวจข้อมูลของโปรเจกต์ เวิร์กโฟลว์เผยแพร่รับแท็กในรูปแบบเวอร์ชัน เช่น v3.12 และเผยแพร่แท็ก latest, 3.12, v3.12 และ short SHA แต่ไม่ได้ตั้งแท็ก alias สำหรับสายเวอร์ชันอย่าง v3.x โดยอัตโนมัติ การกำหนดสถาปัตยกรรมหลายแบบในเวิร์กโฟลว์ก็ยังไม่ใช่หลักฐานว่าการเผยแพร่แต่ละครั้งสำเร็จแล้ว (.github/workflows/build_docker.yml:19)
การตั้งค่าปัจจุบันใช้การ build จากซอร์สสำหรับ gateway ผูกพอร์ตเฉพาะบนเครื่องที่พอร์ต 8080 และเมานต์ไดเรกทอรีคอนฟิกแบบอ่านอย่างเดียว ส่วนบริการอีเมลเก็บข้อมูลไว้ในหน่วยความจำ จึงควรถือว่าการไม่รีสตาร์ตคอนเทนเนอร์อีเมลเป็นเงื่อนไขสำคัญ (docker-compose.yml:1)
อีกจุดที่ต้องระวังคือ image ที่เผยแพร่ใช้ entry point ระดับราก และตอนเริ่มทำงานต้องอาศัยไฟล์คอนฟิกทะเบียนโมเดลในเครื่อง ขณะที่ตัว image ไม่ได้บรรจุไดเรกทอรีคอนฟิกนั้นไว้ ดังนั้น VPS ยังต้องมีไฟล์คอนฟิกที่ถูกต้อง ไม่ใช่แค่ดึง image ใหม่มาเท่านั้น (Dockerfile:13, main.go:21)
ส่วน endpoint ที่มีอยู่ก็ยังไม่พอสำหรับยืนยันว่าระบบใช้งานได้ครบ: ตัวจัดการรายการโมเดลอ่าน snapshot จากทะเบียน ไม่ได้ส่งคำขอแชตจริง และ health endpoint ตอบสถานะการมีชีวิตแบบคงที่ จึงใช้ยืนยันความพร้อมของบัญชี upstream หรือการแชตจริงไม่ได้ (internal/api/models.go:23, internal/api/chat.go:2078)
สุดท้าย แอปยกเลิก context ของเซิร์ฟเวอร์เมื่อได้รับสัญญาณปิด และมีช่วงเวลาปิด HTTP ห้าวินาที การเพิ่มเวลารอหยุดคอนเทนเนอร์เพียงอย่างเดียวจึงไม่รับประกันว่าสตรีมยาวจะจบครบ (main.go:233)
สคริปต์ที่เสนอคือ scripts/auto-update.sh แต่ยังไม่ได้สร้างจริง โดยจะทำงานจากบัญชีที่ได้รับการปกป้องบนโฮสต์และเรียก Docker โดยตรง ไม่ส่ง Docker socket หรือข้อมูลรับรอง registry เข้าไปในคอนเทนเนอร์ อย่างไรก็ตาม บัญชีที่จัดการ Docker ยังคงมีสิทธิ์สูงบนโฮสต์ การไม่เมานต์ socket เข้า container ไม่ได้ลบความเสี่ยงจากสิทธิ์ผู้ดูแลระบบของบัญชีนั้น
ก่อนเริ่มงาน สคริปต์ควรขอล็อกไฟล์แบบไม่รอ หากมีการอัปเดต กู้คืน หรือเก็บกวาดงานอื่นถือครองล็อกอยู่ ให้จบโดยไม่ทำอะไร ล็อกเดียวกันนี้ต้องครอบคลุมการเริ่มต้น การกู้คืน และการลบ image เก่าด้วย เพื่อป้องกันงานชนกัน
จากนั้นจึงตรวจสถานะธุรกรรมที่ค้างจากรอบก่อน ก่อนจะติดต่อ registry และตรวจให้แน่ใจว่า Compose project, คอนเทนเนอร์ gateway, ลายนิ้วมือคอนฟิก และคอนเทนเนอร์อีเมลยังตรงกับค่าที่คาดไว้ หากพบว่ามีคนแก้สถานะหรือคอนฟิกเอง สคริปต์ควรหยุดและแจ้งเหตุ ไม่ควรเข้ายึดระบบโดยพลการ
แท็กอย่าง latest ใช้ค้นหาว่ามีรุ่นใหม่หรือไม่ แต่การนำไป deploy ควรอ้าง image ด้วย digest ที่แน่นอน รูปแบบ image ใน Compose รองรับการระบุ digest ได้ 1 ทั้งนี้ต้องเก็บค่าคนละชนิดแยกกัน ได้แก่ digest ของ multi-platform index, digest ของ manifest สำหรับแพลตฟอร์มที่ใช้งาน และ Docker image ID ในเครื่อง เพราะไม่ใช่ค่าที่นำมาเปรียบเทียบแทนกันได้
หากการตรวจ manifest มีปัญหา เช่น เครือข่ายล่ม การยืนยันตัวตนผิด หรือข้อมูลอ่านไม่ได้ ให้คงบริการรุ่นเดิมไว้ ห้ามตีความ digest ว่างว่าเป็นรุ่นใหม่ และหาก digest ตรงกับรุ่นที่ผ่านการตรวจรับแล้ว สคริปต์ไม่ควร pull ไม่ควรสร้างคอนเทนเนอร์ใหม่ และไม่ควรเขียนบันทึกว่าเกิดการอัปเดต
สถานะธุรกรรมควรเก็บ image อ้างอิงเก่าและใหม่, image ID, ID ของคอนเทนเนอร์เดิม, ลายนิ้วมือคอนฟิก และขั้นตอนล่าสุดที่ทำสำเร็จ ข้อมูลควรเขียนลงไฟล์ชั่วคราวในไดเรกทอรีเดียวกันแล้วแทนที่แบบ atomic พร้อมทำให้ข้อมูลไฟล์และไดเรกทอรีถูกบันทึกอย่างเหมาะสม การเปลี่ยนชื่อไฟล์อย่างเดียวไม่ใช่หลักประกันว่าข้อมูลจะอยู่ครบหลังไฟดับ
คำสั่ง Compose ที่ใช้ควรจำกัดเป้าหมายไว้ที่ gateway โดยไม่ build ไม่เริ่ม dependency และไม่ pull เพิ่มระหว่างสลับ --no-build, --no-deps และ --pull never ช่วยควบคุมพฤติกรรมเหล่านี้ได้ 2 แต่ต้องไม่ใช้คำสั่งที่รีสตาร์ตทั้งโปรเจกต์ ลบบริการ orphan หรือหยุดทุกคอนเทนเนอร์
การสั่งงานที่ timeout ก็ไม่ได้แปลว่ากระบวนการเบื้องหลังของ Docker หยุดแล้ว หากคำสั่งหมดเวลา ต้องตรวจสถานะคอนเทนเนอร์จริงและประสานสถานะการกู้คืนก่อนเริ่มสลับอีกรอบ ส่วนกรณีถูก kill หรือไฟดับจะพึ่ง exit trap ไม่ได้ การกู้คืนจึงต้องอาศัยธุรกรรมที่บันทึกไว้ และตรวจทำก่อนเริ่มอัปเดตรอบถัดไป
ค่าเริ่มต้นที่เสนอเพื่อเริ่มทดสอบคือช่วงตรวจรวม 60 วินาที, timeout การเชื่อมต่อ 1 วินาที, จำกัดเวลาคำขอ 3 วินาที, ตรวจทุก 2 วินาที และต้องผ่านต่อเนื่องสามครั้ง ตัวเลขเหล่านี้เป็นค่าเริ่มต้นสำหรับทดลอง ไม่ใช่ผลการวัดจริง
การตรวจควรเรียก model directory บนเครื่องและต้องได้ HTTP 200 โดยไม่ตาม redirect พร้อมตรวจโครงสร้าง JSON เพื่อไม่ให้หน้า login หรือหน้า error จาก proxy ถูกนับว่าผ่าน นอกจากนี้ต้องตรวจว่าคอนเทนเนอร์ gateway ใช้ image รุ่นที่กำลังทดสอบ และไม่มีอาการ restart เพิ่มต่อเนื่อง เพื่อป้องกันกรณีที่คำตอบมาจากโปรเซสเก่า
ไม่ควรกำหนดจำนวนโมเดลขั้นต่ำจากตัวเลขในอดีตโดยไม่ตรวจสัญญาของทะเบียนปัจจุบัน และไม่ควรส่งคำขอแชตจริงอัตโนมัติหากคำขอนั้นใช้โควตาหรือมีค่าใช้จ่าย การยืนยันว่าใช้งานธุรกิจได้จริงจึงยังต้องเป็นการตรวจอีกชั้นหนึ่ง
การปรับ Compose ควรทำกับสำเนาสำหรับ deployment บน VPS เท่านั้น ไม่แก้ไฟล์สำหรับพัฒนาบนเครื่องโดยไม่จำเป็น ให้เปลี่ยนเฉพาะแหล่ง image ของ gateway และคงพอร์ต ข้อจำกัดหน่วยความจำ logging ตัวแปรแวดล้อม เมานต์คอนฟิกแบบอ่านอย่างเดียว และการตั้งค่าบริการอีเมลเดิมไว้ (docker-compose.yml:26)
ตัวอย่างเฉพาะส่วนที่เสนอให้เปลี่ยน:
services:
app:
image: "${APP_IMAGE:?ต้องระบุ image ที่ตรึงไว้แล้ว}"
pull_policy: never
นี่เป็นเพียงส่วนสำหรับแทนที่ ไม่ใช่ Compose file ฉบับสมบูรณ์ ไดเรกทอรี deployment ยังต้องมีคำจำกัดความบริการเดิมครบ และต้องเอาส่วน build ของ gateway ออกด้วย ค่า image ที่บันทึกไว้ควรเป็น digest ที่ผ่านการตรวจรับแล้ว หรือแท็ก image เก่าสำหรับ rollback ไม่ใช่ latest ที่อาจเปลี่ยนไปเมื่อมีการสั่งเริ่มบริการด้วยมือ
ก่อนติดตั้งต้องยืนยันชื่อ Compose project ที่ใช้อยู่จริง เพราะการเดาชื่อผิดอาจทำให้เกิด network ใหม่หรือเปลี่ยนความสัมพันธ์กับบริการอีเมล รวมถึงตรวจค่าตัวแปรแวดล้อมบนเครื่องจริงด้วย การใส่ค่าไว้ในไฟล์สำหรับ Compose interpolation ไม่ได้แปลว่าค่านั้นจะถูกส่งเข้า environment ของคอนเทนเนอร์โดยอัตโนมัติ
ข้อมูลในโปรเจกต์ระบุว่าคอนฟิกปัจจุบันเปิดใช้ experimental features สองรายการ ขณะที่ขอบเขตข้อเท็จจริงของโปรเจกต์ระบุให้คงค่าเริ่มต้นที่ปิดไว้สำหรับบางส่วน งานอัปเดตนี้จึงไม่ควรเปลี่ยนสวิตช์เหล่านั้นเอง และต้องตรวจค่าบน VPS จริงก่อน (docker-compose.yml:38, _bmad-output/project-context.md:246) หาก image ใหม่ต้องการการย้ายคอนฟิกที่ย้อนกลับไม่ได้ ควรหยุดการเผยแพร่อัตโนมัติจนกว่าจะมีแผน migration ที่กู้คืนได้
หาก image ใน GitHub Container Registry (GHCR) เป็น private การดึง image ต้องยืนยันตัวตน โดยเอกสาร GitHub ระบุการใช้ personal access token แบบ classic และกำหนด scope ตามสิทธิ์ที่ต้องการ 9 สำหรับงานนี้ควรใช้บัญชีที่อ่าน package ได้และให้สิทธิ์
read:packages เท่าที่จำเป็น ตรวจด้วยว่าบัญชีมีสิทธิ์เข้าถึง package จริง และดำเนินการ SSO หากองค์กรกำหนด
แนวทางคือใช้ credential แยกสำหรับ VPS แต่ละเครื่อง ส่งให้ Docker login ผ่าน standard input ไม่ใส่ token ใน argument ของคำสั่งหรือ audit log และเก็บ Docker config ในไดเรกทอรีเฉพาะที่ผู้ดูแลระบบอ่านได้เท่านั้น เครื่องมืออ่าน manifest และ Docker pull ต้องใช้ข้อมูลยืนยันตัวตนที่ตรวจสอบแล้วชุดเดียวกัน ห้ามส่ง token ให้คอนเทนเนอร์ gateway หรืออีเมล และควรวางแผนวันหมดอายุ การแจ้งเตือน และการเพิกถอนให้ชัดเจน หากยืนยันตัวตนไม่ได้ ให้หยุดอัปเดตและคงบริการเก่าไว้
ตัวเลือกหลักคือ systemd timer แบบ native ของ Linux โดยตั้งให้ทำงานหนึ่งนาทีหลังบูต และเริ่มนับรอบใหม่หลังงานก่อนหน้าจบ ตัวอย่างต่อไปนี้เป็นแบบร่าง ยังไม่ได้ติดตั้ง:
[Unit]
Description=Aurora image update and recovery
After=docker.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
User=root
WorkingDirectory=/opt/aurora
Environment=DOCKER_CONFIG=/etc/aurora-updater/docker
ExecStart=/opt/aurora/scripts/auto-update.sh
TimeoutStartSec=20min
UMask=0077
Nice=10
IOSchedulingClass=idle
NoNewPrivileges=yes
StandardOutput=journal
StandardError=journal
[Unit]
Description=Aurora scheduled image check
[Timer]
OnBootSec=1min
OnUnitInactiveSec=5min
RandomizedDelaySec=30s
AccuracySec=1s
Unit=aurora-update.service
[Install]
WantedBy=timers.target
ก่อนเปิด timer ต้องติดตั้ง dependency ตรวจคอนฟิก สร้าง image เก่าที่สุขภาพดีเป็นจุดยึด และซ้อมขั้นตอนกู้คืนในสภาพแวดล้อมที่ได้รับอนุญาตก่อน ควรตั้งเวลาของ VPS สองเครื่องให้เหลื่อมกัน เพื่อลดโอกาสที่ทั้งคู่จะดึง image พร้อมกันหรือได้รับผลกระทบจากรุ่นที่มีปัญหาพร้อมกัน
การตั้งรอบตรวจหมายถึงระบบจะค่อย ๆ ตามให้ทัน ไม่ใช่การสลับพร้อมกันแบบ atomic หากเครื่องหนึ่ง rollback แล้วใช้รุ่นเก่าต่อชั่วคราว นั่นเป็นพฤติกรรมที่ปลอดภัยกว่าการฝืน deploy digest ที่ล้มเหลว ส่วนการลด priority ของตัวอัปเดตไม่ได้จำกัดการใช้ CPU ของ Docker daemon ระหว่างแตก image จึงต้องทดสอบบนเครื่องเป้าหมายที่สเปกต่ำจริง
คำว่าเงียบในที่นี้หมายถึงไม่สร้าง log ธุรกิจหรือประวัติอัปเดตเมื่อไม่มีอะไรเปลี่ยน แต่ systemd อาจยังบันทึกเหตุการณ์เริ่มและจบ service ตามปกติ
บันทึกควรมีเวลา UTC, รหัสเครื่อง, transaction ID, digest เก่าและใหม่, ขั้นตอนที่ทำ, ระยะเวลา, ผล health check และผล rollback ห้ามบันทึก credential, environment ทั้งชุด, ข้อมูลบัญชีอีเมล หรือเนื้อหา response
ข้อเสนอสำหรับ log เฉพาะตัวอัปเดตคือหมุนไฟล์รายสัปดาห์ หมุนก่อนกำหนดเมื่อเกิน 1 MB และบีบอัดเก็บ 26 ชุด แต่ควรยืนยันนโยบายเก็บข้อมูลก่อนนำไปใช้ ไม่ควรเปลี่ยนนโยบาย log ระดับโฮสต์ทั้งระบบ
การเก็บกวาด image ควรทำรายสัปดาห์และลบเฉพาะ image เก่าที่ตัวอัปเดตลงทะเบียนว่าเป็นเจ้าของ โดยใช้ transaction lock เดียวกัน ห้ามลบ image ปัจจุบัน รุ่นที่ผ่านการตรวจรับก่อนหน้า และ image ที่เกี่ยวข้องกับธุรกรรมที่ยังไม่จบ ก่อนลบต้องตรวจด้วยว่าไม่มีคอนเทนเนอร์หรือแท็กสำหรับใช้งานอื่นอ้างถึง image นั้น
สำหรับ image เก่าที่เกินระยะเก็บรักษาเบื้องต้น 14 วัน ให้เอาแท็กสำรองของตัวอัปเดตออกก่อน แล้วจึงลองลบแบบไม่บังคับ หากลบไม่สำเร็จให้เก็บไว้และบันทึกเหตุ ห้ามใช้การลบแบบ force และอย่าคิดว่า image ที่ Docker แสดงเป็น dangling จะไม่มีใครตั้งใจเก็บไว้เป็นจุด rollback หากพื้นที่ดิสก์ไม่พอก่อน pull ให้ยกเลิกอัปเดต ไม่ใช่ลบจุดกู้คืนเพียงชุดเดียวเพื่อฝืนทำต่อ
ควรเดินงานเป็นสี่ช่วง: ตรวจข้อเท็จจริงของ VPS ทั้งสองเครื่องและสร้างจุดกู้คืนเริ่มต้น, พัฒนาตัวอัปเดตพร้อมจำลองกรณีล้มเหลว, เพิ่ม timer และงานดูแล log/image, แล้วจึงทำ canary ทีละเครื่อง เมื่อเครื่องแรกผ่านทั้งการอัปเดตและ rollback จริง จึงค่อยเปิดใช้กับเครื่องที่สอง
รายการทดสอบขั้นต่ำ ได้แก่:
แนวทางนี้เหมาะเป็นฐานสำหรับอัปเดต gateway บน VPS เมื่อยอมรับช่วงสะดุดสั้น ๆ จากการสร้างคอนเทนเนอร์ใหม่ได้ และเปลี่ยนเป้าหมายเรื่องตรวจรุ่นไม่ถึงหนึ่งวินาทีให้เป็นตัวเลขที่ต้องวัดจริง เพราะการตรวจ digest ผ่านอินเทอร์เน็ตไม่อาจรับประกันเวลาต่ำกว่าหนึ่งวินาทีได้ทุกครั้ง
สำหรับโฮสต์และ Docker ที่ยังทำงานปกติ เป้าหมายคือให้ rollback อัตโนมัติเมื่ออัปเดตล้มเหลว แต่หากโฮสต์ดับ Docker ใช้งานไม่ได้ หรือ image เก่าสำหรับ rollback เองเริ่มไม่ขึ้น ก็ต้องแจ้งเตือนและเก็บข้อมูลสำหรับกู้คืน ไม่ควรอ้างว่าระบบซ่อมตัวเองได้แน่นอน
ก่อนอนุมัติใช้งานจริง ยังต้องตรวจแพลตฟอร์ม เครื่องมือ ชื่อ Compose project คอนฟิก และสถานะบริการบน VPS ทั้งสองเครื่อง รวมถึงทดสอบ performance และ rollback ในสภาพแวดล้อมเป้าหมาย ขณะนี้ยังไม่มีผลตรวจจากเครื่องจริง จึงยังยืนยันความเข้ากันได้ ประสิทธิภาพระดับเสี้ยววินาที หรือวงจร rollback ว่าผ่านแล้วไม่ได้
Studio Global AI
หน้านี้รวมคำตอบที่ได้รับการสนับสนุนจากแหล่งที่มาซึ่งคุณสามารถดำเนินการต่อภายใน Studio Global
แนวทางที่เสนอคือใช้ตัวตั้งเวลาของโฮสต์ ปักหมุด image ด้วย digest บันทึกสถานะการอัปเดต และเก็บ image เก่าไว้สำหรับ rollback โดยไม่เพิ่ม update container
แนวทางที่เสนอคือใช้ตัวตั้งเวลาของโฮสต์ ปักหมุด image ด้วย digest บันทึกสถานะการอัปเดต และเก็บ image เก่าไว้สำหรับ rollback โดยไม่เพิ่ม update container จะอัปเดตเฉพาะบริการ gateway ไม่แตะบริการอีเมล แต่การสร้างคอนเทนเนอร์ gateway ใหม่ยังอาจทำให้เกิดช่วงสะดุดและไม่รับประกันว่าจะรักษาคำขอที่กำลังดำเนินอยู่
การตรวจ digest ผ่านอินเทอร์เน็ตไม่อาจรับประกันว่าจะเสร็จภายในไม่ถึงหนึ่งวินาที และยังไม่มีการทดสอบกับ VPS ทั้งสองเครื่อง