fix(deploy): надёжный рендер шаблонов и устойчивый цикл подстановки

- render_template: значения передаются через окружение (envsubst), а не
  подставляются в variadic-аргументы — многострочные значения больше не
  ломают разбор, неполный список не уводит bash в бесконечный цикл
- export "$pair": bash сам разбирает KEY=value (было export "${pair}")
- шаблоны переведены на ${VAR}-синтаксис, добавлен compose.test.yaml.tpl
  для тестового режима установщика (--skip-tls без публикации портов)
- dry-run не требует root и работает вне Linux (проверка ОС пропускается)
- install.sh: учитываются --livekit-*-порты и --turn-*-порты в livekit.yaml,
  исправлено экранирование апострофа в итоговой сводке
- scripts/debug-install.sh: трассировка установщика в контейнере
This commit is contained in:
2026-09-19 19:26:26 +03:00
parent 2bf7101f2d
commit 99e0f72844
13 changed files with 355 additions and 116 deletions
+22 -8
View File
@@ -16,6 +16,10 @@ export GOMODCACHE:= $(CACHE_DIR)/go-mod
export GOPATH := $(CACHE_DIR)/gopath
export GOTOOLCHAIN := local
export GOLANGCI_LINT_CACHE := $(CACHE_DIR)/golangci-lint
# Сети без доступа к storage.googleapis.com (например, домашний сервер) не могут
# скачать модули через proxy.golang.org; goproxy.io работает как fallback.
export GOPROXY ?= https://proxy.golang.org,direct
export GOSUMDB ?= sum.golang.org
export CGO_ENABLED ?= 1
GOFLAGS_LOCAL := -trimpath
@@ -24,7 +28,10 @@ GO_LDFLAGS := -s -w \
-X main.commit=$(COMMIT) \
-X main.buildDate=$(BUILD_DATE)
TOOLS := $(BIN_DIR)/golangci-lint $(BIN_DIR)/gofumpt $(BIN_DIR)/sqlc $(BIN_DIR)/goose $(BIN_DIR)/govulncheck $(BIN_DIR)/gitleaks
# Инструмент берётся из .cache/bin; если он уже установлен в системе
# (PATH), повторная установка не нужна — это важно для CI и серверов,
# где сборка инструментов из исходников недоступна.
SYSTEM_TOOLS := golangci-lint gofumpt sqlc goose govulncheck gitleaks
export PATH := $(BIN_DIR):$(PATH)
GO_PACKAGES := ./cmd/... ./internal/...
@@ -43,10 +50,15 @@ help: ## Показать список целей
@printf '\nПрофиль: %s | Кэш: %s\n' "$${PROFILE:-auto}" "$(CACHE_DIR)"
.PHONY: tools
tools: $(TOOLS) ## Установить зафиксированные dev-инструменты в .cache/bin
$(CACHE_DIR):
tools: ## Установить dev-инструменты в .cache/bin (уже установленные в системе пропускаются)
@mkdir -p $(CACHE_DIR) $(BIN_DIR)
@for tool in $(SYSTEM_TOOLS); do \
if command -v $$tool >/dev/null 2>&1; then \
printf ' ok %-16s %s\n' "$$tool" "$$(command -v $$tool)"; \
else \
$(MAKE) --no-print-directory $(BIN_DIR)/$$tool || exit 1; \
fi; \
done
$(BIN_DIR)/golangci-lint: | $(CACHE_DIR)
@echo "==> install golangci-lint v2.13.2"
@@ -54,11 +66,11 @@ $(BIN_DIR)/golangci-lint: | $(CACHE_DIR)
$(BIN_DIR)/gofumpt: | $(CACHE_DIR)
@echo "==> install gofumpt"
@GOBIN=$(BIN_DIR) go install mvdan.cc/gofumpt@v0.11.0
@GOBIN=$(BIN_DIR) go install mvdan.cc/gofumpt@v0.12.0
$(BIN_DIR)/sqlc: | $(CACHE_DIR)
@echo "==> install sqlc"
@GOBIN=$(BIN_DIR) go install github.com/sqlc-dev/sqlc/cmd/sqlc@v1.30.0
@GOBIN=$(BIN_DIR) go install github.com/sqlc-dev/sqlc/cmd/sqlc@v1.31.1
$(BIN_DIR)/goose: | $(CACHE_DIR)
@echo "==> install goose"
@@ -66,11 +78,11 @@ $(BIN_DIR)/goose: | $(CACHE_DIR)
$(BIN_DIR)/govulncheck: | $(CACHE_DIR)
@echo "==> install govulncheck"
@GOBIN=$(BIN_DIR) go install golang.org/x/vuln/cmd/govulncheck@latest
@GOBIN=$(BIN_DIR) go install golang.org/x/vuln/cmd/govulncheck@v1.1.4
$(BIN_DIR)/gitleaks: | $(CACHE_DIR)
@echo "==> install gitleaks"
@GOBIN=$(BIN_DIR) go install github.com/zricethezav/gitleaks/v8@latest
@GOBIN=$(BIN_DIR) go install github.com/zricethezav/gitleaks/v8@v8.30.0
.PHONY: dev
dev: ## Запустить сервер локально (данные в ./build/dev-data)
@@ -166,6 +178,8 @@ docker-build: ## Собрать образ приложения
--build-arg VERSION=$(VERSION) \
--build-arg COMMIT=$(COMMIT) \
--build-arg BUILD_DATE=$(BUILD_DATE) \
--build-arg GOPROXY=$(GOPROXY) \
--build-arg GOSUMDB=$(GOSUMDB) \
-t $(DOCKER_IMAGE):$(DOCKER_TAG) .
.PHONY: install-dry-run