跳到正文

Go ​

最小應用 ​

go
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 會在所有網路卡上監聽。Gin 的 r.Run()、Echo 的 e.Start(":"+port) 和 Fiber 的 app.Listen(":"+port) 也是一樣。

Zenavo 識別出的內容 ​

帶有 go.mod 的儲存庫會由 zbpack 建置為 Go。Go 版本取自 go.mod 中的 go 行。建置會執行 go mod download,並以 CGO_ENABLED=0 執行 go build,生成的二進位制檔案執行在一個小巧的 Alpine 映像檔上。

zbpack 建置根目錄中的包。如果 main 在其他位置,例如 cmd/server,請在 設定 → 建置 → zbpack 選項 中設定入口:

sh
ZBPACK_GO_ENTRY=./cmd/server

如果是 monorepo,則把服務的 根目錄 設為 go.mod 所在的資料夾。

部署 ​

  1. 新增服務 → GitHub,選擇儲存庫和分支。
  2. 點選 下一步,確認預覽顯示 go 以及你的 Go 版本,然後點選 部署。
  3. 在 網路 分頁生成網域。

連線資料庫 ​

在專案中新增 PostgreSQL,並在 Go 服務中設定:

sh
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}

pgx、搭配 lib/pq 的 database/sql、GORM 和 sqlc 都接受這個 URL。

使用自己的 Dockerfile ​

根目錄中的 Dockerfile 會代替 zbpack 使用,例如需要在二進位制檔案旁放置其他檔案,或者需要用 cgo 建置:

dockerfile
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"]

服務的連接埠來自 EXPOSE。

常見問題 ​

現象原因
部署一直不健康伺服器監聽的是 localhost:8080,或者忽略了 PORT。請監聽 ":"+os.Getenv("PORT")。
no Go files in /srcmain 不在根目錄中。設定 ZBPACK_GO_ENTRY 或根目錄。
二進位制檔案找不到模板或靜態檔案zbpack 只把二進位制檔案複製到映像檔中。用 //go:embed 嵌入它們,或者使用 Dockerfile。
distroless 或 scratch 映像檔報 x509: certificate signed by unknown authority映像檔中沒有 CA 憑證。使用自帶憑證的 distroless/static,或者複製 /etc/ssl/certs。

與 Zeabur 無關聯。