chore(ci): синхронизировать /opt/gendesign на остающемся хосте #3071
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3071
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/deploy-infra-host"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Закрывает пункт «чем обновлять
/opt/gendesignна Beget после сменыDEPLOY_HOST» из #3059.Проблема
deploy.ymlходит по SSH наsecrets.DEPLOY_HOSTи жёстко пересинхронизирует там рабочее дерево. Сегодня это Beget, поэтому и прод, и инфраструктура обновляются одним проходом.После 30.08
DEPLOY_HOSTстанет указывать на Selectel — и/opt/gendesignна Beget перестанет обновляться совсем. Молча: ни ошибки, ни падения пайплайна, ни строчки в логе.А из этого каталога на Beget продолжат работать:
ops/backup.sh,ops/backup-forgejo.sh,ops/check-backup-staleness.sh,ops/lib-backup.sh,ops/docker-prune.shdocker-compose.prod.ymlдля Forgejo / GlitchTip / CouchDBCaddyfile+caddy/sites/infra.caddygit/errors/obsidian(#3062)То есть любая будущая правка этих файлов легла бы в
mainи никогда не доехала до машины, которая их исполняет.Это ровно класс #2887 — тот самый, из-за которого в
paths:появился глобops/*.shс комментарием «скрипт запускается на VM по cron из /opt/gendesign/ops/, куда попадает только через жёсткую пересинхронизацию шага деплоя. Без этой строки правка лежала бы в main, а cron месяцами исполнял бы старую версию — молча и без единого сигнала». Здесь то же самое, но не на уровне одного файла, а на уровне целого хоста.Решение
Отдельный workflow
deploy-infra.yml, инертный пока не заданINFRA_DEPLOY_HOST.Почему отдельный, а не job в
deploy.yml: разные адресаты и разные вердикты. «Выкатили продукт на Selectel» и «синхронизировали инфру на Beget» — независимые факты, и падение второго не должно читаться как неудавшийся деплой продукта. Триггеры тоже разные — инфра-хосту не нужны пересборкиbackend/**иfrontend/**, поэтому вpaths:только то, что там реально исполняется.Почему гейт: сегодня Beget и есть
DEPLOY_HOST. Второй проход по тому же хосту был бы лишним и мог бы состязаться с основным деплоем за докер-демон (#2950 — взаимное исключение докер-секций двух прод-деплоев). Включается одной настройкой в момент, когда хосты разъедутся.Что намеренно НЕ делает
ops/docker-prune.sh.reload, а неrecreate. Конфиг примонтирован read-only, контейнер читает тот же файл, который только что обновил git. Невалидный конфиг откажет громко, а старый продолжит работать — то есть падение здесь не роняетgit/errors/obsidian.Test plan
push+workflow_dispatch),pathsи оба шага — те, что задуманыINFRA_DEPLOY_HOST→enabled=falseи job ничего не делает; заданный →enabled=trueЧто нужно от тебя в момент переезда
Задать в секретах Actions:
Плюс, если у остающегося хоста будут отдельные креды —
INFRA_DEPLOY_USER/INFRA_DEPLOY_SSH_KEY/INFRA_DEPLOY_PORT. Если их не задать, workflow берёт те жеDEPLOY_*через||-фолбэк.⚠️ Одно место, которое я не смог проверить: поддерживает ли Forgejo Actions (
act_runner) выражениеsecrets.A || secrets.Bвwith:. В GitHub Actions это штатно, здесь — вероятно тоже, но без прогона утверждать не буду. Если фолбэк не сработает, лечится заданием всех четырёхINFRA_*явно.Refs #3059, #3057, #3029
После переезда 30.08 `secrets.DEPLOY_HOST` станет указывать на Selectel — и рабочее дерево /opt/gendesign на Beget перестанет обновляться совсем. Молча: ни ошибки, ни падения пайплайна. А оттуда на Beget продолжат работать: - cron-скрипты бэкапов (backup.sh, backup-forgejo.sh, check-backup-staleness.sh, lib-backup.sh, docker-prune.sh) - docker-compose.prod.yml для Forgejo / GlitchTip / CouchDB - Caddyfile + caddy/sites/infra.caddy — единственный публичный вход для git / errors / obsidian (#3062) Любая будущая правка этих файлов легла бы в main и никогда не доехала до машины, которая их исполняет. Это класс #2887 («скрипт запускается по cron из /opt/gendesign, куда попадает только через жёсткую пересинхронизацию дерева на шаге деплоя»), но не на уровне одного файла, а на уровне целого хоста. Отдельный workflow, а не job в deploy.yml: разные адресаты и разные вердикты — «выкатили продукт на Selectel» и «синхронизировали инфру на Beget» независимы, и падение второго не должно читаться как неудавшийся деплой продукта. Триггеры тоже разные: инфра-хосту не нужны пересборки backend/frontend. ИНЕРТЕН, пока не задан INFRA_DEPLOY_HOST. Сегодня Beget и есть DEPLOY_HOST, второй проход по тому же хосту был бы лишним и мог бы состязаться с основным деплоем за докер-демон (#2950). Включается одной настройкой в момент, когда хосты разъедутся. Намеренно НЕ делает: прун образов (конкурирует за leases докер-демона, #2950) и перезапуск Forgejo/GlitchTip/CouchDB (правка ops-скрипта не повод ронять git). Caddy — reload, а не recreate: невалидный конфиг откажет громко, старый продолжит работать. Проверено: YAML разбирается, триггеры и paths те, что задуманы, шагов 2; гейт прогнан обеими ветками (пустой секрет -> enabled=false, заданный -> enabled=true). Refs #3059, #3057, #3029