WEB board

всеканоны и докиворкеры↗ iOS↗ Легаси
WEB-490 · Задача · Инфраструктура · web

Малинка как медленная третья копия (cold standby): пассивный hetzbk warm-pull + артефакт релиза + env-пакет + DR-доки с Hetzner на Pi, с рецептом подъёма сайта на Pi при полной беде с Oracle

Закрыт P2 ведёт: —
Суть
<!-- coord-block-start 2026-09-06 -->
## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-06 UTC)
- Raspberry Pi cold standby: Hetzner warm-pull, release artifact, env-pack и DR-рецепт.
- Код/артефакты: DR/Hetzbk/Pi bundle и отчёты волн; production line не меняется.
- Посажено: Pi standby синхронизировался в l113c–l113f; done. Открыто: место, manifest/sha, возраст warm-pull.
## KNOWN ISSUES / ТРАБЛШУТИНГ
- Base/WAL не публикуется → проверить disk/free space, manifest, partial WAL → A1 был 193/193 GB, worktrees 49 GB → guard и повтор backup → инцидент 12:24Z.
- Pi не поднимает копию → проверить artifact/env-pack/warm-pull → без свежего base/WAL standby устарел → повторить pull и сверить manifest/sha.
- nginx backup ломает nginx -t → проверить sites-enabled → duplicate upstream → хранить в /etc/nginx/backups → 2279.

<!-- coord-block-end 2026-09-06 -->
## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-06 UTC)\n- Что это: Raspberry Pi как медленная третья копия/cold standby: warm-pull Hetzner backup, release artifact, env-пакет и DR-рецепт.\n- Где код/артефакты: DR-доки и bundle/backup-рецепт из волн Pi/Hetzbk; рабочая линия не меняет production.\n- Посажено/линия: l113c–l113f сопровождались hetzbk и Pi standby синхронизацией; статус тикета done.\n- Открыто: контролировать свободное место и валидность локальных копий; при полном диске backup/WAL могут остановиться, хотя сервисы продолжают работать. Волны backup/DR и отчёты координатора 06.09.\n\n## KNOWN ISSUES / ТРАБЛШУТИНГ\n- Base backup/WAL не публикуется → проверить свободное место, manifest и partial WAL → 06.09 A1 был диск 193/193 ГБ: worktrees 49 ГБ, hetzbk 45 ГБ, home 27 ГБ → guard worktrees без живой сессии, затем повторить backup; сервисы не считать сломанными автоматически → инцидент 12:24Z, guard 30 мин.\n- Pi не поднимает свежую копию → проверить наличие release artifact, env-pack и возраст warm-pull → standby синхронизируется только после корректного hetzbk base/WAL → повторить pull и сверить manifest/sha, без SSH/прод-действий.\n- Бэкап-копия nginx ломает конфигурацию → проверить, что backup не лежит в sites-enabled → nginx включает glob и получает duplicate upstream → хранить backup в /etc/nginx/backups → post-QA 2279.\n

<!-- coord-block-start 2026-09-06 -->
## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-06 UTC)\n- Что это: Raspberry Pi как медленная третья копия/cold standby: warm-pull Hetzner backup, release artifact, env-пакет и DR-рецепт.\n- Где код/артефакты: DR-доки и bundle/backup-рецепт из волн Pi/Hetzbk; рабочая линия не меняет production.\n- Посажено/линия: l113c–l113f сопровождались hetzbk и Pi standby синхронизацией; статус тикета done.\n- Открыто: контролировать свободное место и валидность локальных копий; при полном диске backup/WAL могут остановиться, хотя сервисы продолжают работать. Волны backup/DR и отчёты координатора 06.09.\n\n## KNOWN ISSUES / ТРАБЛШУТИНГ\n- Base backup/WAL не публикуется → проверить свободное место, manifest и partial WAL → 06.09 A1 был диск 193/193 ГБ: worktrees 49 ГБ, hetzbk 45 ГБ, home 27 ГБ → guard worktrees без живой сессии, затем повторить backup; сервисы не считать сломанными автоматически → инцидент 12:24Z, guard 30 мин.\n- Pi не поднимает свежую копию → проверить наличие release artifact, env-pack и возраст warm-pull → standby синхронизируется только после корректного hetzbk base/WAL → повторить pull и сверить manifest/sha, без SSH/прод-действий.\n- Бэкап-копия nginx ломает конфигурацию → проверить, что backup не лежит в sites-enabled → nginx включает glob и получает duplicate upstream → хранить backup в /etc/nginx/backups → post-QA 2279.\n
<!-- coord-block-end 2026-09-06 -->
Owner 02.09 18:52 (voice): «если отключается Oracle вообще — достаём из Hetzner на малинку и разворачиваем; забронируйте место на малинке, чтобы туда в медленном режиме всё попадало, и я мог зайти на малинку и проверить». Ответ 19:20: да, малинка = обратная копия, не зависимость (принцип no-pi-or-laptop-dependencies-except-facetime). План: (1) hetzbk на Pi в роли passive (HETZBK_ROLE=passive, warm-pull.timer каждые 10 мин: base + WAL/partial + manifests; артефакт релиза и env-пакет — как в hetzbk-rehearse discovery; docs-pack из WEB-470/1299); квоты диска на Pi (retention 1–2 base); (2) `hetzbk-rehearse` на Pi в dry-run режиме по таймеру (проверка, что копия восстановима) + раз в сутки полная песочница-репетиция на Pi (порт 3012) с чек-листом, чтобы owner мог открыть и посмотреть; (3) статус «свежесть копии на Pi» в OPS-STATUS/борде; (4) рецепт подъёма прод-сайта на Pi при потере Oracle (DNS → домашний IP, TLS, SIP-стек — по WEB409K/DR-докам). Зависимости: 1314 (warm-base fix), 1299 (docs-pack), 1300 (authority-pack). Ресурсы Pi: диск/ARM — оценить.

