Волт Obsidian живёт на Beget вместе с Forgejo и GlitchTip и там же остаётся.
А deploy-obsidian.yml ходил на secrets.DEPLOY_HOST безусловно — тот самый
секрет, который 30.08 будет переставлен на Selectel.
Значит в день переезда этот workflow молча сменил бы адресата: git reset на
/opt/gendesign продуктового хоста и docker compose стека CouchDB там же, а
волт на Beget тем временем перестал бы обновляться. Без единой ошибки —
деплой зелёный, машина другая. Файл сам это признавал в шапке: проблема была
описана и намеренно оставлена, потому что прошлая правка касалась подлинности
хоста, а не маршрутизации.
Теперь адресат берётся как INFRA_DEPLOY_HOST с фолбэком на DEPLOY_HOST. До
разъезда это одна машина, поэтому сегодня не меняется ничего; после — workflow
остаётся на инфраструктурном хосте без правки файла в горячий момент. Схема
и фолбэки user/key/port скопированы с deploy-infra.yml, чтобы два файла про
один и тот же хост не расходились в поведении.
Отпечаток выбирается В ПАРЕ с адресатом, отдельным шагом с явным if. Соблазн
написать `secrets.INFRA_FP || secrets.DEPLOY_FP` — ловушка: если инфра-хост
задан, а его отпечаток нет, выражение свалится на отпечаток другой машины, и
ssh откажет со сверкой ключа Beget'а против отпечатка Selectel'а. Перекрёстного
фолбэка здесь нет и быть не должно — ровно как в deploy-infra.yml.
Отпечаток идёт вниз через output шага: это публичный хеш ключа хоста, не
секрет. Приватный ключ так передавать нельзя, он остался прямой ссылкой на
секрет.
$GITHUB_OUTPUT — построчный формат «ключ=значение», поэтому перевод строки
внутри значения означает инъекцию произвольного output'а. Отпечаток
однострочный по определению, но в поле секрета лишний перевод строки попадает
копипастой на раз — шапка файла об этом предупреждает отдельно. Проверка
падает с внятным текстом вместо тихой подмены: молча вычищать нельзя, сверка
побайтовая и trim изменил бы результат.
Проверено: YAML парсится, шаг проходит bash -n, поведение прогнано на трёх
значениях — нормальный отпечаток даёт rc=0 и строку про сверку, пустой даёт
предупреждение и не роняет деплой (как сегодня), значение с переводом строки
отбивается с rc=1.
Refs #3062, #3029, #3057