本文へスキップ

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 など別の場所にある場合は、Settings → Build → zbpack options でエントリーを設定します。

sh
ZBPACK_GO_ENTRY=./cmd/server

モノレポなら、代わりにサービスの Root Directory を go.mod のあるフォルダーにしてください。

デプロイ ​

  1. Add Service → GitHub で、リポジトリとブランチを選びます。
  2. Next をクリックし、プレビューに go と Go のバージョンが表示されていることを確認して Deploy をクリックします。
  3. Networking タブでドメインを生成します。

データベースに接続する ​

プロジェクトに 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 から決まります。

よくある問題 ​

症状原因
デプロイが healthy にならないサーバーが 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 とは関係ありません。