fix(deploy): сохранять локальные резервные копии при пересоздании контейнера

This commit is contained in:
Denozordec committed 2026-10-14 11:21:48 +07:00
1 parent 659e658f18
commit ab48973eb9
17 files changed
+179 -9

No files matched your search

+9
View File
@@ -0,0 +1,9 @@
# Постоянное хранение локальных резервных копий
Backend сохраняет `.rsc` в `/app/storage/backups`. В Compose этот путь подключён к `data/backups` на хосте (в варианте CDN — `data/mm/backups`, в основном варианте — `/opt/mmapp/data/backups`). Том PostgreSQL не хранит содержимое `.rsc`: запись каталога и файл должны сохраняться отдельно.
Перед первым обновлением существующего развёртывания с новым томом сохраните файлы из `/app/storage/backups` работающего старого контейнера в соответствующий каталог хоста. Сделайте это **до пересоздания контейнера**. Проверьте размеры и SHA-256, права доступа backend и отсутствие конфликтующих имён; не перезаписывайте отличающиеся файлы. Если файлы уже отсутствуют, записи PostgreSQL их не восстановят. После обновления проверьте скачивание через приложение.
Не меняйте имя Compose project и тома PostgreSQL при переносе файлов. Удаление контейнера допустимо после подтверждения сохранности; `down -v` для обновления не требуется.
На тестовом Debian проверены две новые нативные копии CHR: скачивание до и после `--force-recreate`, совпадение SHA-256, удаление только собственных копий. Доказательства и границы — `docs/ux-ui-progress.md`, блок12.5.235.
+2
View File
@@ -203,6 +203,8 @@ services:
- "10.255.254.1:4739:4739/udp" - "10.255.254.1:4739:4739/udp"
volumes: volumes:
- ./data/mm:/app/data - ./data/mm:/app/data
# Native .rsc files must survive backend recreation.
- ./data/mm/backups:/app/storage/backups
networks: networks:
mmapp: mmapp:
aliases: aliases:
+2
View File
@@ -85,6 +85,8 @@ services:
FLOW_LISTEN_HOST: "0.0.0.0" FLOW_LISTEN_HOST: "0.0.0.0"
volumes: volumes:
- ./data:/app/data - ./data:/app/data
# Native .rsc files must survive backend recreation.
- ./data/backups:/app/storage/backups
healthcheck: healthcheck:
test: test:
[ [
+2
View File
@@ -97,6 +97,8 @@ services:
AUTH_PORTAL_URL: ${AUTH_PORTAL_URL:-https://auth.shnt.top} AUTH_PORTAL_URL: ${AUTH_PORTAL_URL:-https://auth.shnt.top}
volumes: volumes:
- ./data:/app/data - ./data:/app/data
# Native .rsc files must survive backend recreation.
- ./data/backups:/app/storage/backups
networks: networks:
mmapp: mmapp:
aliases: aliases:
+2
View File
@@ -135,6 +135,8 @@ services:
AUTH_PORTAL_URL: ${AUTH_PORTAL_URL:-https://auth.shnt.top} AUTH_PORTAL_URL: ${AUTH_PORTAL_URL:-https://auth.shnt.top}
volumes: volumes:
- ./data:/app/data - ./data:/app/data
# Native .rsc files must survive backend recreation.
- ./data/backups:/app/storage/backups
networks: networks:
- mmapp - mmapp
labels: labels:
+2
View File
@@ -69,6 +69,8 @@ services:
FLOW_LISTEN_HOST: "0.0.0.0" FLOW_LISTEN_HOST: "0.0.0.0"
volumes: volumes:
- /opt/mmapp/data:/app/data - /opt/mmapp/data:/app/data
# Native .rsc files must survive backend recreation.
- /opt/mmapp/data/backups:/app/storage/backups
healthcheck: healthcheck:
test: test:
[ [
+1 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: протокол внешней приёмки 12.5 # UX/UI: протокол внешней приёмки 12.5
Актуальное продолжение 2026-10-14:230–233 — native S3 backup/ограниченный restore/UI и защита подключения/гонок приняты.234 — известный legacy synthetic export отклоняется400/not-applied до RouterOS; download/file/catalog сохранены,2 owned SQL/API cases passed. Backend ux-backup234 healthy/frontend ux-routing218;504 source/1064 outputs matched. Обнаружены10 исходных catalog rows с отсутствующими local files и непостоянный backup path; следующий235 — постоянный Compose volume и native backup recreation proof. Этап12.5 открыт. Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md).
+1 -1
View File
@@ -1,6 +1,6 @@
# План реализации UX/UI по пятичасовым окнам # План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-14:230–233 — native S3 backup/ограниченный restore/UI и защита подключения/гонок приняты.234 — известный legacy synthetic export отклоняется400/not-applied до RouterOS; download/file/catalog сохранены,2 owned SQL/API cases passed. Backend ux-backup234 healthy/frontend ux-routing218;504 source/1064 outputs matched. Обнаружены10 исходных catalog rows с отсутствующими local files и непостоянный backup path; следующий235 — постоянный Compose volume и native backup recreation proof. Этап12.5 открыт. Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
+12 -2
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации # UX/UI: журнал реализации
Актуальное продолжение 2026-10-14:230–233 — native S3 backup/ограниченный restore/UI и защита подключения/гонок приняты.234 — известный legacy synthetic export отклоняется400/not-applied до RouterOS; download/file/catalog сохранены,2 owned SQL/API cases passed. Backend ux-backup234 healthy/frontend ux-routing218;504 source/1064 outputs matched. Обнаружены10 исходных catalog rows с отсутствующими local files и непостоянный backup path; следующий235 — постоянный Compose volume и native backup recreation proof. Этап12.5 открыт. Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -36,7 +36,17 @@
| 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 |
| 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–234 завершены в записанных scopes, этап открыт. Runtime backend ux-backup234/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–235 завершены в записанных scopes, этап открыт. Runtime backend ux-backup234/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. |
## 12.5.235 — постоянное хранение .rsc и реальные копии после пересоздания Docker (2026-10-14)
Подтверждён deployment дефект: backend main cwd=/app пишет .rsc в /app/storage/backups, а прежний Compose подключал только /app/data. Собственный harmless marker создан через wx в контейнере233; после пересоздания на234 отсутствует. Это controlled recreation loss proof. Отсутствие10 исходных файлов зафиксировано отдельно в234; их прежнее существование/содержимое/момент исчезновения не установлены. [Baseline marker](ux-ui/acceptance/persist235-before.json).
Пять Compose variants (main/test/Traefik/Traefik-CDN/CDN-MM) теперь подключают backend backup path к host data/backups; CDN-MM использует data/mm/backups, main — /opt/mmapp/data/backups. На Debian actual compose.yaml изменён и config --quiet passed. Добавлена [инструкция миграции существующих файлов до recreate](../deploy/BACKUP-STORAGE.md); другие развёртывания не обновлялись. Five configs проверены Docker Compose parse+backend mount с dummy env, без запуска дополнительных контейнеров. Первый CDN-MM preflight потребовал предусмотренный env_file .env; после создания dummy .env повтор5/5 passed. [Config5](ux-ui/acceptance/compose235-validation.json).
Real Portal/browser API, provider local verified: создан один job ровно для194.226.121.150/104.165.244.7,2 native .rsc (917/782 bytes) скачаны/hashed. Host bind содержит те же2 files. После --force-recreate container ID изменился, host hashes и реальные API downloads совпали. Затем собственные2 records/files удалены DELETE204, directory empty; исходные10 catalog rows exact DTO matched, storage provider local сохранён. [API2](ux-ui/acceptance/backups235-persistence-api.json), [host/container proof](ux-ui/acceptance/persist235-deployment.json).
Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт.
## 12.5.234 — отказ восстановления старого частичного экспорта (2026-10-14) ## 12.5.234 — отказ восстановления старого частичного экспорта (2026-10-14)
+3 -3
View File
@@ -1,8 +1,8 @@
# Оставшаяся внешняя приёмка — 2026-10-14 # Оставшаяся внешняя приёмка — 2026-10-14
Актуальное продолжение 2026-10-14:230–233 — native S3 backup/ограниченный restore/UI и защита подключения/гонок приняты.234 — известный legacy synthetic export отклоняется400/not-applied до RouterOS; download/file/catalog сохранены,2 owned SQL/API cases passed. Backend ux-backup234 healthy/frontend ux-routing218;504 source/1064 outputs matched. Обнаружены10 исходных catalog rows с отсутствующими local files и непостоянный backup path; следующий235 — постоянный Compose volume и native backup recreation proof. Этап12.5 открыт. Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
Это актуальная матрица после 12.5.234. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Это актуальная матрица после 12.5.235. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии.
Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-backup234`, frontend `ux-routing218`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-backup234`, frontend `ux-routing218`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись.
@@ -15,7 +15,7 @@
| REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Причина единичных native401/500 неизвестна. Короткое независимое наблюдение возможно сейчас; оно не даст SLA | | REST и достоверность данных | Ошибки OSPF/BFD/BGP/GRE/WAN215–221 явные; latest API smoke222 прошёл | Причина единичных native401/500 неизвестна. Короткое независимое наблюдение возможно сейчас; оно не даст SLA |
| Клиентские ОС и внешняя сеть | CHR↔CHR/Linux, private IPv4/ULA и synthetic IPv6/IPFIX; Android full-tunnel/reconnect227 подтверждены пользователем | Windows/macOS/iOS VPN, расширенная Android приёмка, независимые WAN/multi-WAN и public IPv6; public IPv6 на текущем стенде отсутствует | | Клиентские ОС и внешняя сеть | CHR↔CHR/Linux, private IPv4/ULA и synthetic IPv6/IPFIX; Android full-tunnel/reconnect227 подтверждены пользователем | Windows/macOS/iOS VPN, расширенная Android приёмка, независимые WAN/multi-WAN и public IPv6; public IPv6 на текущем стенде отсутствует |
| Масштаб и длительная устойчивость | Контролируемые lock/dedupe/loss/recovery и короткие native проверки | Несколько backend/worker/writers, длительный rekey/REST/traffic, physical disconnect и maximum throughput | | Масштаб и длительная устойчивость | Контролируемые lock/dedupe/loss/recovery и короткие native проверки | Несколько backend/worker/writers, длительный rekey/REST/traffic, physical disconnect и maximum throughput |
| Внешние хранилища и jobs | Локальные API/errors/RBAC/owned SQL; реальные Portal1.3.1/Telegram195–201 и Selectel S3/client/API/ownSQL228–229 | Large native exports проверены HTTP fixture; S3 restore через UI, миграция между buckets/multi-instance и retention; provider/container/Gitea/MaxMind jobs с соответствующими endpoints/аккаунтами; private/paid credentials не выдумывать | | Внешние хранилища и jobs | Локальные API/errors/RBAC/owned SQL; реальные Portal1.3.1/Telegram195–201 и Selectel S3/client/API/ownSQL228–229 | Large native exports проверены HTTP fixture; S3 restore через UI, missing local files UX, миграция между buckets/multi-instance и retention; provider/container/Gitea/MaxMind jobs с соответствующими endpoints/аккаунтами; private/paid credentials не выдумывать |
| Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP сценарии и точные границы записаны | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/policy/path-length и длительные переходы; BFD-only gate гарантией не стал | | Расширенные сетевые конфигурации | GRE/WG/VXLAN/IPsec/OSPF/BFD/BGP сценарии и точные границы записаны | from-pool/EUI-64/multiple-address import/export, outer IPv6, произвольная PKI/OID/policy/path-length и длительные переходы; BFD-only gate гарантией не стал |
| Общий UX, доступность и производительность | Полная UI192 исторически; latest backend25/UI52, scoped contrast/live218 и keyboard206 | Свежая UI226 принята в записанных границах; профильный performance и ручная accessibility/screen-reader приёмка; scoped axe не полный WCAG | | Общий UX, доступность и производительность | Полная UI192 исторически; latest backend25/UI52, scoped contrast/live218 и keyboard206 | Свежая UI226 принята в записанных границах; профильный performance и ручная accessibility/screen-reader приёмка; scoped axe не полный WCAG |
| Границы выпуска | План/доказательства/датированные блоки сохранены; коммиты локальные | Определить требуемые конфигурации и принять результат в этих границах; невыполненные варианты остаются явными ограничениями | | Границы выпуска | План/доказательства/датированные блоки сохранены; коммиты локальные | Определить требуемые конфигурации и принять результат в этих границах; невыполненные варианты остаются явными ограничениями |
+12 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI # Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-14:230–233 — native S3 backup/ограниченный restore/UI и защита подключения/гонок приняты.234 — известный legacy synthetic export отклоняется400/not-applied до RouterOS; download/file/catalog сохранены,2 owned SQL/API cases passed. Backend ux-backup234 healthy/frontend ux-routing218;504 source/1064 outputs matched. Обнаружены10 исходных catalog rows с отсутствующими local files и непостоянный backup path; следующий235 — постоянный Compose volume и native backup recreation proof. Этап12.5 открыт. Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -4140,3 +4140,14 @@ Unit проверяет обычный и BOM/whitespace header, сохране
Image ux-backup234:504 source/1064 compiled matched; main healthy/image ID verified, frontend ux-routing218 сохранён. [Deploy](ux-ui/acceptance/backup234-deployment.json). Существующие10 main catalog rows проверены read-only: files missing10, legacy/native classification не получена. Node main cwd=/app, mount был только /app/data; BACKUPS_DIR=/app/storage/backups находится вне bind. Это не доказательство содержимого или прежнего существования10 missing files. [Диагностика](ux-ui/acceptance/legacy234-catalog.json). Следующий235 — persist mount/recreate proof; original missing rows не удалять и не объявлять восстановленными. Этап12.5 открыт. Image ux-backup234:504 source/1064 compiled matched; main healthy/image ID verified, frontend ux-routing218 сохранён. [Deploy](ux-ui/acceptance/backup234-deployment.json). Существующие10 main catalog rows проверены read-only: files missing10, legacy/native classification не получена. Node main cwd=/app, mount был только /app/data; BACKUPS_DIR=/app/storage/backups находится вне bind. Это не доказательство содержимого или прежнего существования10 missing files. [Диагностика](ux-ui/acceptance/legacy234-catalog.json). Следующий235 — persist mount/recreate proof; original missing rows не удалять и не объявлять восстановленными. Этап12.5 открыт.
## 12.5.235 — постоянное хранение .rsc и реальные копии после пересоздания Docker (2026-10-14)
Подтверждён deployment дефект: backend main cwd=/app пишет .rsc в /app/storage/backups, а прежний Compose подключал только /app/data. Собственный harmless marker создан через wx в контейнере233; после пересоздания на234 отсутствует. Это controlled recreation loss proof. Отсутствие10 исходных файлов зафиксировано отдельно в234; их прежнее существование/содержимое/момент исчезновения не установлены. [Baseline marker](ux-ui/acceptance/persist235-before.json).
Пять Compose variants (main/test/Traefik/Traefik-CDN/CDN-MM) теперь подключают backend backup path к host data/backups; CDN-MM использует data/mm/backups, main — /opt/mmapp/data/backups. На Debian actual compose.yaml изменён и config --quiet passed. Добавлена [инструкция миграции существующих файлов до recreate](../deploy/BACKUP-STORAGE.md); другие развёртывания не обновлялись. Five configs проверены Docker Compose parse+backend mount с dummy env, без запуска дополнительных контейнеров. Первый CDN-MM preflight потребовал предусмотренный env_file .env; после создания dummy .env повтор5/5 passed. [Config5](ux-ui/acceptance/compose235-validation.json).
Real Portal/browser API, provider local verified: создан один job ровно для194.226.121.150/104.165.244.7,2 native .rsc (917/782 bytes) скачаны/hashed. Host bind содержит те же2 files. После --force-recreate container ID изменился, host hashes и реальные API downloads совпали. Затем собственные2 records/files удалены DELETE204, directory empty; исходные10 catalog rows exact DTO matched, storage provider local сохранён. [API2](ux-ui/acceptance/backups235-persistence-api.json), [host/container proof](ux-ui/acceptance/persist235-deployment.json).
Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт.
+3 -1
View File
@@ -1,6 +1,6 @@
# Тестовый сервер UX/UI — 2026-10-10 # Тестовый сервер UX/UI — 2026-10-10
Актуальное продолжение 2026-10-14:230–233 — native S3 backup/ограниченный restore/UI и защита подключения/гонок приняты.234 — известный legacy synthetic export отклоняется400/not-applied до RouterOS; download/file/catalog сохранены,2 owned SQL/API cases passed. Backend ux-backup234 healthy/frontend ux-routing218;504 source/1064 outputs matched. Обнаружены10 исходных catalog rows с отсутствующими local files и непостоянный backup path; следующий235 — постоянный Compose volume и native backup recreation proof. Этап12.5 открыт. Актуальное продолжение 2026-10-14:230–235 — реальные S3 backup/ограниченный restore/UI, native /file/read, защита подключения/гонок и legacy restore приняты. Исправлены5 Compose variants: /app/storage/backups подключён к host data/backups.2 native CHR backups пережили force-recreate, API SHA256 matched, own files/catalog очищены; original10 rows сохранены, их ранее отсутствующие files не восстановлены. Backend ux-backup234/frontend ux-routing218 healthy. Далее236 — недоступные local files в UX/границы retention и оставшаяся матрица12.5. Этап открыт.
| Параметр | Проверенное состояние | | Параметр | Проверенное состояние |
| --- | --- | | --- | --- |
@@ -2378,3 +2378,5 @@ Runtime backend ux-regression222/frontend ux-routing218. Latest backend25/UI52
## 12.5.228–229 — Selectel S3/client/API/owned SQL приняты (2026-10-14) ## 12.5.228–229 — Selectel S3/client/API/owned SQL приняты (2026-10-14)
2 roundtrip objects,12 unique API scenarios, synthetic native export/CHR contacts0. Own DB/roles/catalog/localfiles/currentobjects cleaned. Versioning Enabled:8versions+8markers removed,3 own prefixes remaining0; bucket configuration unchanged. Native backup/restore/live UI/смена storage origin/retention semantics остаются230. Private env удалены, secrets не в published files. [API](ux-ui/acceptance/s3-application229.json), [version cleanup](ux-ui/acceptance/s3-version-cleanup229.json). 2 roundtrip objects,12 unique API scenarios, synthetic native export/CHR contacts0. Own DB/roles/catalog/localfiles/currentobjects cleaned. Versioning Enabled:8versions+8markers removed,3 own prefixes remaining0; bucket configuration unchanged. Native backup/restore/live UI/смена storage origin/retention semantics остаются230. Private env удалены, secrets не в published files. [API](ux-ui/acceptance/s3-application229.json), [version cleanup](ux-ui/acceptance/s3-version-cleanup229.json).
Локальные .rsc после235: `/opt/mmapp-test/data/backups` → `/app/storage/backups`; см. [порядок переноса](../deploy/BACKUP-STORAGE.md). Две новые native copies после force-recreate проверены и удалены; десять старых catalog rows сохранены с зафиксированным отсутствием files.
@@ -0,0 +1,23 @@
{
"date": "2026-10-14",
"block": "12.5.235",
"realPortalLogin": true,
"noMocks": true,
"nativeBackups": [
{
"bytes": 917,
"sha256": "e168508263ea6a6195558490345af104b3766799ffaa27a5e2f6d0514737ce75",
"hashMatchedAfterRecreate": true
},
{
"bytes": 782,
"sha256": "0e1ecfa4ea11f0a64526b5f3572bd4b241e7f8129e49b585318f4a34abe5e545",
"hashMatchedAfterRecreate": true
}
],
"ownCatalogAndFilesDeleted": true,
"originalCatalogAllFieldsMatched": true,
"originalCatalogRows": 10,
"storageProviderUnchanged": "local",
"passwordChanges": 0
}
@@ -0,0 +1,37 @@
{
"date": "2026-10-14",
"block": "12.5.235",
"checks": [
{
"file": "docker-compose.cdn-mm.yml",
"passed": false,
"error": "env file /opt/mmapp-test/artifacts/compose235/.env not found: stat /opt/mmapp-test/artifacts/compose235/.env: no such file or directory\n"
},
{
"file": "docker-compose.test.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
},
{
"file": "docker-compose.traefik-cdn.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
},
{
"file": "docker-compose.traefik.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
},
{
"file": "docker-compose.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
}
],
"passed": false,
"containersStarted": 0
}
@@ -0,0 +1,38 @@
{
"date": "2026-10-14",
"block": "12.5.235",
"checks": [
{
"file": "docker-compose.cdn-mm.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
},
{
"file": "docker-compose.test.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
},
{
"file": "docker-compose.traefik-cdn.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
},
{
"file": "docker-compose.traefik.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
},
{
"file": "docker-compose.yml",
"passed": true,
"target": "/app/storage/backups",
"type": "bind"
}
],
"passed": true,
"containersStarted": 0
}
@@ -0,0 +1,10 @@
{
"date": "2026-10-14",
"block": "12.5.235",
"name": "mm-persist235-a922295c-9574-48fe-91e5-36d02265b37f.rsc",
"path": "/app/storage/backups/mm-persist235-a922295c-9574-48fe-91e5-36d02265b37f.rsc",
"sha256": "f9dffbdebfff6991d73d2ff6906ff53acb7c89ab290d1d5f6a761fe944a8e896",
"oldBackend": "ux-backup233",
"oldMarkerLostAfterRecreate": true,
"beforeMount": "only /app/data"
}
@@ -0,0 +1,20 @@
{
"date": "2026-10-14",
"block": "12.5.235",
"beforeContainerId": "a3928ddcb08d7e274d796bbf693f88ed006f2f86857570acc43099c280ff8eab",
"persistentMount": "/app/storage/backups",
"hostPath": "/opt/mmapp-test/data/backups",
"filesBefore": 2,
"hashes": [
"0e1ecfa4ea11f0a64526b5f3572bd4b241e7f8129e49b585318f4a34abe5e545",
"e168508263ea6a6195558490345af104b3766799ffaa27a5e2f6d0514737ce75"
],
"oldEphemeralMarkerLost": true,
"afterContainerId": "951c234682458a5ec2ae69ff4e20930ed0687052c2c03fb05d505e173855ca0e",
"filesAfter": 2,
"hostHashesMatchedAfterRecreate": true,
"healthy": true,
"ownFilesRemaining": 0,
"backendImage": "ux-backup234",
"frontendImage": "ux-routing218"
}