feat(mera/b2c): публичный периметр МЕРЫ — свой API, отдельный экран оценки, короткие адреса #2913

Merged
lekss361 merged 6 commits from feat/mera-public-api into main 2026-08-16 07:25:24 +00:00
Showing only changes of commit eb7ac3d326 - Show all commits

View file

@ -78,16 +78,31 @@ jobs:
# obsidian, status. То есть цена опечатки в этом файле — полный
# даунтайм, а гейта на неё не было.
#
# `docker run`, а не установка caddy в раннер: тот же образ `caddy:2`,
# что стоит в docker-compose.prod.yml — проверяем ровно тем парсером,
# который будет читать конфиг на проде. Docker на раннере есть (им же
# поднимается Postgres в ci-tradein.yml).
# `docker cp`, а НЕ `-v "$PWD:/etc/caddy"`. Job сам исполняется внутри
# контейнера, и `docker run` создаёт КОНТЕЙНЕР-БРАТ на том же демоне:
# путь в `-v` резолвится на ХОСТЕ, а `$PWD` — это путь внутри job-
# контейнера, которого на хосте нет. Первая версия этого шага так и
# упала: `open /etc/caddy/Caddyfile: no such file or directory`.
# Копирование не зависит от того, как смонтирован workspace.
#
# Образ тот же `caddy:2`, что в docker-compose.prod.yml — проверяем ровно
# тем парсером, который будет читать конфиг на проде.
#
# Копируем и `caddy/` — Caddyfile делает `import caddy/users.caddy.snippet`,
# и без него validate упадёт на импорте (файл в репозитории есть).
#
# Плейсхолдеры окружения ({env.*}) при validate резолвятся в пустую
# строку — это нормально, синтаксис от их значений не зависит.
run: |
docker run --rm -v "$PWD:/etc/caddy" caddy:2 \
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
set -euo pipefail
cid=$(docker create -w /work caddy:2 \
caddy validate --config /work/Caddyfile --adapter caddyfile)
docker cp Caddyfile "$cid:/work/Caddyfile"
docker cp caddy "$cid:/work/caddy"
rc=0
docker start -a "$cid" || rc=$?
docker rm -f "$cid" >/dev/null
exit "$rc"
- name: "Guard: блокирующий DDL без lock_timeout (#2752)"
# Тем же шагом-соседом и по той же причине: гейт бежит на КАЖДОМ PR,