#backend#deployment#docker#kubernetes#makefile
การ build และ deploy backend
สรุป: backend build เป็น binary เดียว (./cmd/api) แล้ว deploy ได้ 3 ทาง — คอนเทนเนอร์ (Dockerfile / docker-compose / K8s), เซอร์วิส Windows, หรือ LaunchDaemon macOS (วงจรชีวิตเซอร์วิสและการรัน binary เดียวหลาย OS (Service lifecycle)). ADR ที่เกี่ยวข้อง: ADR-0007 binary เดียวรันเป็น Windows Service / macOS LaunchDaemon / container.
ทำงานอย่างไร
- Makefile (
Makefile:3-41):build=go build ./...;build-all= cross-compilewindows/amd64(.exe),darwin/amd64,darwin/arm64,linux/amd64ลงdist/;run=go run ./cmd/api;test=go test ./...;test-integration=go test -tags=integration ./test/...(ใช้ testcontainers + Docker);vet;lint=golangci-lint run ./...;tidy;swagger=swag init -g cmd/api/main.go -o docs --parseInternal(CI ไม่รัน ต้อง commit ไฟล์ที่สร้างเอง). - Dockerfile (
Dockerfile:1-14): multi-stage — build ด้วยgolang:1.25-alpine(CGO_ENABLED=0 GOOS=linux) แล้วคัดลอกไปdistroless/static-debian12:nonroot, ผู้ใช้nonroot,EXPOSE 8080,ENTRYPOINT ["/api"]. - docker-compose (
docker-compose.yml): บริการapi(build จาก Dockerfile, พอร์ต 8080, ตั้งAPP_ENV=development,HTTP_PORT,LOG_LEVEL) +postgres:16-alpineสำหรับ dev พร้อม volumepgdata. ค่า user/password ของ Postgres ใน compose เป็นค่า dev ในไฟล์ — ไม่คัดลอกมาที่นี่. - Kubernetes (
deployments/k8s/):deployment.yaml:replicas: 2, อิมเมจ placeholder,envFromConfigMapsmlaiaccountapi-config+ Secretsmlaiaccountapi-secrets, liveness/readiness ชี้/healthพอร์ต 8080 (initialDelay 5 วินาที, period 15 และ 10 วินาที), requests cpu 100m/mem 64Mi, limits cpu 500m/mem 256Mi.configmap.yaml:APP_ENV=production,HTTP_PORT,LOG_LEVEL,CONFIG_DIR=configs,SHUTDOWN_TIMEOUT_SECONDS, TTL ของ token; ตั้งใจไม่ตั้งLOG_FILE(ให้ log ออก stdout).secret.example.yaml: ตัวอย่างสำหรับADMIN_API_KEYและJWT_SIGNING_KEY(ค่าเป็น placeholder).service.yaml: Service port 8080 → targetPort 8080.
- Health:
GET /healthตอบ{"status":"ok"}เป็น liveness เท่านั้น ไม่ ping DB (ops/health.go:24); manifest เองก็ใช้เป็น readiness ชั่วคราว.
ข้อควรระวัง
- Dockerfile ใช้ Go 1.25 แต่
go.modระบุgo 1.26.0(go.mod:3) — build อิมเมจนี้อาจล้ม หรือดึง toolchain เพิ่ม (ยังไม่ยืนยัน ไม่ได้รัน build). - runtime image ไม่มีโฟลเดอร์
configs/และ manifest K8s ไม่ mount volume ให้CONFIG_DIR→ registry ผู้เช่า (providerlist.json) และrevoked_sessions.jsonจะอยู่บน filesystem ของ pod เอง; ผู้ใช้nonrootอาจเขียนพาธนั้นไม่ได้ (ยังไม่ยืนยัน). ดู ทะเบียน Provider แบบไฟล์ JSON (Provider registry). replicas: 2ขัดกับข้อสมมติ "instance เดียว" ของ registry แบบไฟล์ (ADR-0001 เก็บ config ของผู้เช่า (Provider) เป็นไฟล์ JSON ไม่ใช่ตาราง DB) และของ revocation store แบบไฟล์ (ADR-0004 การเพิกถอน session ตอน logout (RevocationStore)): ผู้เช่าที่ลงทะเบียนที่ pod หนึ่งอาจไม่ปรากฏที่อีก pod.- ใน compose การตั้ง
APP_ENV=developmentโดยไม่ตั้งHTTP_BIND_HOSTทำให้ bind loopback ในคอนเทนเนอร์ (ตัวแปรสภาพแวดล้อมและการโหลด config ของ backend (Environment config)) (อนุมาน ยังไม่ได้ลองรัน). /swagger/*เปิดเฉพาะAPP_ENV=development; production ให้ 404 (Router, middleware และแผนผัง route ทั้งหมดของ backend (chi router)).
ที่มาในโค้ด
backend/Makefile:3-41— เป้าหมาย build/test/lint/swagger.backend/deployments/docker/Dockerfile:1-14— multi-stage build.backend/deployments/docker/docker-compose.yml:1-27— api + postgres dev.backend/deployments/k8s/deployment.yaml:11-52— replica, probe, resource.backend/deployments/k8s/configmap.yaml:7-18— env ที่ไม่ลับ.backend/internal/adapter/inbound/http/ops/health.go:24—/health.
ดูเพิ่ม
ภาพรวม Backend Go ของ SML Ai Account (Backend overview) · วงจรชีวิตเซอร์วิสและการรัน binary เดียวหลาย OS (Service lifecycle) · ตัวแปรสภาพแวดล้อมและการโหลด config ของ backend (Environment config) · ทะเบียน Provider แบบไฟล์ JSON (Provider registry) · สารบัญ ADR ของ backend (Architecture Decision Records)