Какие инструменты используются для деплоя Go-приложения в продакшн
Что проверяют
Доводили ли вы Go-сервис до продакшна сами и знаете ли особенности именно Go: статический бинарник, поведение в контейнере, корректную остановку. Список модных инструментов без этого звучит пусто. Следом обычно спрашивают, как вы откатываетесь и что происходит с запросами во время выкатки.
Как отвечать
Пройдите по цепочке от сборки до наблюдения:
- сборка:
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w -X main.version=$VERSION"даёт статический бинарник без отладочной информации и с версией внутри; - образ: многоэтапный Dockerfile, финальный слой
scratchилиdistroless/static, образ весит единицы или десятки мегабайт. Без Dockerfile образ собираетko, релизы бинарников делает GoReleaser; - CI: GitLab CI или GitHub Actions прогоняют
go test -race,golangci-lintиgovulncheck, затем собирают и пушат образ; - выкатка: Kubernetes с Helm или Kustomize, часто по GitOps через Argo CD или Flux. Для простых сервисов systemd-юнит на ВМ, которую настраивает Ansible, а инфраструктуру описывает Terraform;
- остановка:
signal.NotifyContextнаSIGTERMиhttp.Server.Shutdown(ctx), чтобы дообслужить активные запросы заterminationGracePeriodSeconds(по умолчанию 30 секунд); - ресурсы: с Go 1.25
GOMAXPROCSучитывает CPU-лимит cgroup, аGOMEMLIMITстоит выставить чуть ниже лимита памяти контейнера, чтобы сборщик мусора ужимал кучу до OOMKilled; - наблюдение:
/metricsчерезclient_golangдля Prometheus, трейсы через OpenTelemetry,net/http/pprofна отдельном закрытом порту.
Где спотыкаются
Кладут бинарник в scratch и получают x509: certificate signed by unknown authority на первом HTTPS-запросе. В образ нужно скопировать корневые сертификаты, а для часовых поясов подключить time/tzdata.
Не обрабатывают SIGTERM. Под Kubernetes процесс получает сигнал, а по истечении грейс-периода SIGKILL: активные запросы обрываются, и каждая выкатка даёт всплеск 5xx.
Называют Go Modules инструментом деплоя. Модули управляют зависимостями, для воспроизводимой сборки важны go.sum и закреплённая версия тулчейна в go.mod, а не сам факт их наличия.