Go
Una aplicación mínima
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:
ZBPACK_GO_ENTRY=./cmd/serverEn un monorepo, pon en su lugar el Root Directory del servicio en la carpeta con go.mod.
Desplegar
- Add Service → GitHub, elige el repositorio y la rama.
- Haz clic en Next, comprueba que la vista previa muestra go con tu versión de Go y haz clic en Deploy.
- Genera un dominio en la pestaña Networking.
Conecta una base de datos
Añade PostgreSQL al proyecto y define en el servicio Go:
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:
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íntoma | Causa |
|---|---|
| El despliegue nunca está sano | El servidor escucha en localhost:8080 o ignora PORT. Escucha en ":"+os.Getenv("PORT"). |
no Go files in /src | main no está en el directorio raíz. Define ZBPACK_GO_ENTRY o el directorio raíz. |
| El binario no encuentra plantillas ni archivos estáticos | zbpack 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 scratch | La imagen no tiene certificados de CA. Usa distroless/static, que los incluye, o copia /etc/ssl/certs. |