สมอง SML

คลังความรู้ / หลังบ้าน Go

#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.

ทำงานอย่างไร

  1. Makefile (Makefile:3-41): build = go build ./...; build-all = cross-compile windows/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 ไฟล์ที่สร้างเอง).
  2. 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"].
  3. docker-compose (docker-compose.yml): บริการ api (build จาก Dockerfile, พอร์ต 8080, ตั้ง APP_ENV=development, HTTP_PORT, LOG_LEVEL) + postgres:16-alpine สำหรับ dev พร้อม volume pgdata. ค่า user/password ของ Postgres ใน compose เป็นค่า dev ในไฟล์ — ไม่คัดลอกมาที่นี่.
  4. Kubernetes (deployments/k8s/):
    • deployment.yaml: replicas: 2, อิมเมจ placeholder, envFrom ConfigMap smlaiaccountapi-config + Secret smlaiaccountapi-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.
  5. Health: GET /health ตอบ {"status":"ok"} เป็น liveness เท่านั้น ไม่ ping DB (ops/health.go:24); manifest เองก็ใช้เป็น readiness ชั่วคราว.

ข้อควรระวัง

ที่มาในโค้ด

  • 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)