fix(ops): страж повторной заливки перестал молча пропускаться #3092

Merged
lekss361 merged 1 commit from fix/3061-appini-path into main 2026-08-25 06:44:42 +00:00
Owner

Summary

  • assert_not_cut_over в ops/split-infra-postgres.sh не давал --force-restore залить устаревший дамп поверх данных, записанных после cutover. Одна из двух его проверок молча не срабатывала.
  • Путь считался как ${FORGEJO_DIR}/app.ini, но FORGEJO_DIR — каталог со стеком (compose, раннеры). Конфиг живёт в томе данных: на боевом хосте /home/gendesign/forgejo/data/forgejo/data, то есть .../data/forgejo/gitea/conf/app.ini. Файла по старому пути нет.
  • Проверка написана как [[ -r "$ini" ]] && grep ... — несуществующий файл читался как «признака cutover нет».
  • Теперь путь ищется по трём кандидатам, переопределяется через FORGEJO_APP_INI, а ненайденный конфиг останавливает скрипт: это не «признака нет», а «проверить нечем».
  • Поправлены два места в раннбуке на выходе скрипта, печатавшие тот же несуществующий путь.

Test plan

  • bash -n
  • на боевом Beget: автоопределение находит data/forgejo/gitea/conf/app.ini, строка HOST читается, признак cutover определяется корректно (нет)
  • старый путь ${FORGEJO_DIR}/app.ini подтверждённо не существует
  • сухой прогон ops/split-infra-postgres.sh — после того как на хосте появятся пароли #3061

Refs #3061, #3057

## Summary - `assert_not_cut_over` в `ops/split-infra-postgres.sh` не давал `--force-restore` залить устаревший дамп поверх данных, записанных после cutover. Одна из двух его проверок **молча не срабатывала**. - Путь считался как `${FORGEJO_DIR}/app.ini`, но `FORGEJO_DIR` — каталог со стеком (compose, раннеры). Конфиг живёт в томе данных: на боевом хосте `/home/gendesign/forgejo/data/forgejo` → `/data`, то есть `.../data/forgejo/gitea/conf/app.ini`. Файла по старому пути **нет**. - Проверка написана как `[[ -r "$ini" ]] && grep ...` — несуществующий файл читался как «признака cutover нет». - Теперь путь ищется по трём кандидатам, переопределяется через `FORGEJO_APP_INI`, а ненайденный конфиг **останавливает скрипт**: это не «признака нет», а «проверить нечем». - Поправлены два места в раннбуке на выходе скрипта, печатавшие тот же несуществующий путь. ## Test plan - [x] `bash -n` - [x] на боевом Beget: автоопределение находит `data/forgejo/gitea/conf/app.ini`, строка `HOST` читается, признак cutover определяется корректно (нет) - [x] старый путь `${FORGEJO_DIR}/app.ini` подтверждённо не существует - [ ] сухой прогон `ops/split-infra-postgres.sh` — после того как на хосте появятся пароли #3061 Refs #3061, #3057
lekss361 added 1 commit 2026-08-25 06:18:14 +00:00
fix(ops): страж повторной заливки перестал молча пропускаться
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
a0539cf865
assert_not_cut_over защищает от --force-restore после cutover: такая заливка
дропает объекты и льёт заново из дампа, уничтожая всё, что приложения записали
после переключения, а сверка фазы 5 подтверждает это как успех — записей,
сделанных после cutover, в источнике никогда не было. Единственная защита —
не дать запуститься.

Страж состоит из двух проверок, и одна из них не работала. Путь считался как
${FORGEJO_DIR}/app.ini, но FORGEJO_DIR — это каталог со стеком: там
docker-compose.yml и раннеры. Конфиг живёт внутри тома данных. На боевом хосте
проверено: /home/gendesign/forgejo/data/forgejo монтируется в контейнер как
/data, то есть app.ini лежит в
/home/gendesign/forgejo/data/forgejo/gitea/conf/app.ini, а /home/gendesign/
forgejo/app.ini не существует вовсе.

Проверка написана как `[[ -r "$ini" ]] && grep ...`, поэтому несуществующий
файл читался как «признака cutover нет». Молча, без единого сообщения.

Теперь путь ищется по трём кандидатам и переопределяется через FORGEJO_APP_INI.
А если не нашёлся ни один — скрипт останавливается, а не продолжает. Ненайденный
конфиг это не «признака нет», это «проверить нечем»: именно здесь пропуск стоит
данных, записанных после переключения.

Заодно поправлены два места в раннбуке на выходе скрипта, которые печатали тот
же несуществующий путь как инструкцию человеку.

Проверено на боевом Beget: автоопределение находит
data/forgejo/gitea/conf/app.ini, строка HOST читается, признак cutover
корректно определяется как отсутствующий; старый путь подтверждённо не
существует.

Refs #3061, #3057
lekss361 merged commit 12e48a7783 into main 2026-08-25 06:44:42 +00:00
lekss361 deleted branch fix/3061-appini-path 2026-08-25 06:44:42 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3092
No description provided.