Saltar al contenido

Go ​

Una aplicación mínima ​

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 escucha en todas las interfaces. r.Run() de Gin, e.Start(":"+port) de Echo y app.Listen(":"+port) de Fiber funcionan igual.

Qué detecta Zenavo ​

Un repositorio con go.mod se compila con zbpack como Go. La versión de Go sale de la línea go de go.mod. La compilación ejecuta go mod download y go build con CGO_ENABLED=0, y el binario se ejecuta en una imagen Alpine pequeña.

zbpack compila el paquete del directorio raíz. Si main está en otro sitio, como cmd/server, indica la entrada en Settings → Build → zbpack options:

sh
ZBPACK_GO_ENTRY=./cmd/server

En un monorepo, pon en su lugar el Root Directory del servicio en la carpeta con go.mod.

Desplegar ​

  1. Add Service → GitHub, elige el repositorio y la rama.
  2. Haz clic en Next, comprueba que la vista previa muestra go con tu versión de Go y haz clic en Deploy.
  3. Genera un dominio en la pestaña Networking.

Conecta una base de datos ​

Añade PostgreSQL al proyecto y define en el servicio Go:

sh
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}

pgx, database/sql con lib/pq, GORM y sqlc aceptan esta URL.

Tu propio Dockerfile ​

Un Dockerfile en el directorio raíz se usa en lugar de zbpack, por ejemplo para incluir archivos junto al binario o compilar con 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"]

El puerto del servicio sale de EXPOSE.

Problemas habituales ​

SíntomaCausa
El despliegue nunca está sanoEl servidor escucha en localhost:8080 o ignora PORT. Escucha en ":"+os.Getenv("PORT").
no Go files in /srcmain no está en el directorio raíz. Define ZBPACK_GO_ENTRY o el directorio raíz.
El binario no encuentra plantillas ni archivos estáticoszbpack solo copia el binario a la imagen. Incrústalos con //go:embed o usa un Dockerfile.
x509: certificate signed by unknown authority en imágenes distroless o scratchLa imagen no tiene certificados de CA. Usa distroless/static, que los incluye, o copia /etc/ssl/certs.

Sin relación con Zeabur.