fix: ограничить PostgreSQL backup одним еженедельным dump #51
Reference in New Issue
Block a user
Delete Branch "fix/backup-retention"
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?
Убран backup из каждого production deploy.
pg_dumpallдля полного PostgreSQL-кластера.miem_workers.Локально прошли
sh -nиnode --check; pytest не запущен, так как pytest отсутствует в окружении.Request changes.
app/version.py:1-3содержит0.8.13, ноtests/test_api.py:21,pyproject.toml:3иREADME.md:138всё ещё ожидают/указывают0.8.12.test_health_returns_versionsсравнивает API с0.8.12, поэтому jobpytestне может пройти. Синхронизировать все источники версии и expectation..gitea/workflows/ci.yml:83-91: release архив распаковывается tar’ом прямо поверх$PROD_PATH, затем выполняютсяdocker compose up, runtime check и healthcheck. При ошибке во время распаковки/сборки/запуска каталог может остаться смешанным или частично обновлённым, а работающий сервис — на старой/неполной сборке. Нужна распаковка в отдельный release directory с атомарным switch либо явный rollback..gitea/workflows/ci.yml:87,infra/postgres-backup.sh:5-7,17: cron устанавливается дляPROD_USER, но backup и cleanup используют/home/codexи/srv/miem_workers. При любом другомPROD_USERзадача либо пишет не в его home, либо не имеет доступа. Передать пути из deploy-конфига или валидировать обязательное равенство пользователя..gitea/workflows/ci.yml:11-25,infra/install-postgres-backup-cron.sh:1-9,infra/postgres-backup.sh:1-18: CI запускает pytest и JS syntax check, но неsh -nдля скриптов; нет теста idempotent cron, atomicmv, empty/failed dump и cleanup failure cases. Добавить минимальную shell syntax/smoke проверку.Проверен полный diff
main...384cd550; новый dump действительно создаётся временно, проверяется черезtest -s, атомарно заменяется черезmv, а старыеmiem_workers-*.sqlудаляются только после успешного dump. Секреты в diff не добавляются.Request changes.
Исправлено:
0.8.13согласована вapp/version.py,pyproject.toml, README иtests/test_api.py;/home/codex/фиксированного script path устранён: backup использует$HOME, а cron installer вычисляетapp_dir.Оставшиеся findings:
.gitea/workflows/ci.yml:84-98: tar-архив распаковывается прямо поверх$PROD_PATH, после чего выполняются Compose/runtime/health checks. Сбой оставляет частично смешанный release без восстановления предыдущего состояния. Нужен отдельный release directory и атомарный switch либо rollback..gitea/workflows/ci.yml:26:sh -n infra/postgres-backup.sh infra/install-postgres-backup-cron.shпередаёт второй путь как positional argument первому shell, поэтому syntax error во втором файле не будет обнаружен. Запускатьsh -nотдельно для каждого файла.infra/install-postgres-backup-cron.sh:9: stdout/stderr перенаправлены в/dev/null, аflock -nмолча пропускает запуск при занятом lock. При поломке cron/docker/pg_dumpall backup может неделями отсутствовать незамеченным. Нужен хотя бы persistent log/monitoring или проверяемый сигнал успешного backup.Проверен полный diff
main...b933f95и backup flow: dump полный черезpg_dumpall, временный файл проверяетсяtest -s, замена черезmvатомарна, старые deploy-backups удаляются только после успешной замены. Секреты в diff не добавляются.No blocking findings.
Повторно проверен полный diff
main...69c1dd5и backup workflow:0.8.14в runtime,pyproject.toml, README и API test;app_dir, ожидает lock до 1 часа и логирует failure/skip через syslog;pg_dumpallсохраняет полный cluster dump в temp-файл сumask 077, проверкойtest -sи атомарнымmvв тот же каталог;sh -nдля каждого нового скрипта;Статические проверки прошли:
git diff --checkи оба shell script черезsh -n. Pre-existing deploy rollback намеренно не оценивается по scope ревью.