Commit Graph

296 Commits

Author SHA1 Message Date
8ae6a73435 wiki(vdsina): drop false restart note (migrate line was stale)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 16:15:13 +03:00
415132b114 wiki(vdsina): panel password resolved (plaintext from user)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 16:10:59 +03:00
fb47d5deb2 wiki(vdsina): document Amsterdam Outline+3x-UI VDS 46.151.25.64
New entity + inventory source for previously-undocumented family VPN.
Secrets stored separately in pass vdsina-outline/full-env.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 15:54:36 +03:00
027cc79d23 deploy(pilonuxt): GSC Product name fix LIVE on prod — c4e34d4
Rebuilt pilonuxt from monorepo master c4e34d4 (workspace Dockerfile,
sharp @img baked, live VERDACCIO_TOKEN). Canon delivery: build here
(425MB) -> docker save | ssh vds load -> push FROM vds -> Portainer
stack 16 pullImage:true (tag 6c6d52d->c4e34d4, fresh registry pull).

Acceptance MET (in-container smoke on VDS + prod smoke via curl
--resolve, bypassing LAN-DNS): 3 product pages 200, leading
<meta itemprop="name"> inside schema.org/Product = product title
(was only Brand 'Пилорама 98' before). 10 nav routes 200, no regression.
Compose SOT -> c4e34d4. Inbox victor/pilorama98.ru sent.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 09:56:16 +03:00
3ad5ad446a meta(tasks): create [deploy-gsc-product-name-fix] in OpeItcLoc03/admin 2026-06-19 06:43:46 +00:00
b166ca2d79 meta(tasks): close [deploy-pilorama-web-from-monorepo] in OpeItcLoc03/admin 2026-06-18 21:15:28 +00:00
vitya
45ebe629c9 deploy(pilorama): GREEN on prod — SEO live via monorepo build 6c6d52d
4th layer fixed by peer (data 0.9.0->0.9.1). Rebuilt from 6c6d52d
(workspace Dockerfile + sharp @img copy), pushed from VDS, deployed stack 16.
Container smoke all 200: product title<=60 + meta 'доставка по СПб и ЛО';
/catalog/planken 'Планкен прямой и скошенный — купить в СПб'; products 200x3;
home/shipping/blog meta ok. stderr clean. Compose -> 6c6d52d.
Pending (cross-repo, needs push-ok): commit sharp Dockerfile + docker-deploy.md to monorepo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 00:11:06 +03:00
vitya
8f72f1fffd meta(tasks): deploy-pilorama — sharp FIXED (admin), behind it snolla 0.17 ecommerce getSiteById blocker
Dockerfile runner now copies @img (incl sharp-libvips-linux-x64) into .output;
verified SHARP_OK in container. Redeploy: sharp gone, but products 500 from
getSiteById findByPk undefined on snolla 0.17 ecommerce route (pages route OK).
Rolled back to 19a4a84 (all 200). Remaining blocker = snolla/peer zone.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:08:34 +03:00
vitya
3958107715 meta(tasks): deploy-pilorama reblocked — snolla fixed (eaee56f) but sharp/libvips not bundled
Redeploy from eaee56f: snolla-500 gone, home/categories 200 with SEO,
but sharp native libvips missing in Nitro .output → product listing 500.
Rolled back to 19a4a84 again (catalog works). Platform-specific, peer's
local prod-bundle couldn't catch it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 22:46:05 +03:00
vitya
e03d5c504a meta(tasks): block [deploy-pilorama-web-from-monorepo] — prod 500 from snolla dep conflict
Build+deploy mechanics solved (workspace Dockerfile, VDS-push for 499).
Prod 500: @snollajs/snolla@0.11.0 getSiteById (Sites model undefined),
nested under content-api@0.11.0 alongside direct snolla@0.16.0.
Rolled back to 19a4a84 (verified 200). Dep fix = web/snolla owner.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 21:20:41 +03:00
vitya
d29dae1ea9 meta(tasks): close [archive-pilorama-source-repos] — 3 repos archived, pointers, folders rm, poller skip 1→4, shared-wiki concept
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 20:51:01 +03:00
be2f9eb869 meta(tasks): create [deploy-pilorama-web-from-monorepo] in OpeItcLoc03/admin 2026-06-18 17:44:33 +00:00
89edf9b6b9 meta(tasks): create [archive-pilorama-source-repos] in OpeItcLoc03/admin 2026-06-18 17:38:43 +00:00
e5aeafa914 docs(wiki): :master restored via re-push; digest-collision suspicion cleared
books закрыли named-tag предохранителем (62d812e: protectRe +master|latest).
keep/drop digest-коллизия — снято: keep=1 у books-api это buildcache
(group-by-digest через Map делает keep/drop взаимоисключающими).

