chore(ops): развести crontab по хостам под переезд #3072
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#3072
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/crontab-split-by-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?
Закрывает пункт «crontab разведён между хостами» из #3059.
Проблема
Сегодняшний crontab Beget'а обслуживает оба контура сразу — и остающийся (Forgejo), и уезжающий (tradein / gendesign). После 30.08 это перестанет быть верным, а сам crontab об этом не узнает.
Пять записей начнут ходить в контейнеры, которых на Beget больше нет:
0 5 * * *backfill_houses_dadatadocker exec tradein-backend30 5 * * *geocode_deals_from_housesdocker exec tradein-backend45 5 * * *geocode_deals_nominatimdocker exec tradein-backend30 4 * * *backup-tradein-db.shtradein-postgres30 3 * * *ops/backup.shgendesign-postgresПадающие по ночам задачи — ещё полбеды. Хуже, что вместе с ними перестанут обновляться sentinel'ы бэкапов. Сторож честно это заметит и упрётся в то, что канал оповещения не настроен (#2203 —
TELEGRAM_*нет ни в одном env-файле). То есть бэкапы обоих продуктовых кластеров пропадут молча.Зеркальный случай опаснее. Если на Poincare crontab не установить вовсе, там не будет ни одного бэкапа — и узнать об этом неоткуда, потому что сторож пропущенных прогонов живёт в том же crontab'е. Отсутствие бэкапов обнаружилось бы ровно в тот момент, когда они понадобятся.
Решение
Два эталонных файла, а не абзац в раннбуке: переход должен быть явным действием, а не «забыли поправить crontab».
backup-forgejo.sh+ его сторож +docker-prunedocker-prunedocker-pruneнужен на обоих, и это не «переехавшая» запись, а две разные: на Beget он чистит тома CI-раннеров (#2881, они остаются), на Poincare — образы продуктового стека.Сторожа едут вместе со своими бэкапами: сторож должен жить там же, где sentinel, иначе он следит за файлом, который никто не обновляет, и кричит вечно.
Побочно исправлено
Логи переведены с
/tmpна/opt/gendesign/logs. Половина записей писала в/tmp, который чистится при перезагрузке — именно поэтому историю отказов бэкапов раньше не удавалось восстановить.Времена оставлены прежние — чтобы при разборе после переезда не гадать, что изменилось: поведение или расписание. Подгонять окна имеет смысл после того, как всё поедет стабильно.
ops/*.cronдобавлен вpaths:deploy.yml. Файлы деплоем не исполняются, но должны физически лежать в/opt/gendesign— иначе в окне их нечем будет установить. Тот же класс, что #2887.Test plan
deploy.ymlостаётся валидным YAML после правкиpaths:crontab -lна проде — учтены все 11 действующих записей, ни одна не потеряна и ни одна не продублированаЧто нужно от тебя
Кроме собственно
crontab <файл>в окне — перенести на Poincare/etc/default/gendesign-backupи/etc/default/tradein-backup. В git их нет и быть не должно, а без них дампы останутся локальными, то есть на том же диске, что и БД — ровно то, из-за чего заводился #2203.И создать каталог логов:
mkdir -p /opt/gendesign/logs.Refs #3059, #3057, #2203
Смержено, файлы доехали до прода, проверено. Заодно поправка к моему же test plan — цифра там неверная.
Проверка после деплоя
Действующий
crontab -lне тронут — как и задумано, файлы эталонные и применяются только руками в окне. Домены отвечают (gendsgn.ru401,git.gendsgn.ru200).Поправка: заданий 10, а не 11
В test plan я написал «все 11 действующих записей учтены». Это неверно — на проде их 10. Цифра 11 — это количество строк в моих двух файлах (3 + 8), и лишняя там появляется намеренно.
Пересчёт с прода, пронумерованный:
backup-tradein-db.shops/backup.shbackfill_houses_dadatageocode_deals_from_housesgeocode_deals_nominatimdocker-prune.shbackup-forgejo.shИтого: 7 переезжают, 3 остаются = 10, всё сходится.
В файлах при этом 3 (Beget) + 8 (Poincare) = 11, потому что
docker-pruneнамеренно продублирован: на Beget он чистит тома CI-раннеров (#2881, они остаются), на Poincare — образы продуктового стека. Это две разные задачи с одинаковым именем скрипта, а не одна переехавшая.Сам разбор верен: ни одна из десяти не потеряна и ни одна не продублирована случайно. Неверна была только формулировка «11 действующих» — правильно «10 действующих, 11 строк в файлах, разница — осознанный второй prune».
Извиняться за цифру не буду, но оставляю здесь, чтобы тот, кто будет сверять файлы с
crontab -lв окне, не решил, что одна запись потерялась.Проверил часовой пояс — оказалось, что я весь разбор вёл в неверном допущении, и заодно закрылся вопрос, который в PR даже не был поставлен.
Времена в crontab — местные, а не UTC
Ждал прогона
backup-forgejo.sh(15 4 * * *), считая, что это 04:15 UTC. Прогон не появлялся. Оказалось, он уже отработал в 01:15 UTC:а метка файла на диске —
Aug 24 04:15. То есть cron считает по местному времени сервера, и15 4 * * *= 04:15 MSK = 01:15 UTC.Это ровно тот случай, где расхождение между «что написано» и «когда сработает» стоило бы дорого при переезде: если на новом хосте часовой пояс окажется другим, все одиннадцать записей поедут на несколько часов, причём молча — задачи будут исправно выполняться, просто не тогда.
Проверка обоих хостов
Совпадают. Значит времена в
crontab-beget.cronиcrontab-poincare.cronпереносятся как есть, без пересчёта — и решение «оставить времена прежними», которое я принял по другой причине (чтобы при разборе не гадать, что изменилось), оказывается верным и по этой.Но это проверенный факт, а не данность: если Poincare когда-нибудь переставят на UTC — например, при переустановке ОС или по умолчанию у нового провайдера, — расписания сдвинутся на три часа. Добавил бы это отдельной строкой в раннбук #3057: перед установкой crontab сверить
timedatectlна обоих хостах.Поправка к моим же формулировкам
В нескольких местах сегодня я писал «бэкап в 04:15 UTC» и «прогон 04:15 UTC» — неверно, это 04:15 MSK. Там, где я называл время из
scrape_schedules.next_run_at(например, окно замераfloor_n_pairs06:31–07:58), ошибки нет: Postgres отдаёт эти значения с явным+00, то есть в UTC, и они не cron'овые, а планировщиковые.Практическое следствие для проверки #3073 (бэкап конфигурации Forgejo): она произойдёт не сегодня, а на прогоне 01:15 UTC / 04:15 MSK завтра — правка доехала до
/opt/gendesignв 03:51 UTC, уже после сегодняшнего прогона.