跳到正文

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 无关联。