Восстановление снесённого named-тега = re-push локального образа с VDS
(docker tag inspect-Image + push под books-ci), не rebuild → плоский
single-platform манифест с .config (pullable, датируется). Применено к
books-api + books-ops-mcp -> :master снова 200. Гоча: books-api вне
CI-матрицы (embed-api-into-web) -> re-push единственный путь.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 13:32:11 +03:00
b7f2edc5bd docs(wiki): registryGc real-run outcome + named-tag-loss lesson
Первый боевой registryGc dryRun:false (books master-289c660, под добро юзера):
63 DELETE, 0 ошибок, 0x405 -> REGISTRY_STORAGE_DELETE_ENABLED=true подтверждён
живьём; 61 dangling + 2 datable снесены, реестр почищен.

Урок: master у books-api/books-ops-mcp был dangling (не пересобирались ~3нед)
-> логика drop-dangling снесла named-тег -> :master 404. Outage нет (контейнеры
на локальных образах), но redeploy упрётся. Политика: НЕ удалять named-теги
master/latest даже dangling (protectRe -> +master/latest); проверить keep/drop
на digest-коллизию (books-api keep=1 но 0 не-buildcache осталось).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 13:21:37 +03:00
93b4ef1d13 docs(wiki): dangling image-index finding — registry full of tag-tombstones
Перепрогон registryGc dryRun на descent-фиксе (master-dcd7c91) вскрыл 2-й
root-cause: реестр засорён dangling OCI image-индексами — тег жив, но его
платформенный sub-manifest отдаёт MANIFEST_UNKNOWN (вычищен прежним host-side
registry garbage-collect, не следящим index->child для multi-arch).
books-web: 19 тегов -> 3 датируемых, 16 dangling.

date-based GC защищает dangling как null-dated -> никогда не удаляет, хотя они
и есть мусор (логика задом наперёд). Рекомендация books: различать
transient-error (protect) vs MANIFEST_UNKNOWN (eligible for delete).
freedBytes от dangling ~0 (слои уже вычищены).

+registry-oci-image-index-gc.md (раздел) +index.md +log.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 12:51:28 +03:00
85b13ae6a4 docs(wiki): OCI image-index GC gotcha + bind-mount config-shadow lesson
Следствие закрытия [books-task-runner-registry-auth-cred].

concepts/registry-oci-image-index-gc.md (new): books-* образы в registry =
OCI image-index (buildx), top-level .config=null, дата .created в платформенном
sub-manifest. Наивный GC по top-level дате → null у всех → null-dated группы
защищаются → drop=0 всегда (keepLastN не применяется). Правила: Accept со
всеми media-types, дата из sub, DELETE по index-digest не sub. Зафиксировано
на books registryGc dryRun (deleted=0 при 14 tags) + манифест-dump books-web.

concepts/bindmount-config-edit-preserve-mode.md: дополнен гочей про
bind-mount shadow (config образа затенён целиком → полная секция, не дельта)
+ worked example task-runner (mode не слетел, постмортем сработал).

+index.md (2 строки) +log.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 12:31:41 +03:00
18a1e3ff61 meta(tasks): close [books-task-runner-registry-auth-cred] — cred verified via dryRun
После deploy нового кода (образ master-bf2a8c5, registryGc v2-DELETE rewrite)
прогнан registryGc {dryRun:true} через scheduler-dispatch (POST /tasks/registryGc
+ x-agenda-job-id): success, 401 нет нигде, repos books-* видны (7 processed),
отчёт сгенерён. Acceptance auth/dryRun met.

Finding отдан books (НЕ блокер кред-таски): GC бежит но drop=0 всегда
(keep=tags-1), keepLastN не применяется — getCreated→null для всех манифестов
(configDigest не извлекается, вероятно OCI image-index от buildx),
planDeletions защищает null-dated группы. Bug в books lib/registryV2.js.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 12:24:22 +03:00
202b7c32af meta(tasks): block [books-task-runner-registry-auth-cred] — cred placed+verified, new registryGc (a3734d5) not deployed
Кред books-ci (секция registry, полная — bind-mount затеняет config образа)
положен в task-runner config-volume на books-vds, 644 root сохранён
(бэкап .bak-pre-registry-2026-06-18, EACCES не повторён), container
restart→healthy, config.get(registry.*) резолвится. books-ci валиден:
/v2/_catalog→200, репы books-* видны, 401 нет.

