#backend#go#service#windows#macos#deployment
วงจรชีวิตเซอร์วิสและ binary เดียวหลาย OS
binary cmd/api ตัวเดียวรันได้ทั้งเป็นโปรเซสธรรมดา (container/dev) และเป็นเซอร์วิสของ Windows หรือ LaunchDaemon ของ macOS ผ่าน kardianos/service ตามที่ตัดสินใจไว้ใน ADR-0007 binary เดียวรันเป็น Windows Service / macOS LaunchDaemon / container.
ทำงานอย่างไร
main()สร้างเซอร์วิสด้วยnewService()(main.go:111) — ชื่อsmlaiaccountapi, display nameSML Account API.- ถ้า argument แรกคือ
service→runServiceCommand(main.go:151) รับinstall | uninstall | start | stop; ถ้าไม่ใช่ →svc.Run()(รันเป็นโปรแกรมหรือให้ service manager เรียก). program.Start(main.go:58):config.Load()→logger.New(level, logFile)→ ตั้ง swagger host/schemes →di.Build→httpserver.New→ เปิด goroutine รันsrv.Run(sigCtx, shutdown)โดยฟังสัญญาณos.Interrupt/SIGTERM(สถาปัตยกรรม Hexagonal และ composition root ของ Go backend (Hexagonal Architecture + DI)).program.Stop(main.go:91): cancel context, รอ server ปิดไม่เกิน 30 วินาที (เกินแล้วแค่ log เตือน), แล้วcontainer.Close()ปิด pool ทั้งหมด.httpserver.Run(server.go:43) รันจนกว่า context ถูกยกเลิก แล้วShutdownภายในSHUTDOWN_TIMEOUT_SECONDS(default 15, ตัวแปรสภาพแวดล้อมและการโหลด config ของ backend (Environment config)).
ตัวเลือกของเซอร์วิส (main.go:111-130)
| แพลตฟอร์ม | ตัวเลือก |
|---|---|
| Windows | StartType=automatic (เปิดเองตอนบูต), OnFailure=restart (ล้มแล้วรีสตาร์ต) |
| macOS | UserService=false (เป็น LaunchDaemon ระดับระบบ), RunAtLoad=true, KeepAlive=true |
Firewall และ log
- ตอน
service installสำเร็จ โค้ดอ่านพอร์ตจาก config (ถ้า.envยังไม่มีใช้ 8080) แล้วเรียกaddFirewallRule(port)(main.go:166-176). บน Windows ใช้netsh advfirewallลบกฎชื่อSML Account APIเดิมแล้วเพิ่มกฎ inbound TCP ใหม่ (firewall_windows.go:10-25); OS อื่นเป็น no-op (firewall_other.go). ถ้าเพิ่มกฎไม่สำเร็จแค่เตือนทาง stderr ไม่ทำให้ install ล้ม. - log เป็น JSON ด้วย zerolog; ถ้า
LOG_FILEตั้งไว้ จะหมุนไฟล์ด้วย lumberjack: 100 MB ต่อไฟล์, เก็บ 5 ไฟล์, อายุ 30 วัน, บีบอัด gzip (logger.goส่วนNew). ถ้าไม่ตั้ง เขียน stdout เพราะเซอร์วิสไม่มี console (ตัวแปรสภาพแวดล้อมและการโหลด config ของ backend (Environment config)).
ข้อควรระวัง
- พาธ
.env,CONFIG_DIR,LOG_FILEที่เป็นพาธสัมพัทธ์ถูกอ่านเทียบโฟลเดอร์ของ exe ก่อน — ติดตั้งเซอร์วิสแล้วต้องวางไฟล์ไว้ข้าง exe. Stopรอ 30 วินาทีแบบตายตัว ไม่ผูกกับSHUTDOWN_TIMEOUT_SECONDS.- Windows ต้องรัน
service installด้วยสิทธิ์ผู้ดูแล (เพราะแก้ service manager และ firewall) (อนุมาน ยังไม่ได้ลองรัน).
ที่มาในโค้ด
backend/cmd/api/main.go:58-109—Start/Stop.backend/cmd/api/main.go:111-149— ตัวเลือกเซอร์วิสและmain.backend/cmd/api/main.go:151— คำสั่งservice install|uninstall|start|stop.backend/cmd/api/firewall_windows.go:10— ชื่อกฎ firewall.backend/internal/platform/logger/logger.go:1— การหมุน log.backend/internal/platform/httpserver/server.go:43—Run+ graceful shutdown.
ดูเพิ่ม
ภาพรวม Backend Go ของ SML Ai Account (Backend overview) · การ build และ deploy backend: Docker, Kubernetes, Makefile (Deployment) · ตัวแปรสภาพแวดล้อมและการโหลด config ของ backend (Environment config) · ADR-0007 binary เดียวรันเป็น Windows Service / macOS LaunchDaemon / container · สารบัญ ADR ของ backend (Architecture Decision Records)