refactor(compose): отделены локальные настройки от фактов стенда

- Зачем:
  - устранены дублирование значений и тихая подстановка неполной настройки.
- Что:
  - версии образов и внутренняя топология закреплены рядом с местом использования.
  - имя экземпляра, внешние порты, учётные данные и ключи сделаны обязательными настройками .env.
  - быстрый старт, Dockerfile и статическая проверка приведены к новой границе.
- Проверка:
  - make config-test.
  - docker build для образов Airflow и Superset без аргументов.
  - make up; make smoke; make check-clickhouse; make check-services.
This commit is contained in:
2026-08-08 20:50:35 +03:00
parent 5d012cc222
commit 704c139d5a
6 changed files with 68 additions and 87 deletions
+11 -7
View File
@@ -11,23 +11,27 @@ cleanup() {
trap cleanup EXIT
"${COMPOSE_CMD[@]}" --project-directory "$ROOT_DIR" config --quiet
config_json="$("${COMPOSE_CMD[@]}" --project-directory "$ROOT_DIR" config --format json)"
"${COMPOSE_CMD[@]}" \
--project-directory "$ROOT_DIR" \
--env-file "$ROOT_DIR/.env.example" \
config --quiet
config_json="$(
"${COMPOSE_CMD[@]}" \
--project-directory "$ROOT_DIR" \
--env-file "$ROOT_DIR/.env.example" \
config --format json
)"
# Контекст сборки образов — корень репозитория, и локальный `.env` с настоящими
# паролями уехал бы в слой образа молча. Это единственная здешняя ошибка, о
# которой никто не узнает, пока образ не окажется у чужого.
for private_path in '.env' '.env.*' '*.pem' '*.key' '*.crt' 'secrets/' 'credentials/'; do
grep -qxF "$private_path" "$ROOT_DIR/.dockerignore"
done
grep -qx 'ARG SUPERSET_BASE_IMAGE' "$ROOT_DIR/infra/superset/Dockerfile"
jq -e '
.services.superset.image == "clickstream-superset:local" and
(.services.superset.build.args.SUPERSET_BASE_IMAGE | length > 0)
.services.superset.image == "clickstream-superset:local"
' >/dev/null <<<"$config_json"
grep -qx 'ARG AIRFLOW_BASE_IMAGE' "$ROOT_DIR/infra/airflow/Dockerfile"
jq -e '
.services["airflow-init"].image == "clickstream-airflow:local" and
(.services["airflow-init"].build.args.AIRFLOW_BASE_IMAGE | length > 0) and
all(
.services[];
((.environment // {}) | has("_PIP_ADDITIONAL_REQUIREMENTS") | not)