Деплой и production

Тема дорожной карты · Golang

Развёртывание Go-приложений проще по сравнению со многими другими рантаймами, поскольку go build создаёт единый самодостаточный бинарник без зависимостей от внешнего интерпретатора или виртуальной машины. Стандартный пайплайн развёртывания компилирует бинарник командой CGO_ENABLED=0 go build -ldflags="-s -w" -o app ./cmd/server, копирует его в минимальный Docker-образ на базе scratch или gcr.io/distroless/static и оркестрирует контейнеры с помощью Kubernetes через kubectl apply или Helm. Go-бинарники реагируют на сигналы ОС — SIGINT и SIGTERM — обрабатываемые через os/signal.NotifyContext или signal.Notify, что обеспечивает graceful shutdown с дожиданием завершения текущих HTTP-запросов перед выходом из процесса. Наблюдаемость в продакшене требует структурированного логирования (Zap, Logrus или стандартный пакет slog), метрик, публикуемых на эндпоинте /metrics для Prometheus, и распределённой трассировки через OpenTelemetry с экспортёром OTLP. CI/CD-пайплайны для Golang-сервисов обычно запускают go test -race ./..., go vet ./... и golangci-lint run перед сборкой и публикацией Docker-образа, обеспечивая проверку качества кода перед каждым развёртыванием.

Как это работает

Деплой и production знаменито прост: go build создаёт один статический бинарь, запускаемый на любом хосте с тем же OS+arch. Кросс-компиляция через GOOS=linux GOARCH=amd64 go build. Контейнеризуйте бинарь через FROM scratch или FROM gcr.io/distroless/static (несколько МБ total). go build -ldflags="-s -w" — для удаления debug-символов (меньше бинарь). Health-эндпойнты: /healthz, /readyz. Graceful shutdown через http.Server.Shutdown(ctx).

Когда применять

Multi-stage Dockerfile: builder-образ гонит go build; runner — scratch или distroless с одним бинарём + CA-сертификатами. Всегда graceful SIGTERM — drain in-flight запросы до выхода. Версию встраивайте через -ldflags "-X main.Version=$(git describe)" для вывода myapp version. Запуск под non-root, read-only ФС, минимальные capabilities.

Типичные ошибки

Ловушки Деплой и production: FROM alpine, но компиляция против glibc (CGO_ENABLED=1 + alpine = мистические крэши — используйте CGO_ENABLED=0); нет CA-сертификатов в scratch-образах (TLS валится x509-ошибками — добавьте ca-certificates); нет graceful shutdown (k8s rolling-деплои дропают in-flight запросы); огромные бинари из-за забытых -w -s-флагов.

Связанные понятия

Полезные ресурсы