Блокер: работающий образ (88f2bee, 2026-06-17) содержит старый registryGc
(Gitea packages API), тега master-a3734d5 в реестре нет → CI не собрал
v2-DELETE rewrite. In-app dryRun ждёт build+deploy. Inbox-ответ books отправлен.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 11:40:07 +03:00
28de8e60e0 docs(wiki): registry.kzntsv.site auth-model concept + bind-mount config-mode postmortem
- concepts/registry-kzntsv-auth-model.md (new): standalone registry:2 + htpasswd
  Basic, binary access, NOT Gitea-packages; how to add htpasswd users (hot-reload),
  GC via v2 DELETE + host garbage-collect; users vitya + books-ci.
- concepts/bindmount-config-edit-preserve-mode.md (new): mktemp+mv drops file mode
  644->600 -> non-root container (uid 1000) EACCES crash-loop; chmod --reference.
  Worked example: books-job-scheduler prod-down incident 2026-06-18.
- vds-kzntsv entity registry row links the auth-model concept.
- index.md + log.md updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 11:28:58 +03:00
53c2756265 meta(tasks): create [books-task-runner-registry-auth-cred] in OpeItcLoc03/admin 2026-06-18 08:28:09 +00:00
b1b862b28e docs(wiki): registry.kzntsv.site auth — books-ci user + standalone-htpasswd note
registry.kzntsv.site is registry:2 + htpasswd Basic (binary access, no
per-repo ACL), NOT Gitea-packages. Added books-ci user (pass
vds-kzntsv/registry-books-ci) for books job-scheduler docker-runner pull.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 10:16:01 +03:00
23e00df3a7 meta(tasks): close [books-scheduler-registry-auth-cred] in OpeItcLoc03/admin 2026-06-18 07:00:53 +00:00
120af8bfcb meta(tasks): create [books-scheduler-registry-auth-cred] in OpeItcLoc03/admin 2026-06-18 06:57:05 +00:00
97fce8be92 meta(handoff): session end — stostayer-web deploy parked on web4-cutover (ESM wall, prod на 0.3.18)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 09:35:19 +03:00
5ffca96934 docs(wiki): runbook stostayer-web deploy + park complaint-form task
Ingest .wiki/concepts/stostayer-web-deploy-runbook.md — канал деплоя легаси
web (build offline → push docker.stostayer.ru → Portainer-стек 16 через
container-IP API с хоста, мимо Angie BA) + rollback + гоча VPN-IP бан
хостером при retry-push-шторме.

БЛОКЕР задокументирован: легаси packages/web (node16/CJS/Nuxt2) не
пересобрать ни с какого свежего дерева — 5 ESM-ставших депов (@snollajs/snolla,
@snollajs/content-api, @stostayer/api, @stostayer/data ×2). 0.3.18 заморожен.
Фикс формы (120bc07) едет с web4-cutover.

Таска stostayer-web-complaint-form-deploy → 🔵 park (blocker=web4-cutover);
попытка деплоя 0.3.19 откатана на 0.3.18, сайт восстановлен. Дохлый 0.3.19
оставлен в registry по решению vitya.

+ index.md, log.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:21:56 +03:00
5be0855f4e meta(tasks): create [stostayer-web-complaint-form-deploy] in OpeItcLoc03/admin 2026-06-17 12:56:54 +00:00
c677b23f81 docs(wiki): уточнён live-state stostayer IIS на windows-recovery-host
Добавлена таблица порт->conn-string->БД для двух оставшихся IIS-сайтов
(stostayer :8090 -> внешний прод www.stostayer.ru; stostayer.old :8091
-> наш mssql.kzntsv.site), путь админок /admin, live-проверка 2026-06-17.
Пофикшена стейловая строка stostayer.old conn (localhost -> mssql.kzntsv.site).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 13:13:37 +03:00
cad9f02c0e feat(deploy): pilonuxt 19a4a84 — structured-data (description/brand/return-policy) live; close redeploy-pilonuxt-gsc-structured-data
Перекат stack 16 на registry.kzntsv.site/pilonuxt:19a4a84 (build на
workstation, push, Portainer PUT pullImage). Smoke на проде через
--resolve: description непустой, brand=Пилорама 98, offers→
hasMerchantReturnPolicy/returnPolicyCategory=MerchantReturnNotPermitted,
прежние offers-поля целы, регрессий нет. Отчёт в inbox pilonuxt.

