gendesign/ops/crontab-beget.cron
bot-backend e576f8c256
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m1s
CI / backend-tests (pull_request) Successful in 17m15s
chore(ops): развести crontab по хостам под переезд
Сегодняшний crontab Beget'а обслуживает ОБА контура сразу — и остающийся
(Forgejo), и уезжающий (tradein/gendesign). После 30.08 это перестанет
быть верным, а сам crontab об этом не узнает.

Пять записей начнут ходить в контейнеры, которых на Beget больше нет:

  0  5 * * *  backfill_houses_dadata      docker exec tradein-backend
  30 5 * * *  geocode_deals_from_houses   docker exec tradein-backend
  45 5 * * *  geocode_deals_nominatim     docker exec tradein-backend
  30 4 * * *  backup-tradein-db.sh        dump из tradein-postgres
  30 3 * * *  ops/backup.sh               dump из gendesign-postgres

Падающие по ночам задачи — ещё полбеды. Хуже, что вместе с ними перестанут
обновляться sentinel'ы бэкапов; сторож честно это заметит и упрётся в то,
что канал оповещения не настроен (#2203: TELEGRAM_* нет ни в одном
env-файле). То есть бэкапы обоих продуктовых кластеров пропадут МОЛЧА.

Зеркальный и более опасный случай: если на Poincare crontab не установить
вовсе, там не будет НИ ОДНОГО бэкапа — и узнать об этом неоткуда, потому
что сторож пропущенных прогонов живёт в том же crontab'е. Отсутствие
бэкапов обнаружилось бы в момент, когда они понадобятся.

Поэтому два эталонных файла, а не инструкция в раннбуке: переход должен
быть явным действием (`crontab ops/crontab-<хост>.cron`), а не «забыли
поправить».

Разбор по хостам:
  Beget    — backup-forgejo.sh + его сторож + docker-prune (здесь остаются
             CI-раннеры, их тома и растут)
  Poincare — оба продуктовых бэкапа + два их сторожа + три задачи
             обогащения/геокодирования + СВОЙ docker-prune

docker-prune нужен на обоих: на Beget он чистит тома раннеров, на Poincare
образы продуктового стека. Это не «переехавшая» запись, а две разные.

Заодно логи переведены с /tmp на /opt/gendesign/logs: половина записей
писала в /tmp, который чистится при перезагрузке — именно поэтому историю
отказов бэкапов раньше не удавалось восстановить.

Времена оставлены прежние: чтобы при разборе後 переезда не гадать, что
изменилось — поведение или расписание.

`ops/*.cron` добавлен в paths deploy.yml: файлы не исполняются деплоем, но
должны физически лежать в /opt/gendesign, иначе в окне их нечем будет
установить (тот же класс, что #2887).

Проверено: 11 расписаний разобраны построчно — 5 полей + команда, ошибок 0;
deploy.yml остаётся валидным YAML.

Refs #3059, #3057, #2203
2026-08-24 04:46:18 +03:00

45 lines
3.8 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# crontab ОСТАЮЩЕГОСЯ хоста (Beget, 46.173.16.127) — после переезда 30.08.
#
# Устанавливать НЕ РАНЬШЕ, чем стек уедет на Selectel:
# crontab /opt/gendesign/ops/crontab-beget.cron
# crontab -l # сверить
#
# ЗАЧЕМ ЭТОТ ФАЙЛ. Сегодняшний crontab Beget'а обслуживает ОБА контура сразу:
# и остающийся (Forgejo), и уезжающий (tradein/gendesign). После переезда пять
# записей начнут ходить в контейнеры, которых на этом хосте больше нет —
# `docker exec tradein-backend ...` будет падать каждую ночь. Само по себе это
# ещё полбеды; беда в том, что вместе с ними перестанут обновляться sentinel'ы
# бэкапов, сторож это честно заметит — и упрётся в то, что канал оповещения
# не настроен (#2203: TELEGRAM_* нет ни в одном env-файле). То есть бэкапы
# пропадут молча.
#
# Разделение на два файла — чтобы этот переход был явным действием, а не
# «забыли поправить crontab».
# ── Forgejo: остаётся здесь ─────────────────────────────────────────────────
# Конфиг лежит не в /etc/default (туда нет доступа без root), а в
# /opt/gendesign/secrets — путь передаётся переменной.
15 4 * * * FORGEJO_BACKUP_ENV_FILE=/opt/gendesign/secrets/forgejo-backup.env bash /opt/gendesign/ops/backup-forgejo.sh >> /opt/gendesign/logs/backup-forgejo.log 2>&1
# Сторож пропущенных прогонов для forgejo-бэкапа. Порог 26ч.
0 * * * * bash /opt/gendesign/ops/check-backup-staleness.sh /opt/gendesign/backups/forgejo/.last_success 26 "forgejo backup" >> /opt/gendesign/logs/backup-staleness.log 2>&1
# ── Уборка докера ───────────────────────────────────────────────────────────
# Остаётся здесь, потому что здесь остаются CI-раннеры (#2881) — именно их
# тома и растут. На Selectel нужна СВОЯ такая же запись (см. crontab-poincare).
0 4 * * 0 bash /opt/gendesign/ops/docker-prune.sh >> /tmp/gendesign-docker-prune.log 2>&1
# ── ЧТО ОТСЮДА УБРАНО И ПОЧЕМУ ──────────────────────────────────────────────
# Все записи ниже переехали в ops/crontab-poincare.cron, потому что обращаются
# к контейнерам и данным, которых на Beget после переезда не будет:
#
# 30 4 * * * backup-tradein-db.sh -> dump из tradein-postgres
# 30 3 * * * ops/backup.sh -> dump из gendesign-postgres
# 0 5 * * * backfill_houses_dadata -> docker exec tradein-backend
# 30 5 * * * geocode_deals_from_houses -> docker exec tradein-backend
# 45 5 * * * geocode_deals_nominatim -> docker exec tradein-backend
# 0 * * * * staleness: backups/.last_success (main-бэкап уехал)
# 0 * * * * staleness: backups/tradein/.last_success (tradein-бэкап уехал)
#
# ⚠️ Оставить их здесь = пять падающих задач в сутки И потерянные бэкапы
# обоих продуктовых кластеров.