Go
Aplikasi minimal
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello from Go")
})
log.Printf("listening on %s", port)
log.Fatal(http.ListenAndServe(":"+port, nil))
}":"+port mendengarkan di semua interface. r.Run() milik Gin, e.Start(":"+port) milik Echo, dan app.Listen(":"+port) milik Fiber bekerja dengan cara yang sama.
Apa yang dideteksi Zenavo
Repositori dengan go.mod dibangun dengan zbpack sebagai Go. Versi Go diambil dari baris go di go.mod. Build menjalankan go mod download dan go build dengan CGO_ENABLED=0, dan binernya berjalan di image Alpine yang kecil.
zbpack membangun package di direktori root. Bila main berada di tempat lain, seperti cmd/server, atur entry di Settings → Build → zbpack options:
ZBPACK_GO_ENTRY=./cmd/serverUntuk monorepo, atur Root Directory layanan ke folder yang berisi go.mod.
Deploy
- Add Service → GitHub, pilih repositori dan branch.
- Klik Next, pastikan pratinjau menampilkan go dengan versi Go Anda, lalu klik Deploy.
- Buat domain di tab Networking.
Hubungkan database
Tambahkan PostgreSQL ke proyek dan atur di layanan Go:
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}pgx, database/sql dengan lib/pq, GORM, dan sqlc semuanya menerima URL ini.
Dockerfile Anda sendiri
Dockerfile di direktori root dipakai sebagai pengganti zbpack, misalnya untuk menyertakan file di samping biner atau untuk build dengan cgo:
FROM golang:1.26-alpine AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /server ./cmd/server
FROM gcr.io/distroless/static-debian12
COPY --from=build /server /server
EXPOSE 8080
ENTRYPOINT ["/server"]Port layanan berasal dari EXPOSE.
Masalah umum
| Gejala | Penyebab |
|---|---|
| Deployment tidak pernah sehat | Server mendengarkan di localhost:8080 atau mengabaikan PORT. Dengarkan di ":"+os.Getenv("PORT"). |
no Go files in /src | main tidak ada di direktori root. Atur ZBPACK_GO_ENTRY atau direktori root. |
| Biner tidak menemukan template atau file statis | zbpack hanya menyalin biner ke image. Sematkan dengan //go:embed, atau gunakan Dockerfile. |
x509: certificate signed by unknown authority dari image distroless atau scratch | Image tidak punya sertifikat CA. Gunakan distroless/static, yang menyertakannya, atau salin /etc/ssl/certs. |