## ДЛЯ НУЛЕВОГО АГЕНТА (обновлено 2026-09-05 UTC)
- **Суть одной строкой:** Малинка как медленная третья копия (cold standby): пассивный hetzbk warm-pull + артефакт релиза + env-пакет + DR-доки с Hetzner на Pi, с рецептом подъёма сайта на Pi при полной беде с Oracle
- **Текущее состояние:** статус: done; Owner 02.09 18:52 (voice): «если отключается Oracle вообще — достаём из Hetzner на малинку и разворачиваем; забронируйте место на малинке, чтобы туда в медленном режиме всё попадало, и я мог зайти на малинку и проверить». Ответ 19:20: да, малинка = обратная копия, не зависимость (принцип no-pi-or… | [A1 21:20 Фабл] Волна 1366-web490pistandby поставлена (M4, Luna high): infra/pi-standby (медленный warm-pull ночью, retention 1), pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени. | [A1 22:00 Фабл] Волна 1366-web490pistandby сдана: коммит afb58e0329 (M4; infra/pi-standby: медленный warm-pull, pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени). Приёмка 1376-accweb490pistandby (M4, Sol high) → установка на Pi координатором. | [A1 04:30 Фабл] Приёмка 1408-accweb490pistandby2 = NO-GO (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY2-REPORT.md): B3 «три контура» реализованы, но (B1/B2) restore-пользователь postgres отрезан от env/secrets/settings при ownership из install.sh (0750 hetzbk:hetzbk) — команда runbook не и… | [A1 07:05 Фабл] Волна 1416-web490pistandby3 сдана: коммит 805833310f (одна копия прода, restore от root с OSUSER=postgres, контейнерная регрессия, handoff с pgctl stop). Приёмка 1431 (M4, Sol high, в очереди) → установка на Pi. | [A1 09:55 Фабл] Приёмка 1431-accweb490pistandby3 = NO-GO по одному блокеру (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY3-REPORT.md): одна копия прода, installer/ownership/root restore, handoff с pgctl stop — PASS; runbook читает mirror/current от оператора без прав → MANIFESTID пустой, пр… | [A1 10:25 Фабл] Волна 1438-web490pistandby4 сдана: коммит 0b302b7390 (чтение pointer через root, fail-closed ID, Debian-регрессия с оператором, traversable /var/lib/postgresql/16). Приёмка 1441 (M4, Sol medium, в очереди) → установка на Pi. | [M4 11:35 Фабл] Приёмка 1441 = NO-GO: позитивный Debian-сценарий PASS, но MANIFESTID «..» доходит до restore (path traversal), и preflight принимает непроходимый parent /var/lib/postgresql/16. Круг 5 = волна 1446 (M4, Luna high).
- **Кто работал:**
- 2026-09-02T21:15:36.977Z — Fable — [A1 21:20 Фабл] Волна 1366-web490pistandby поставлена (M4, Luna high): infra/pi-standby (медленный warm-pull ночью, retention 1), pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени.
- 2026-09-02T21:31:20.446Z — Fable — [A1 22:00 Фабл] Волна 1366-web490pistandby сдана: коммит afb58e0329 (M4; infra/pi-standby: медленный warm-pull, pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени). Приёмка 1376-accweb490pista
- 2026-09-02T23:37:00.264Z — Fable — [A1 04:30 Фабл] Приёмка 1408-accweb490pistandby2 = NO-GO (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY2-REPORT.md): B3 «три контура» реализованы, но (B1/B2) restore-пользователь postgres отрезан от env/secrets/set
- 2026-09-03T00:14:44.641Z — Fable — [A1 07:05 Фабл] Волна 1416-web490pistandby3 сдана: коммит 805833310f (одна копия прода, restore от root с OSUSER=postgres, контейнерная регрессия, handoff с pgctl stop). Приёмка 1431 (M4, Sol high, в очереди) → установка
- 2026-09-03T00:51:20.918Z — Fable — [A1 09:55 Фабл] Приёмка 1431-accweb490pistandby3 = NO-GO по одному блокеру (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY3-REPORT.md): одна копия прода, installer/ownership/root restore, handoff с pgctl stop — PASS
- 2026-09-03T01:05:47.157Z — Fable — [A1 10:25 Фабл] Волна 1438-web490pistandby4 сдана: коммит 0b302b7390 (чтение pointer через root, fail-closed ID, Debian-регрессия с оператором, traversable /var/lib/postgresql/16). Приёмка 1441 (M4, Sol medium, в очереди
- 2026-09-03T01:51:15.062Z — Fable — [M4 11:35 Фабл] Приёмка 1441 = NO-GO: позитивный Debian-сценарий PASS, но MANIFESTID «..» доходит до restore (path traversal), и preflight принимает непроходимый parent /var/lib/postgresql/16. Круг 5 = волна 1446 (M4, Lu
- 2026-09-03T02:47:04.108Z — Fable — [M4 Фабл] Волна 1446-web490pistandby5 сдана: коммит 63fd74ca. Приёмка 1451 (M4, Sol medium) в очереди.
- 2026-09-03T03:02:56.084Z — Fable — [M4 Фабл] Приёмка 1451-accweb490pistandby5 = NO-GO (63fd74ca): все негативы/preflight/позитив PASS, единственный блокер — mutation-check manifest runbook: container test проверяет ручную копию валидации, не production so
- 2026-09-03T03:07:57.401Z — Fable — [M4 Фабл] Волна 1455-web490pistandby6 сдана: коммит 2733dae0 (единый источник валидации MANIFESTID для runbook и container test). Приёмка 1458 (M4, Sol medium) в очереди.
- 2026-09-03T03:17:05.210Z — Fable — [M4 Фабл] Приёмка 1458-accweb490pistandby6 = NO-GO (2733dae0): единый helper и mutation-check PASS, но runbook не fail-closed — read < <(sudo helper) не передаёт статус, нет set -e, после STOP шаги идут к root restore с 
- 2026-09-03T03:36:20.522Z — Fable — [M4 Фабл] Волна 1460-web490pistandby7 сдана: коммит 4fc25277 (весь restore = один установленный fail-closed скрипт pi-standby-restore; runbook = одна команда; тест гоняет сам скрипт). Приёмка 1462 (M4, Sol high) в очеред
- 2026-09-03T03:47:14.288Z — Fable — [M4 Фабл] Приёмка 1462-accweb490pistandby7 = NO-GO (4fc25277): устройство «один fail-closed скрипт» и все runtime-негативы PASS; единственный блокер — прежний mutation-check helper стал ненаблюдаем (wrapper маскирует отк
- 2026-09-03T03:55:58.560Z — Fable — [M4 Фабл] Волна 1466-web490pistandby8 сдана: коммит 747b5fd5 (мутации трёх guards helper-а наблюдаемы сквозь wrapper). Приёмка 1468 (M4, Sol high) в очереди.
- 2026-09-03T04:05:57.972Z — Fable — [M4 Фабл] Приёмка 1468-accweb490pistandby8 = GO (независимая, Sol high): один fail-closed скрипт pi-standby-restore, все негативы до restore, mutation-check трёх guards helper-а наблюдаем. Коммит 747b5fd5 (круг 8). Далее
- 2026-09-03T04:12:33.807Z — Fable — [Pi Фабл] Установка круга 8 на живом Pi (mailhub): PG16 из PGDG (без main-кластера), порт 55433 (55432 занят docker dev-БД), секреты/knownhosts (сверено с Hetzner docs), settings tsv, unit-ы verify ok, timer включён, sft
- 2026-09-03T04:29:37.876Z — Fable — [M4 Фабл] Волна 1470-web490pistandby9 сдана: коммит 982a6f76 (плоская раскладка продюсера, порт из env). Приёмка 1472 (M4, Sol high, фикстура = реальный sftp ls) в очереди; параллельно ставлю на живой Pi и гоняю warm-pul
- 2026-09-03T04:41:53.385Z — Fable — [Pi/M4 Фабл] Круг 9 на живом Pi: base pull PASS (base-20260903T040149Z, 1.18 ГБ за 8 мин), но mirror упал: выбран старый манифест 031304Z (base 030127Z), качаются все 440 WAL-строк, включая сегменты старше base, уже удал
- 2026-09-03T05:01:45.579Z — Fable — [M4/Pi Фабл] Волна 1475-web490pistandby10 сдана: коммит 60fcd41e (порт в status/handoff, manifest-first, окно WAL от startsegment с WARN для пруненных). Приёмка 1481 (M4, Sol high) в очереди; параллельно ставлю на живой 
- 2026-09-03T05:05:57.773Z — Fable — [Pi Фабл] Круг 10 на живом Pi: manifest-first PASS (manifest-041447Z → base 040149Z), окно WAL verified (2 сегмента, WARN 441 старых пропущено), clusterstatus=OK. Остались: FATAL rc=31 «artifact target is not linux-arm64
- 2026-09-03T05:15:09.130Z — Fable — [A1 Фабл] Приёмка 1481-accweb490pistandby10 = GO (Sol, фикстура = реальный sftp ls). На живом Pi круг 10: cluster OK; круг 11 (1482) закрывает artifact target/env.
- 2026-09-03T05:26:32.506Z — Fable — [Фабл] Волна 1482-web490pistandby11 сдана: коммит cc3c7857 (target артефакта, поиск env-пакета). Приёмка 1486 (M4) в очереди; ставлю на живой Pi и гоняю status.
- 2026-09-03T05:30:42.856Z — Fable — [Фабл] ЖИВОЙ Pi: круг 11 (cc3c7857) → pi-standby-status.sh: status=OK cluster=noteclone line=l95-f7b9a4fd (cluster OK, окно WAL verified, artifactstatus=OK l95, envstatus=OK env-l95-f7b9a4fd-…). Cold standby РАБОТАЕТ на 
- 2026-09-03T05:35:00.995Z — Fable — [M4 Фабл] Волна 1487-web490pistandby12 сдана: коммит 704ac19e (текст FATAL с glob). Приёмка 1490 (M4, Sol low) в очереди; живой Pi уже на круге 11 со status=OK (l95).
- 2026-09-03T05:39:29.215Z — Fable — [M4/Pi Фабл] Приёмка 1490-accweb490pistandby12 = GO (Sol). ЛИНИЯ ПРИНЯТА: коммит 704ac19e (12 кругов). На живом Pi (mailhub) cold standby работает: status=OK line=l95-f7b9a4fd, PG16 (PGDG), порт 55433, timer раз в сутки,
- 2026-09-03T09:25:13.324Z — coordinator — 03.09 09:20Z: Pi cold standby переведён на линию l96-98a23c70 и прогрет. Статус: status=OK cluster=noteclone line=l96-98a23c70, clusterstatus=OK, artifactstatus=OK, envstatus=OK (пакет env-l96-98a23c70-20260903T090230Z.t
- 2026-09-03T09:44:26.262Z — coordinator — [пост-QA l96 на ЖИВОМ проде, 03.09 09:39-09:45Z] ПОДТВЕРЖДЕНО. Pi cold standby переведён на линию l96 и прогрет живыми данными: status=OK cluster=noteclone line=l96-98a23c70; clusterstatus=OK, artifactstatus=OK, envstatu
- 2026-09-05T01:28:25.711Z — координатор — Pi-standby 05.09 01:21Z после перевода на l106-6930c683: warm-pull FAIL rc=27 «warm base disagrees with selected manifest: expected=base-20260905T000108Z actual=base-20260905T010052Z»; status: manifest=manifest-20260904T
- 2026-09-05T01:41:11.750Z — координатор — KNOWN ISSUES / ТРАБЛШУТИНГ (правило владельца 05.09: в каждом тикете — чтобы смены не спотыкались об одно место): warm-pull rc=27 «warm base disagrees with selected manifest» = селектор взял старый манифест (22:12Z) при 
- 2026-09-05T03:30:32.366Z — coordinator — [05.09 03:30Z координатор] l107 собирается на A2 (wt-l107, кандидат 7b49e1a14 поверх 6930c683): в составе hetzbk-серия HETZBKMERGE2 (1fa1318b, 5 коммитов: manifest-authoritative recovery targets, retention по времени пуб
- 2026-09-05T04:12:59.116Z — coordinator — [05.09 04:12Z координатор] l107 (7b49e1a14) СЕЛ на прод 04:10Z: hetzbk-серия 1fa1318b в живой линии. Следующий шаг координатора: установка hetzbk-скриптов/юнитов из релиза на A1/A2 и повтор warm-pull на Pi standby.
- 2026-09-05T05:14:00.319Z — coordinator — [05.09 05:13Z координатор] Pi standby ПЕРЕВЕДЁН на l107 (06:12 Pi local / 05:12Z): artifactstatus=updated releaseid=l107-7b49e1a1 sha256=6a0f4553…, envstatus=updated package=env-l107-7b49e1a1-20260905T050552Z, mirror bas
- 2026-09-05T08:39:42.692Z — coordinator — [05.09 08:39Z координатор] Pi standby на l108 (09:38 Pi local / 08:38Z): artifactstatus=updated releaseid=l108-c3ff5d94 sha256=217843e6…, env-l108-c3ff5d94-20260905T082714Z, mirror base-20260905T080052Z + manifest-082506
- 2026-09-05T12:46:25.068Z — coordinator — [05.09 12:46Z координатор] Pi standby на l109 (13:45 Pi local / 12:45Z): artifact l109-135103a3 sha aa6a4536…, env-l109-135103a3-20260905T123248Z, clusterstatus=OK, line=l109-135103a3. Полный проход посадки (publish-rele
- **Ветки/бандлы/отчёты:** /Users/milamarty/waves/ACCWEB490PISTANDBY2-REPORT.md, /Users/milamarty/waves/ACCWEB490PISTANDBY3-REPORT.md; sha: afb58e0329, 9940e377, 805833310f, 0b302b7390, 63fd74ca, 2733dae0, 4fc25277, 747b5fd5
- **KNOWN ISSUES / ТРАБЛШУТИНГ:**
- Owner 02.09 18:52 (voice): «если отключается Oracle вообще — достаём из Hetzner на малинку и разворачиваем; забронируйте место на малинке, чтобы туда в медленном режиме всё попадало, и я мог зайти на малинку и проверить». Ответ 19:20: да, малинка = обратная копия, не зависимость (принцип no-pi-or…
- [A1 04:30 Фабл] Приёмка 1408-accweb490pistandby2 = NO-GO (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY2-REPORT.md): B3 «три контура» реализованы, но (B1/B2) restore-пользователь postgres отрезан от env/secrets/settings при ownership из install.sh (0750 hetzbk:hetzbk) — команда runbook не и…
- [A1 09:55 Фабл] Приёмка 1431-accweb490pistandby3 = NO-GO по одному блокеру (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY3-REPORT.md): одна копия прода, installer/ownership/root restore, handoff с pgctl stop — PASS; runbook читает mirror/current от оператора без прав → MANIFESTID пустой, пр…
- [A1 10:25 Фабл] Волна 1438-web490pistandby4 сдана: коммит 0b302b7390 (чтение pointer через root, fail-closed ID, Debian-регрессия с оператором, traversable /var/lib/postgresql/16). Приёмка 1441 (M4, Sol medium, в очереди) → установка на Pi.
- [M4 11:35 Фабл] Приёмка 1441 = NO-GO: позитивный Debian-сценарий PASS, но MANIFESTID «..» доходит до restore (path traversal), и preflight принимает непроходимый parent /var/lib/postgresql/16. Круг 5 = волна 1446 (M4, Luna high).
- [M4 Фабл] Приёмка 1451-accweb490pistandby5 = NO-GO (63fd74ca): все негативы/preflight/позитив PASS, единственный блокер — mutation-check manifest runbook: container test проверяет ручную копию валидации, не production source. Круг 6 = волна 1455 (M4, Luna medium): единый источник валидации, runbo…
- [M4 Фабл] Приёмка 1458-accweb490pistandby6 = NO-GO (2733dae0): единый helper и mutation-check PASS, но runbook не fail-closed — read < <(sudo helper) не передаёт статус, нет set -e, после STOP шаги идут к root restore с пустым MANIFESTID (тест скрывал своим set -Eeuo). Четвёртая находка класса «r…
- [M4 Фабл] Волна 1460-web490pistandby7 сдана: коммит 4fc25277 (весь restore = один установленный fail-closed скрипт pi-standby-restore; runbook = одна команда; тест гоняет сам скрипт). Приёмка 1462 (M4, Sol high) в очереди.
- **Эволюция:**
- 2026-09-02 → [A1 21:20 Фабл] Волна 1366-web490pistandby поставлена (M4, Luna high): infra/pi-standby (медленный warm-pull ночью, retention 1), pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени.
- 2026-09-02 → [A1 22:00 Фабл] Волна 1366-web490pistandby сдана: коммит afb58e0329 (M4; infra/pi-standby: медленный warm-pull, pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени). Приёмка 1376-accweb490pistandby (M4, Sol high) → установка на Pi ко
- 2026-09-02 → [A1 04:30 Фабл] Приёмка 1408-accweb490pistandby2 = NO-GO (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY2-REPORT.md): B3 «три контура» реализованы, но (B1/B2) restore-пользователь postgres отрезан от env/secrets/settings при ownership из install.sh (0750
- 2026-09-03 → [A1 07:05 Фабл] Волна 1416-web490pistandby3 сдана: коммит 805833310f (одна копия прода, restore от root с OSUSER=postgres, контейнерная регрессия, handoff с pgctl stop). Приёмка 1431 (M4, Sol high, в очереди) → установка на Pi.
- 2026-09-03 → [A1 09:55 Фабл] Приёмка 1431-accweb490pistandby3 = NO-GO по одному блокеру (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY3-REPORT.md): одна копия прода, installer/ownership/root restore, handoff с pgctl stop — PASS; runbook читает mirror/current от опера
- 2026-09-03 → [A1 10:25 Фабл] Волна 1438-web490pistandby4 сдана: коммит 0b302b7390 (чтение pointer через root, fail-closed ID, Debian-регрессия с оператором, traversable /var/lib/postgresql/16). Приёмка 1441 (M4, Sol medium, в очереди) → установка на Pi.
- 2026-09-03 → [M4 11:35 Фабл] Приёмка 1441 = NO-GO: позитивный Debian-сценарий PASS, но MANIFESTID «..» доходит до restore (path traversal), и preflight принимает непроходимый parent /var/lib/postgresql/16. Круг 5 = волна 1446 (M4, Luna high).
- 2026-09-03 → [M4 Фабл] Волна 1446-web490pistandby5 сдана: коммит 63fd74ca. Приёмка 1451 (M4, Sol medium) в очереди.
- 2026-09-03 → [M4 Фабл] Приёмка 1451-accweb490pistandby5 = NO-GO (63fd74ca): все негативы/preflight/позитив PASS, единственный блокер — mutation-check manifest runbook: container test проверяет ручную копию валидации, не production source. Круг 6 = волна 1455 (M4, Luna medi
- 2026-09-03 → [M4 Фабл] Волна 1455-web490pistandby6 сдана: коммит 2733dae0 (единый источник валидации MANIFESTID для runbook и container test). Приёмка 1458 (M4, Sol medium) в очереди.
- Owner 02.09 18:52 (voice): «если отключается Oracle вообще — достаём из Hetzner на малинку и разворачиваем; забронируйте место на малинке, чтобы туда в медленном режиме всё попадало, и я мог зайти на малинку и проверить». Ответ 19:20: да, малинка = обратная копия, не зависимость (принцип no-pi-or…
- 03.09 09:20Z: Pi cold standby переведён на линию l96-98a23c70 и прогрет. Статус: status=OK cluster=noteclone line=l96-98a23c70, clusterstatus=OK, artifactstatus=OK, envstatus=OK (пакет env-l96-98a23c70-20260903T090230Z.tar.enc), диск 53%. Ловушка: переменная в /etc/hetzbk/pi-standby.env называетс…
- [пост-QA l96 на ЖИВОМ проде, 03.09 09:39-09:45Z] ПОДТВЕРЖДЕНО. Pi cold standby переведён на линию l96 и прогрет живыми данными: status=OK cluster=noteclone line=l96-98a23c70; clusterstatus=OK, artifactstatus=OK, envstatus=OK (пакет env-l96-98a23c70-20260903T090230Z.tar.enc). Базовая копия свежая:…
- Pi-standby 05.09 01:21Z после перевода на l106-6930c683: warm-pull FAIL rc=27 «warm base disagrees with selected manifest: expected=base-20260905T000108Z actual=base-20260905T010052Z»; status: manifest=manifest-20260904T221225Z base binding invalid, cluster FAIL, artifact directory count=0. Класс…
- KNOWN ISSUES / ТРАБЛШУТИНГ (правило владельца 05.09: в каждом тикете — чтобы смены не спотыкались об одно место):
- warm-pull rc=27 «warm base disagrees with selected manifest» = селектор взял старый манифест (22:12Z) при новой базе (01:00Z) — класс manifest/base drift, лечится 1fa1318b (l107); rc=21 «$PISTANDBYREMOTEROOT/$HETZBKENVLINE/…» = раскладка Storage Box плоская, не по линиям (03.09). Проверка: sudo /…
- **Следующий шаг:** Owner 02.09 18:52 (voice): «если отключается Oracle вообще — достаём из Hetzner на малинку и разворачиваем; забронируйте место на малинке, чтобы туда в медленном режиме всё попадало, и я мог зайти на малинку и проверить». Ответ 19:20: да, малинка = обратная копия, не зависимость (принцип no-pi-or… | [A1 22:00 Фабл] Волна 1366-web490pistandby сдана: коммит afb58e0329 (M4; infra/pi-standby: медленный warm-pull, pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени). Приёмка 1376-accweb490pistandby (M4, Sol high) → установка на Pi координатором.
Лента
2026-09-02T21:15:36.977Z · Fable
[A1 21:20 Фабл] Волна 1366-web490pistandby поставлена (M4, Luna high): infra/pi-standby (медленный warm-pull ночью, retention 1), pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени.
2026-09-02T21:31:20.446Z · Fable
[A1 22:00 Фабл] Волна 1366-web490pistandby сдана: коммит afb58e0329 (M4; infra/pi-standby: медленный warm-pull, pi-standby-status.sh, runbook docs/dr/PI-COLD-STANDBY.md, оценка места/времени). Приёмка 1376-accweb490pistandby (M4, Sol high) → установка на Pi координатором.
2026-09-02T23:37:00.264Z · Fable
[A1 04:30 Фабл] Приёмка 1408-accweb490pistandby2 = NO-GO (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY2-REPORT.md): B3 «три контура» реализованы, но (B1/B2) restore-пользователь postgres отрезан от env/secrets/settings при ownership из install.sh (0750 hetzbk:hetzbk) — команда runbook не исполнима; handoff в persistent unit без pg_ctl stop (столкновение по porт/postmaster.pid); нет контейнерной регрессии с реальным installer. РЕШЕНИЕ по B3: копия прода = ОДИН кластер noteclone (одна line из hetzbk), три PG на малинке — её legacy, не объект резервирования → упрощаем до одной копии. Круг 3 = волна 1416-web490pistandby3 (M4, Luna high, от 9940e377).
2026-09-03T00:14:44.641Z · Fable
[A1 07:05 Фабл] Волна 1416-web490pistandby3 сдана: коммит 805833310f (одна копия прода, restore от root с OS_USER=postgres, контейнерная регрессия, handoff с pg_ctl stop). Приёмка 1431 (M4, Sol high, в очереди) → установка на Pi.
2026-09-03T00:51:20.918Z · Fable
[A1 09:55 Фабл] Приёмка 1431-accweb490pistandby3 = NO-GO по одному блокеру (M4, отчёт /Users/milamarty/waves/ACCWEB490PISTANDBY3-REPORT.md): одна копия прода, installer/ownership/root restore, handoff с pg_ctl stop — PASS; runbook читает mirror/current от оператора без прав → MANIFEST_ID пустой, процедура не останавливается. Круг 4 = волна 1438-web490pistandby4 (M4, Luna medium): чтение pointer через root + fail-closed проверка ID, Debian-регрессия с непривилегированным оператором, traversable /var/lib/postgresql/16.
2026-09-03T01:05:47.157Z · Fable
[A1 10:25 Фабл] Волна 1438-web490pistandby4 сдана: коммит 0b302b7390 (чтение pointer через root, fail-closed ID, Debian-регрессия с оператором, traversable /var/lib/postgresql/16). Приёмка 1441 (M4, Sol medium, в очереди) → установка на Pi.
2026-09-03T01:51:15.062Z · Fable
[M4 11:35 Фабл] Приёмка 1441 = NO-GO: позитивный Debian-сценарий PASS, но MANIFEST_ID «..» доходит до restore (path traversal), и preflight принимает непроходимый parent /var/lib/postgresql/16. Круг 5 = волна 1446 (M4, Luna high).
2026-09-03T02:47:04.108Z · Fable
[M4 Фабл] Волна 1446-web490pistandby5 сдана: коммит 63fd74ca. Приёмка 1451 (M4, Sol medium) в очереди.
2026-09-03T03:02:56.084Z · Fable
[M4 Фабл] Приёмка 1451-accweb490pistandby5 = NO-GO (63fd74ca): все негативы/preflight/позитив PASS, единственный блокер — mutation-check manifest runbook: container test проверяет ручную копию валидации, не production source. Круг 6 = волна 1455 (M4, Luna medium): единый источник валидации, runbook вызывает его дословно, тест исполняет тот же блок.
2026-09-03T03:07:57.401Z · Fable
[M4 Фабл] Волна 1455-web490pistandby6 сдана: коммит 2733dae0 (единый источник валидации MANIFEST_ID для runbook и container test). Приёмка 1458 (M4, Sol medium) в очереди.
2026-09-03T03:17:05.210Z · Fable
[M4 Фабл] Приёмка 1458-accweb490pistandby6 = NO-GO (2733dae0): единый helper и mutation-check PASS, но runbook не fail-closed — `read < <(sudo helper)` не передаёт статус, нет set -e, после STOP шаги идут к root restore с пустым MANIFEST_ID (тест скрывал своим set -Eeuo). Четвёртая находка класса «runbook из shell-сниппетов» → круг 7 = волна 1460 (M4, Luna high) меняет устройство: весь restore = один установленный fail-closed скрипт pi-standby-restore, runbook = одна команда, тест гоняет сам скрипт без внешних set -e.
2026-09-03T03:36:20.522Z · Fable
[M4 Фабл] Волна 1460-web490pistandby7 сдана: коммит 4fc25277 (весь restore = один установленный fail-closed скрипт pi-standby-restore; runbook = одна команда; тест гоняет сам скрипт). Приёмка 1462 (M4, Sol high) в очереди.
2026-09-03T03:47:14.288Z · Fable
[M4 Фабл] Приёмка 1462-accweb490pistandby7 = NO-GO (4fc25277): устройство «один fail-closed скрипт» и все runtime-негативы PASS; единственный блокер — прежний mutation-check helper стал ненаблюдаем (wrapper маскирует откат guards helper-а; кейс -x без существующего mirror/-x). Круг 8 = волна 1466 (M4, Luna medium): фикстура mirror/-x и наблюдаемость трёх guards.
2026-09-03T03:55:58.560Z · Fable
[M4 Фабл] Волна 1466-web490pistandby8 сдана: коммит 747b5fd5 (мутации трёх guards helper-а наблюдаемы сквозь wrapper). Приёмка 1468 (M4, Sol high) в очереди.
2026-09-03T04:05:57.972Z · Fable
[M4 Фабл] Приёмка 1468-accweb490pistandby8 = GO (независимая, Sol high): один fail-closed скрипт pi-standby-restore, все негативы до restore, mutation-check трёх guards helper-а наблюдаем. Коммит 747b5fd5 (круг 8). Далее: установка на Pi по шагам отчёта; в l95 — с волной объединения инфра/докс-линий.
2026-09-03T04:12:33.807Z · Fable
[Pi Фабл] Установка круга 8 на живом Pi (mailhub): PG16 из PGDG (без main-кластера), порт 55433 (55432 занят docker dev-БД), секреты/known_hosts (сверено с Hetzner docs), settings tsv, unit-ы verify ok, timer включён, sftp работает. FATAL rc=21 «no remote ready base backups»: код ищет line-scoped namespace $ROOT/$LINE, а живой hetzbk на A1 пишет плоско в /home/walg-nc/hetzbk-prod-a1/{base,env,manifests,wal}; пример env указывал старый root hetzbk-prod. Восемь кругов на шимах этого не видели. Круг 9 = волна 1470 (M4, Luna high) с реальной раскладкой как фикстурой (evidence/storagebox-layout-20260903.txt).
2026-09-03T04:29:37.876Z · Fable
[M4 Фабл] Волна 1470-web490pistandby9 сдана: коммит 982a6f76 (плоская раскладка продюсера, порт из env). Приёмка 1472 (M4, Sol high, фикстура = реальный sftp ls) в очереди; параллельно ставлю на живой Pi и гоняю warm-pull/status — живой результат = финальный критерий.
2026-09-03T04:41:53.385Z · Fable
[Pi/M4 Фабл] Круг 9 на живом Pi: base pull PASS (base-20260903T040149Z, 1.18 ГБ за 8 мин), но mirror упал: выбран старый манифест 031304Z (base 030127Z), качаются все 440 WAL-строк, включая сегменты старше base, уже удалённые retention продюсера → «F4.gpg not found». Приёмка 1472 = NO-GO (status/handoff не читают PI_STANDBY_PORT). Круг 10 = волна 1475 (M4, Luna high): manifest-first выбор base, mirror только окна от start_segment, WARN для пруненных, порт в status/handoff.
2026-09-03T05:01:45.579Z · Fable
[M4/Pi Фабл] Волна 1475-web490pistandby10 сдана: коммит 60fcd41e (порт в status/handoff, manifest-first, окно WAL от start_segment с WARN для пруненных). Приёмка 1481 (M4, Sol high) в очереди; параллельно ставлю на живой Pi и гоняю warm-pull.
2026-09-03T05:05:57.773Z · Fable
[Pi Фабл] Круг 10 на живом Pi: manifest-first PASS (manifest-041447Z → base 040149Z), окно WAL verified (2 сегмента, WARN 441 старых пропущено), cluster_status=OK. Остались: FATAL rc=31 «artifact target is not linux-arm64» (composite att-build без поля target) и env-пакет не найден. Круг 11 = волна 1482 (M4, Luna medium).
2026-09-03T05:15:09.130Z · Fable
[A1 Фабл] Приёмка 1481-accweb490pistandby10 = GO (Sol, фикстура = реальный sftp ls). На живом Pi круг 10: cluster OK; круг 11 (1482) закрывает artifact target/env.
2026-09-03T05:26:32.506Z · Fable
[Фабл] Волна 1482-web490pistandby11 сдана: коммит cc3c7857 (target артефакта, поиск env-пакета). Приёмка 1486 (M4) в очереди; ставлю на живой Pi и гоняю status.
2026-09-03T05:30:42.856Z · Fable
[Фабл] ЖИВОЙ Pi: круг 11 (cc3c7857) → pi-standby-status.sh: status=OK cluster=noteclone line=l95-f7b9a4fd (cluster OK, окно WAL verified, artifact_status=OK l95, env_status=OK env-l95-f7b9a4fd-…). Cold standby РАБОТАЕТ на mailhub (PG16, порт 55433, timer раз в сутки). Приёмка 1486 = NO-GO по косметике (FATAL без пути при отсутствии env) → круг 12 = 1487 (Luna low).
2026-09-03T05:35:00.995Z · Fable
[M4 Фабл] Волна 1487-web490pistandby12 сдана: коммит 704ac19e (текст FATAL с glob). Приёмка 1490 (M4, Sol low) в очереди; живой Pi уже на круге 11 со status=OK (l95).
2026-09-03T05:39:29.215Z · Fable
[M4/Pi Фабл] Приёмка 1490-accweb490pistandby12 = GO (Sol). ЛИНИЯ ПРИНЯТА: коммит 704ac19e (12 кругов). На живом Pi (mailhub) cold standby работает: status=OK line=l95-f7b9a4fd, PG16 (PGDG), порт 55433, timer раз в сутки, base/WAL/artifact/env зеркалируются. Restore — только owner-approved rehearsal (pi-standby-restore). Готово к закрытию после включения в l96 (infra/docs).
2026-09-03T09:25:13.324Z · coordinator
03.09 09:20Z: Pi cold standby переведён на линию l96-98a23c70 и прогрет. Статус: status=OK cluster=noteclone line=l96-98a23c70, cluster_status=OK, artifact_status=OK, env_status=OK (пакет env-l96-98a23c70-20260903T090230Z.tar.enc), диск 53%. Ловушка: переменная в /etc/hetzbk/pi-standby.env называется HETZBK_ENV_LINE (не LINE) — после каждой посадки править её и запускать pi-standby-warm-pull.service.
2026-09-03T09:44:26.262Z · coordinator
[пост-QA l96 на ЖИВОМ проде, 03.09 09:39-09:45Z] ПОДТВЕРЖДЕНО. Pi cold standby переведён на линию l96 и прогрет живыми данными: status=OK cluster=noteclone line=l96-98a23c70; cluster_status=OK, artifact_status=OK, env_status=OK (пакет env-l96-98a23c70-20260903T090230Z.tar.enc). Базовая копия свежая: base_id=base-20260903T090132Z, возраст 1668 с (28 мин), cipher_bytes=1181405978, manifest_id=manifest-20260903T091245Z. Диск малинки 53%.
2026-09-05T01:28:25.711Z · координатор
Pi-standby 05.09 01:21Z после перевода на l106-6930c683: warm-pull FAIL rc=27 «warm base disagrees with selected manifest: expected=base-20260905T000108Z actual=base-20260905T010052Z»; status: manifest=manifest-20260904T221225Z base binding invalid, cluster FAIL, artifact directory count=0. Класс — расхождение выбора манифеста и базы (селектор берёт старый манифест 22:12Z при базе 01:00Z) — то, что чинит принятый HETZBKMERGE2 (1fa1318b, manifest-authoritative recovery targets) → после посадки l107 и `infra/hetzbk/install.sh` на A1 повторить warm-pull. Pi остаётся на l105-1185ca25 (последний OK). Связано: WEB-470. Правила: WEB-449.
2026-09-05T01:41:11.750Z · координатор
KNOWN ISSUES / ТРАБЛШУТИНГ (правило владельца 05.09: в каждом тикете — чтобы смены не спотыкались об одно место):
warm-pull rc=27 «warm base disagrees with selected manifest» = селектор взял старый манифест (22:12Z) при новой базе (01:00Z) — класс manifest/base drift, лечится 1fa1318b (l107); rc=21 «$PI_STANDBY_REMOTE_ROOT/$HETZBK_ENV_LINE/…» = раскладка Storage Box плоская, не по линиям (03.09). Проверка: `sudo /usr/local/libexec/pi-standby-status.sh` (status=OK cluster/artifact/env/line); перевод на новую линию: `HETZBK_ENV_LINE` в /etc/hetzbk/pi-standby.env → `systemctl start pi-standby-warm-pull` (тянет ~8 мин, bwlimit). Порт standby 55433 (55432 занят docker-proxy). Память: pi-cold-standby-install-facts.
2026-09-05T03:30:32.366Z · coordinator
[05.09 03:30Z координатор] l107 собирается на A2 (wt-l107, кандидат 7b49e1a14 поверх 6930c683): в составе hetzbk-серия HETZBKMERGE2 (1fa1318b, 5 коммитов: manifest-authoritative recovery targets, retention по времени публикации/ready chronology, точные имена WAL-сегментов, bound published manifests + catalog separator), roles r7+r8, ™ в логотипе, тест P0.3. После посадки: установка hetzbk-скриптов на A1/A2 и повтор warm-pull на Pi standby (был FAIL rc=27).
2026-09-05T04:12:59.116Z · coordinator
[05.09 04:12Z координатор] l107 (7b49e1a14) СЕЛ на прод 04:10Z: hetzbk-серия 1fa1318b в живой линии. Следующий шаг координатора: установка hetzbk-скриптов/юнитов из релиза на A1/A2 и повтор warm-pull на Pi standby.
2026-09-05T05:14:00.319Z · coordinator
[05.09 05:13Z координатор] Pi standby ПЕРЕВЕДЁН на l107 (06:12 Pi local / 05:12Z): artifact_status=updated release_id=l107-7b49e1a1 sha256=6a0f4553…, env_status=updated package=env-l107-7b49e1a1-20260905T050552Z, mirror base-20260905T040056Z, cluster_status=OK, line=l107-7b49e1a1. Что потребовалось: (1) hetzbk-скрипты l107 на A1 из исходников wt-l107 (standalone без infra/), (2) публикация артефакта hetzbk-publish-release.sh, (3) /etc/hetzbk/hetzbk.env на A1: HETZBK_ENV_LINE и HETZBK_ENV_ATTESTATION_FILE → l107, (4) /etc/hetzbk/pi-standby.env на Pi: HETZBK_ENV_LINE → l107. Без (3)+(4) Pi продолжал тянуть l106 при зелёном статусе.
KNOWN ISSUES / ТРАБЛШУТИНГ: Pi status=updated, но line=старая → проверить HETZBK_ENV_LINE в ОБОИХ env (A1 hetzbk.env и Pi pi-standby.env); env-pack «skipped reason=unchanged» — норма при повторном запуске без изменений.
2026-09-05T08:39:42.692Z · coordinator
[05.09 08:39Z координатор] Pi standby на l108 (09:38 Pi local / 08:38Z): artifact_status=updated release_id=l108-c3ff5d94 sha256=217843e6…, env-l108-c3ff5d94-20260905T082714Z, mirror base-20260905T080052Z + manifest-082506Z, cluster_status=OK, line=l108-c3ff5d94. Проход посадки теперь полный в одном шаге: publish-release → hetzbk.env (LINE+ATTESTATION_FILE) → env-pack → pi-standby.env → warm-pull.
2026-09-05T12:46:25.068Z · coordinator
[05.09 12:46Z координатор] Pi standby на l109 (13:45 Pi local / 12:45Z): artifact l109-135103a3 sha aa6a4536…, env-l109-135103a3-20260905T123248Z, cluster_status=OK, line=l109-135103a3. Полный проход посадки (publish-release → hetzbk.env → env-pack → pi-standby.env → warm-pull) занял ~13 мин.
2026-09-06T12:24:37.819Z · coordinator
[06.09 12:24Z координатор] [2026-09-06T12:24Z координатор] ИНЦИДЕНТ A1 12:20Z: диск прода 100% (193/193 ГБ) — 49 ГБ старых worktree волн в /home/ubuntu/waves (42 шт. снесены → 33 ГБ свободно), /var/lib/hetzbk 45 ГБ (base 19 + wal-cipher 15 + wal-partial 13 — штатные локальные копии), /home/wave 27 ГБ. Последствия: hetzbk-base (часовой base backup 12:00) упал, WAL partial не публиковался ~20 мин (No space) — после очистки WAL partial и manifest закоммитились (12:20:39Z), base backup перезапущен 12:22Z. Сервисы (PG, nginx, nc-a1/nc-a1-b) не падали. Нужен guard на A1 как на M4 (удалять wt-* без живой сессии по отчёту/возрасту) — ставлю.
2026-09-22T20:57:38.836Z · coordinator
[22.09 20:57Z координатор] ## 22.09 21:0xZ координатор — Pi standby отстал на пять линий (l113p с 12.09): ежедневный warm-pull падал rc=30

- База на Pi свежая (base 20260922T020150Z, status=OK), но `HETZBK_ENV_LINE=l113p-1c850d92` не переключался при посадках l115k…l115q → «no complete artifact release for line=l113p» (артефакт удалён ретеншном).
- Переключено на `l115q-cc278e18` (резерв env), запущен `pi-standby-warm-pull`. Hetzner-сторона жива: publish-current ежечасно «already published l115q», base/WAL/env/manifests — сегодня.
- Дефект процесса: `post-landing-checks.sh` не переключает линию на Pi — добавить шаг (или автоматизировать чтение текущей линии из `/home/app-artifact/*/ready`).
2026-09-22T21:12:09.100Z · coordinator
[22.09 21:12Z координатор] ## 22.09 21:11Z — Pi standby догнал бой: `status=updated cluster=noteclone line=l115q-cc278e18`
- base `base-20260922T200101Z`, manifest `manifest-20260922T205237Z`, artifact `l115q-cc278e18` sha `e9cdd5b041c2…` (= боевой релиз), env `env-l115q-cc278e18-20260916T002548Z.tar.enc`; `pi-standby-status` = OK. Диск Pi 53 %.
- Ежедневный таймер (03:06 local) снова будет проходить. Для l115r: после посадки `HETZBK_ENV_LINE=l115r-<sha8>` + `systemctl start pi-standby-warm-pull`.
Воркер
не привязан — привязать: curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \ -d '{"issueId":"WEB-490","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-09-06T20:44:33.650Z