Wiki ingest: portainer-stack-management-vds — раздел Stack redeploy
(новый тег) + gotcha #9 (PS 5.1 Invoke-RestMethod декодит /file как
ISO-8859-1 → mojibake кириллицы → PUT падает YAML; fix байты+UTF8) +
#10 (пустой env). index/log обновлены.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:22:30 +03:00
af779a36e2 meta(handoff): pilonuxt 37412d0 deploy closed — offers live, Portainer registry fix noted
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:09:19 +03:00
103df9fa46 feat(deploy): pilonuxt 37412d0 — offers в микроразметку Product, GSC-фикс live
redeploy-pilonuxt-gsc-offers closed. Build workstation @37412d0 (verdaccio
build-secret) → push registry.kzntsv.site/pilonuxt:37412d0 → перекат Portainer
stack 16 (PUT API, PullImage). Acceptance: itemprop="offers" (price/currency/
availability/url) на странице товара, verified curl --resolve к VDS; меню+viewModel
200, без регрессии.

Попутно: registry.kzntsv.site зарегистрирован в Portainer (Custom Id 1) —
первый pull падал "no basic auth credentials" (Portainer не имел ни одного
registry; host docker login слетел). Теперь приватный registry авторизован
в Portainer постоянно.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:09:19 +03:00
5adf00735a meta(tasks): create [redeploy-pilonuxt-gsc-structured-data] in OpeItcLoc03/admin 2026-06-17 07:00:57 +00:00
e66a8b8db3 meta(tasks): create [redeploy-pilonuxt-gsc-offers] in OpeItcLoc03/admin 2026-06-16 13:49:44 +00:00
e3b87485c5 meta(handoff): wrap session — pilonuxt cutover live, IIS held for rollback
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 00:27:52 +03:00
b4cbb6dca2 meta(tasks): record decision — keep old IIS 80.64.31.36 for rollback, не выводить
vitya 2026-06-15: старый RUVDS IIS держим для отката pilorama98, decommission
отложен. Зафиксирован rollback-путь (DNS reg.ru → 80.64.31.36) + предупреждение
что IIS = snolla catch-all на 25 хостнеймов (целиком гасить нельзя).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 00:15:05 +03:00
9add1ac164 feat(deploy): pilonuxt CUTOVER LIVE on www.pilorama98.ru — deploy-pilonuxt-vds closed
vitya флипнул DNS pilorama98.ru+www → 89.253.255.94. Перенастроил traefik
роутер на боевые хосты (apex+www+vds-subdomain, LE cert), снял smoke
GTM-override (прод-аналитика вкл), выкатил 125a3e2 (фикс Продукция→/catalog).
Финальный smoke с VDS по www.pilorama98.ru: все страницы page 200/viewModel
200, картинки 200 webp, x-powered-by Nuxt (не IIS), cert valid, битый
футер-линк убран. Форма закрыта (vitya ok + pilonuxt dev-verified).
Stack 16. Задача 🟢 closed. Follow-ups: decommission старого IIS после soak.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 00:09:08 +03:00
2911f2b3e5 feat(deploy): pilonuxt 961a838 — content-api fixed, full re-smoke; 1 bug left (/products 404)
pilonuxt пофиксил content-api (@snollajs/data 0.9.1 + tedious traceInclude),
тег 961a838. Stack 16 перекатан. Полный re-smoke (весь меню 21 стр + viewModel
по каждому + Playwright браузер + скрин): viewModel 200 везде, страницы 200 с
реальным контентом, картинки 200 webp, консоль 0 ошибок, верстка целая.
Остался реальный баг: пункт меню «Продукция» → /products → 404. + форма не
тестилась (живой email). Cutover отложен до закрытия /products + формы.
.gitignore: smoke-артефакты (скрин, .playwright-mcp).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 23:59:56 +03:00
637942e914 fix(deploy): retract false-green — pilonuxt content-api 500 on all CMS pages
vitya поймал /snolla/pages/viewModel?path=/services -> 500. Перепроверил:
content-api лежит полностью (viewModel 500 на всех путях). Root:
sequelize['snolla'] undefined в content-api → @snollajs/data не
инициализирован (задвоённый stateful-инстанс в Nitro-бандле, класс как
дубль Vue). Каталог работает (app-путь), CMS-страницы нет. Задача обратно
🔵 blocked, cutover отменён. Inbox pilonuxt с диагнозом отправлен.
Урок зафиксирован: smoke = все страницы меню + data-эндпоинты, не 2 роута.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 23:05:52 +03:00
1725425972 feat(deploy): pilonuxt re-smoke GREEN on pilonuxt.vds.kzntsv.site (tag 3622662)
pilonuxt пофиксил дубль Vue в prod-бандле (resolutions @vue/*), тег 3622662
(36ec970 битый). Stack 16 перекатан. Smoke: / 200 SSR, /catalog 200 с
товарами из CMS, картинки imgproxy 200 webp + статика 200, внешний доступ
200 cert valid. Остаток: contacts-form email (живой, держу) + cutover
www.pilorama98.ru (решение vitya).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:59:57 +03:00
5fd1a1d68b meta(tasks): deploy-pilonuxt-vds — stack 16 up, infra green, blocked on app SSR 500
pilonuxt:36ec970 развёрнут Portainer stack 16 на pilonuxt.vds.kzntsv.site.
Инфра зелёная (cert/traefik/egress mssql+smtp/SSR-hairpin). App отдаёт 500
`Cannot read properties of null (reading 'ce')` на всех роутах вкл. server
/api/snolla → баг в data-слое snolla, не деплой. Inbox pilonuxt отправлен.
Blocked на app-фиксе. Стек оставлен поднятым для быстрой итерации тега.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:19:59 +03:00
38e84ce20b feat(deploy): add pilonuxt VDS Portainer stack compose; block on pilonuxt Dockerfile fix
pilonuxt deploy на vds-kzntsv за Traefik. Compose готов (proxy net,
websecure, certresolver letsEncrypt, Host pilonuxt.vds.kzntsv.site, :3000,
GTM погашен на smoke-поддомене). Домен согласован с vitya: temp-поддомен
для smoke, cutover www.pilorama98.ru — отдельным шагом.

Сборка диагностирована, образ НЕ собран — Dockerfile pilonuxt падает в
чистом контейнере (локально замаскировано глоб. yarnrc + сетью):
  1. .yarnrc.yml без npmAlwaysAuth:true → YN0041 anonymous (whoami=vitya).
  2. Dockerfile не копирует scripts/+src/generated до yarn install →
     postinstall Cannot find module scripts/ensure-schema.mjs (YN0009).
По решению vitya сборка отдана pilonuxt (их репо/фикс), за admin — Portainer.
Inbox victor/pilonuxt отправлен с разбором. Задача 🔵 blocked до образа.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 22:01:48 +03:00
2ba7b6df5c meta(tasks): create [deploy-pilonuxt-vds] in OpeItcLoc03/admin 2026-06-14 18:45:23 +00:00
7ebab0a79d docs(wiki): add S3-access lookup block for client apps (books-vds MinIO)
Запрос snolla (raw-stream content-api) потребовал MinIO endpoint+креды;
ответ был выводим из вики, но не собран одним куском. Добавлен раздел
«S3 access для клиентских приложений» в minio-imgproxy-on-vds.md:
endpoint (https://minio.kzntsv.site / сырой :9000 / inter minio:9000),
root accessKey + pass-ссылка на secret, форма ключа, ssl/region/pathStyle.
Следующий такой вопрос — grep по вики, без SSH на сервер.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 10:49:13 +03:00
ed581f4ccf meta(tasks): refresh session handoff after assets migration 2026-06-13 23:16:49 +03:00
82d724f108 feat(assets): migrate snolla assets originals Local-disk → S3
assets storage class = Local (RUVDS IIS App_Data\assets), never in S3 →
snolla imgproxy source s3://assets/<ownerId>/<storageFilename> = 404.
Created MinIO bucket `assets` (books-vds), rclone'd whole tree from RUVDS
verbatim: 4750 obj / 215.5 MiB, 145 owner folders. Verify count+size ==
source. Smoke: brevno.jpg → 200 image/webp; validly-signed missing obj →
404. snolla code unchanged (path A). Scope widened past pilorama98 (closes
404 class for all tenants; owner→site map non-obvious). snolla-side stub
content-api/routes/assets.js still pending (flagged in inbox).

Closes [migrate-assets-originals-to-s3].

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 23:16:10 +03:00
8dc856b92d meta(tasks): create [migrate-assets-originals-to-s3] in OpeItcLoc03/admin 2026-06-13 19:31:08 +00:00
f04426617c feat(galleries): migrate pilorama98 gallery originals Local-disk → S3
snolla galleries 404 (imgproxy "Source unreachable"): legacy storageClient
"galleries" = MoreThenCms Local storage class (App_Data\galleries\<siteId>),
never in S3 — products were migrated, galleries weren't. Path A (user pick):
new bucket `galleries`, 301 pilorama98 originals (77 MiB) rclone'd from RUVDS
IIS → s3://galleries/37e6…/<guid>.jpg verbatim. snolla code unchanged
(storageClient=bucket is the working convention). imgproxy smoke from
books-vds: real obj 200 image/webp, fake guid 404. Other sites unmigrated
(scope). Inbox sent to victor/snolla.

- close [migrate-gallery-originals-to-s3] (scope pilorama98)
- NEW .wiki concept galleries-storage-class-local-not-s3
- fix stale minio-imgproxy-on-vds (pipeline on books-vds since 2026-06-08)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 14:50:16 +03:00
4c640dec65 meta(tasks): create [migrate-gallery-originals-to-s3] in OpeItcLoc03/admin 2026-06-12 11:09:50 +00:00
e001b8e331 feat(books-backup): bookva-es snapshot via Portainer path.repo
bookva-es (отдельный ES 7.10, Portainer stack 37) не снапшотился — path.repo
не сконфигурирован. Пересоздан через Portainer API (PUT /api/stacks/37) с
path.repo=/snapshots + bind /usr/docker/bookva-es/snapshots (uid 1000:0);
внешний том bookva-es-data сохранён (epz/products целы). Repo kreknin
зарегистрирован.

Добавлен Step 2b (bookva-es snapshot + prune) в run.sh.

Gotcha пойман на проверке приёмника ДО коммита: оба ES-каталога называются
`snapshots` → как отдельные rsync-источники сливаются в один dest/snapshots/
и портят оба репо (видно по двойному index-N). Fix: источник bookva-es =
родительский /usr/docker/bookva-es (basename bookva-es → dest/bookva-es/snapshots/).

Verified green: BOOKS-VDS backup OK 10m28s, на kreknin раздельно
snapshots/ (slovo, index-41, 795M) + bookva-es/snapshots/ (index-4, 801M),
по одному index-N в каждом → оба независимо рестораблельны.

Закрывает .tasks/bookva-es-snapshot-repo.md (🟢). bookva tenant полностью
покрыт (db/mongo/minio/es).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:56:19 +03:00
aeb82a6a70 feat(books-backup): cover bookva-* tenant (db/mongo/minio)
bookva tenant (bookva-db/mongo/es/minio) поднят 26.05 при cutover-prep, а
books-vds backup написан 25.05 — до bookva. Покрытие не расширили; gap висел
wiki-follow-up #2 ~2.5 недели. Тот же класс, что MSSQL: новый stateful, бэкап
отстал, повешен как заметка.

Добавлено в scripts/books-vds-backup-daily-kreknin/run.sh (deploy == repo,
бэкап .bak-pre-bookva):
- bookva-db: mariadb-dump (тот же BOOKS_DB_ROOT_PASSWORD, стек клонирован)
- bookva-mongo: mongodump --archive (no-auth)
- bookva-minio: raw rsync named volume bookva-minio-data (immutable objects)

Каждая команда протестирована изолированно ДО внесения в скрипт. Verified
зелёным прогоном: BOOKS-VDS backup OK 10m42s, артефакты на kreknin
(bookva-mariadb 257M, bookva-mongo 3.2M, bookva-minio 1.4G).

bookva-es отложен (path.repo не сконфигурирован, нужен ES restart через
Portainer) -> .tasks/bookva-es-snapshot-repo.md. Покрыт по факту: индексы
epz/products идентичны slovo ES, который снапшотится.

- .wiki/entities/books-vds.md: Backup-секция + follow-up #2 частично закрыт
- .wiki/concepts/backup-inventory-2026-06.md: bookva row -> done
- .tasks/bookva-es-snapshot-repo.md: backlog для ES-снапшота

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:01:05 +03:00