Files
admin/.wiki/log.md

56 KiB
Raw Blame History

[2026-08-23] ingest | NEW concepts/mappa-vds-deploy-runbook.md — ранбук деплоя/редеплоя mappa на VDS (стек 26, образ registry.kzntsv.site/mappa:0.1.0, БД на общем postgres:16, endpoint mappa.vds.kzntsv.site). #1012 закрыта; грабли: schema.sql в dist при tsc-сборке, docker pull до Portainer restart, не-ad-hoc compose, внешний DATABASE_URL для импорта. index.md updated (+1).

[2026-08-19] ingest | NEW concepts/sched-fnf-testing-method.md — метод F&F-тестирования (урок r10): тест по скомпилированной доке (dev-сервер localhost:5108), порядок хендоффа 16, битый пример = возврат, schedjs.com заглушка. index.md updated (+1).

[2026-08-16] ingest | concepts/pilonuxt-restart-vs-redeploy-2026-08-16.md — день деплоев стека 16 (7 операций): рестарт vs пересборка разведены как отдельные операции. Рестарт сбрасывает in-memory viewModel кэш content-api (цена за м³ подтянулась после рестарта без пересборки); пересборка — только для кода. Анти-симптом: 500 на категориях с логом @snolla/core viewModels/index.js:419 _.find(x=>x.name) = код/данные (Content object vs array, admin-api create), рестарт не лечит — фикс snolla core 0.26.7 + admin-api 0.11.0 array-canon (1128ddc → 64c2539). Откат-цепочка образов 64c2539→…→8b7e8c4. +index.md. Монорепа-сторона заингестена прогером (lazy-data-not-found-404, admin-api-content-wire array-canon, cms-edits-cache-restart, v-html-on-component-ssr, admin-api-content-edit).

[2026-08-14] decision | FormSubmissions.Content ₽→«?» — координация закрыта. ALTER на клиентской stostayer сделан (.admin); snolla опубликовала @snolla/data@0.15.1 (STRING→TEXT=NVARCHAR(MAX), тесты 7/7); скан живых БД VDS: MoreThenCms+Staging уже nvarchar (ALTER не нужен), VDS-stostayer varchar — не прод, не трогаем (роль — к оператору); legacy stostayer.web на @snollajs 0.7.x — фикс не едет, ALTER покрывает (backport опция 065bb44); формы есть у всех сайтов тиража (pilorama98 2516/labtools 916 — вопреки гипотезе snolla). Бонус: email-контракт задокументирован snolla (forms-email-contract.md), warn при пустом to — ждёт решения vitya. Таска snolla [formsubmissions-content-nvarchar] закрыта.

[2026-08-14] implement | MSSQL stayer_site: ALTER FormSubmissions.Content varchar(max) cp1251 → NVARCHAR(MAX) (запрос их прогера: ₽→«?» в письмах с калькулятора). Verify до/после (nvarchar max). Live-тест не гонял, тестовые заявки #68485/#68486 не удалял (ждут подтверждения). Соединение: tedious из packages/web node_modules, MSSQL 91.222.236.225:1433 открыт снаружи.

[2026-08-14] lint | inbox-rename cascade audit (idea 13): rg по живых инструкциях .admin — единственный хит log.md (op-log история, ок); stostayer.new — только маркеры «устаревший путь»; ack-письма в .agents/inbox подтверждены (.read); pi-расширение inbox-monitor (деплой+source of truth) на .agents/inbox, .claude-inbox не упоминается. Подтверждение оператору отправлено в .workshop/.agents/inbox.

[2026-08-13] ingest | UPDATE concepts/stostayer-web-deploy-runbook.md — offline-гоча ПОЧИНЕНА их коммитом 5c583f8 (supportedArchitectures libc glibc/musl): сетевой yarn install на build-машине долил linux-зипы в кэш, будущие offline-сборки чисты. Runbook переписан с рецептом. Ack-обмен с stostayer.new (их инбокс .agents/inbox/).

[2026-08-13] ingest | UPDATE concepts/stostayer-web-deploy-runbook.md — деплой stostayer-web:0.3.23 на прод www.stostayer.ru (запрос их прогера, письмо inbox). Нюансы зафиксированы: (1) offline-build НЕ проходит — в .yarn/cache нет linux-бинарей @esbuild/linux-x64/@rollup/rollup-linux-x64-gnu → обход через временный ARG/ENV VERDACCIO_TOKEN + --build-arg (после — revert); (2) Portainer API с хоста — base=http://<IP>:9000 (порт обязателен); (3) прод-тег в таблице актуализирован 0.3.18→0.3.23; (4) блок деплоя 0.3.23. Task [stostayer-web-deploy-0-3-23] 🟢.

[2026-08-12] implement | UPDATE entities/kreknin-synology.md — автосинк LE-серта: acme-nginx-sync.sh (cron 15 мин) ротирует серт git.kreknin.site из traefik acme.json в nginx DSM автоматически.

[2026-08-12] implement | UPDATE entities/kreknin-synology.md — LE-серт git.kreknin.site (из traefik acme.json) подложен в nginx DSM reverse proxy. Из LAN: валидный LE + Gitea, без DSM-пароля (root SSH).

[2026-08-12] implement | UPDATE entities/kreknin-synology.md — reverse proxy git.kreknin.site:443 → traefik:4443 на DSM nginx (server.ReverseProxy.conf w3conf + reload). Из LAN git.kreknin.site → Gitea (DNS-override + proxy), снаружи LE-серт. Осталось: LE-серт в DSM для git.kreknin.site (из LAN, без предупреждения).

[2026-08-12] implement | NEW concepts/keenetic-rci-api.md — разобрана автоматизация KeeneticOS 5.1.3 (RCI: GET /rci/show/*, POST /rci/ массив parse-команд). Через API добавлены DNS-записи git.kreknin.site/kreknin.site → 192.168.1.43 (решение сломанного hairpin). Проверено с LAN: всё 200. Правила порт-форвардинга в 5.x лежат в ip.static (to-host=MAC).

[2026-08-12] implement | UPDATE entities/kreknin-synology.md — Gitea 1.27.1 + postgres 16 на kreknin (для Алексея), traefik починен (restart policy), LE-серт git.kreknin.site, проброс 80/443→8000/4443 на Keenetic. KeeneticOS Viva API закрыт — правила в GUI. NAT loopback сломан → нужен DNS-override git.kreknin.site→192.168.1.43. Пароли: pass kreknin/keenetic + pass kreknin/gitea.

Wiki op-log

[2026-08-23] ingest | UPDATE concepts/books-vds-no-gitea-actions.md + concepts/registry-oci-image-index-gc.md — разбор sched docker-runner createPickingListPdf: (1) docker CLI читает креды только из ${DOCKER_CONFIG}/config.json, не docker-config.json (rename на slovo); (2) теги buildx/curl = OCI image-index, registry 2.8.3 отдаёт только на OCI-Accept, docker daemon → «manifest unknown» при отсутствующем child (после прежних host-GC) — фикс: перепуш docker schema2-манифестом (config mediaType container.image.v1+json, не distribution.image.config.v2+json); (3) production-конфиг daemon должен лежать в монтированной конфиг-дире (иначе плейсхолдер <SET_IN_PROD_VOLUME_MOUNT> в tasks.json). host-GC dry-run 2026-08-23: ~2.5МБ реклайма → нецелесообразен.

[2026-08-23] ingest | UPDATE concepts/books-vds-no-gitea-actions.md — деплой books-web master-a448cad (фикс 8 embed-api роутов, оба тенанта, инцидент DELETE-404 закрыт). Уроки в ранбук: (1) docker save на Docker 29 сразу даёт OCI-layout (index.json+blobs) — конвертация не нужна, amd64 child manifest в blobs/sha256/<index-digest>; (2) PUT /api/stacks/<id> синхронный, тянет образ ВНУТРИ запроса — клиентский таймаут рвёт ожидание, оп доделывается server-side, НЕ пере-PUT, проверять контейнеры через /api/endpoints/1/docker/containers/json + images/json; (3) смоук sched: docker exec <sched> node -e fetch(localhost:3031/api/runs) (curl в контейнере нет), Nuxt /admin/scheduler/** требует JWT isAdmin — ?token= 403. Процедура сборки шаг 3 уточнён.

[2026-08-23] ingest | NEW concepts/sched-ozon-creds-stub-contract.md — контракт кредов Ozon slovo/bookva: мисматч-пары в обеих БД — намеренные заглушки (анти-утечка после tenant-split). Урок: .admin «починил» заглушку (slovo seller 1 ← bookva-ключ) → откат 12:07Z по подтверждению владельца; зеркальная заглушка bookva seller 2 (12:15Z). Безопасность: break-on-error 2a38fb5 задеплоен (фейл-фаст без спина). verify по SHA2 (d6227b = slovo-ключ, f700f3 = bookva-ключ). НЕ чинить. Связано: инцидент 2026-08-23, перевод slovo → file-managed (887bbae).

[2026-08-14] ingest | NEW concepts/snolla-smtp-mail-delivery-2026-08.md — postmortem SMTP-инцидента 1214.08: 525 SMTP disabled (Яндекс 360, доменка) → переезд на e-16513832@yandex.ru (app-password); 554 SPAM на 2+ получателях от холодного ящика → @snolla/mailer@0.9.0 per-recipient (forms-api 0.2.0, web 0.44.0); 550 from not owned → mailSettings.from во всех production.json + шаблон pilorama98checkoutconfirm. Монитор SMTP на VDS (cron 08:00, ntfy) + parity-чек Portainer env. Рецепт деплоя тиража (порядок, гочи: ad-hoc контейнер vs Portainer, regex-парсинг image, yarn up -R data).

Append-only log of wiki operations (ingests, promotions, lints, migrations).

[2026-08-05] ingest | concepts/namespace-consolidation-snolla + concepts/admin-api-embed-pilonuxt — крупнейшие изменения сессии: неймспейс-миграция @snollajs→@snolla (17 пакетов, 8 сайтов бампнуты), admin-api embed в pilonuxt /admin/api, retire стека 25. +index.md строки.

[2026-07-29] implement | NEW concepts/snolla-local-admin-https-binding.md + UPDATE index.md (concepts +2 строки) — локальный .NET-админ snolla (catch-all IIS snolla) переведён на HTTPS. Повод: https://pilorama98.snolla.com/admin → 404 → ERR_CONNECTION_CLOSED. Корень 404: pilorama98.snolla.com не был в hosts-override → реальный DNS → VDS 89.253.255.94 → traefik без роута (системный прокси 127.0.0.1:10808 маскировал «server 127.0.0.1» в curl). pilorama98 — реальный сайт в dbo.Sites (Alias=pilorama98, PrimaryDomain=pilorama98.ru, Live), вне тиража-5 из design-дока. Корень ERR_CONNECTION_CLOSED: браузер HSTS-апгрейдил http→https, а локальный IIS без 443. Решение: IIS-native self-signed wildcard *.snolla.com на :443 + Trusted Root, НЕ traefik (локальный acme.json пуст → LE на snolla.com нет; traefik-as-TLS-terminator = NAT-loopback/docker.sock/URL-Rewrite/SERVER_PORT-leak готчи без выгоды). Скрипт elevated (UAC): New-SelfSignedCertificate -Subject '*.snolla.com' -DnsName '*.snolla.com','snolla.com' -TextExtension EKU serverAuth (гоча: -DnsName конфликтует с ручным SAN 2.5.29.17 → SAN через -DnsName) → копия в Cert:\LocalMachine\RootNew-WebBinding snolla https 443 * + AddSslCertificate + restart. Cert thumb 6E2212B4C13BD28E2FF680322F11741193E8C619, SAN *.snolla.com,snolla.com, 10 лет — покрывает все alias'ы. hosts: добавлен pilorama98.snolla.com (elevated, построчно — Get-Content -Raw мог опустошить файл). Результат: https://<alias>.snolla.com/admin/account/login → 200 форма SNOLLA (pilorama98/kupimknigi/internal/tandemmebel верифицированы). Голый /admin → 302 /login → 301 https://www.<PrimaryDomain>/ — предсуществующее поведение CMS (оператор подтвердил: «так и было» на RUVDS), не поломка миграции; рабочий entry-point /admin/account/login. on.snolla.com → 404: hosts стоит internal.snolla.com (реальный alias сайта on = internal), не on (design-док писал on). Trade-off: self-signed не LE — допустимо (админка локальная, FW закрыт). +index.md (2 строки: design-док ранее не был индексирован + новый page). Cross-ref snolla-local-admin-and-on-snolla-migration-design, traefik-on-windows-docker-desktop, stostayer-admin-minio-config.

[2026-07-22] fix | NEW concepts/stostayer-admin-minio-config.md — локальная .NET-админка stostayer (C:\sites\stostayer\Web.config, IIS :8090) переведена на рабочий stostayer MinIO. Исходно S3-провайдеры (MoreThenCms.FileStorage.S3 в bin/) уже стояли, но с 3 багами: (1) чужие креды AKIAJ2YJP72W6ZHCRE6Q = books-vds/snolla root-ключ (копипаст из snolla catch-all admin, не заменён на stostayer-свои → "Access Key Id does not exist"); (2) serviceURL=https://minio.stostayer.ruНЕ S3 API-порт ("S3 API Requests must be made to API port"), прод юзает minio-api.stostayer.ru; (3) authenticationRegion="local" → SigV4 регион-мismatch → AmazonS3Exception: the region is wrong; expecting 'us-west-1' (400) на GalleriesStorage.EnsureKeyPrefixExists (ToolsController.ImagePreviewCreatePreview). Креды stostayer MinIO не в pass — лежат в ~/projects/stostayer.new/packages/web/config/default.jsons3: accessKey stayer_minio, endpoint https://minio-api.stostayer.ru, region us-west-1. Fix: 3 глобальные замены × 9 S3-блоков в Web.config (accessKey/secretKey[XML-escaped >/&]/serviceURL) + region localus-west-1; бэкап Web.config.bak-2026-07-22; IIS recycle, лог чист. mc alias set + ListBuckets OK (10 бакетов: assets/galleries/themes/…); assets/9cf0a8e52cf144619fd290606a146d35/ несёт реальные файлы. Acceptance оператором: картинки грузятся. Админка=прод единое хранилище, ручное зеркалирование в App_Data упразднено. +index.md concepts-строка. Cross-ref galleries-storage-class-local-not-s3, snolla-admin-appdata-acl-500-after-scp-migration, minio-imgproxy-on-vds.

[2026-07-14] ingest | sources/de-vds-3xui-setup-2026-07-14.md (new) + entities/de-vds-3xui.md (sources: привязан) — полноценный ingest DE-сессии: sources-хроника с борьбой против 3x-ui 3.5.0 (CSRF-403 на login → CSRFMiddleware/X-CSRF-Token/GET {BP}csrf-token; прямой DB-insert в inbounds не рендерит → client-tables clients/client_inbounds/client_traffics заполняются только AddInbound → panel API POST {BP}panel/api/inbounds/add с stringified settings/streamSettings/sniffing; wrapper x-ui setting не применяет креды → бинарник). Эталон JSON снят с рабочего nl-vds 32030. +index.md sources-строка. Real RF-client confirmed.

[2026-07-14] decision | entities/de-vds-3xui.md — real-client из РФ подтверждён (user подключён через 32030, сессия идёт через узел). Plain VLESS = proven-working на обоих NL+DE. Задача [de-vds-3xui-setup] закрыта. Перекрестил Проверено блок .

[2026-07-14] ingest | entities/de-vds-3xui.md (new) — поднят VPN-VDS в Германии (Fornex 130.17.17.158, Ubuntu 24.04, 1/2G/20G), аналог nl-vds-3xui. Повторён только proven-working plain VLESS 32030 security=none (на NL у боевых клиентов из РФ заработал только он); Reality/MTProto/SOCKS5 намеренно НЕ подняты. Креды → pass de-vds-3xui/full-env. 3x-ui тут 3.5.0 (на NL была 3.2.7) — вскрыл новые гоча, зафиксированы в entity: (1) CSRF на всех panel POST (CSRFMiddleware → 403 пустое тело+CSP-nonce без заголовка X-CSRF-Token; токен — GET {BP}csrf-token; login = POST {BP}login JSON); (2) прямой INSERT в inbounds НЕ рендерит инбаунд в 3.5.0 — клиентская модель разнесена по clients/client_inbounds/client_traffics, заполняется только сервисом AddInbound → инбаунд надо создавать через panel API POST {BP}panel/api/inbounds/add (body=model.Inbound camelCase, settings/streamSettings/sniffing stringified); (3) wrapper x-ui setting -username/-password НЕ применяет — только бинарник /usr/local/x-ui/x-ui setting (после systemctl stop x-ui). Server-side e2e подтверждён (xray слушает 32030, exit=сервер); реальный РФ-клиент ждёт проверки user. +index.md.

[2026-07-12] deploy | tandemmebel.ru in-place bump 0.42.0→0.42.1 LIVE (стек 20) — поверх cutover'а того же дня (стек уже боевой, образ ed96b18/0.42.0). Консюмер-бамп сделан оператором сам (тот же блокер-паттерн 0.42.0 2026-07-04 — теперь решён без запроса dev-source): пин apps/web/package.json:12 0.42.0→0.42.1 + yarn install (lock snolla 0.42.1/core 0.24.1/liquid 0.10.2/data 0.14.1) + commit 0cd9351 + push origin (ls-remote confirmed). Verdaccio: 0.42.1 published (latest). Build на VDS → registry.kzntsv.site/tandemmebel:0cd9351 (digest f29c187f). Throwaway-staging :5020 из env живого стека, healthy. Completeness-gate С VDS: 184/184 parity (NEW==PROD, вкл. 0.42.x sitemap-реструктуризацию), единственный 404 /articles идентичен прод-оракулу → benign. Operator-gated PUT стека 20 (node put-stack.js, env 8/8 preserve, prune:false pullImage:true) → контейнер 0cd9351+healthy ~8s. Live-smoke GREEN (robots/home/projects/sitemap 200, TLS-серт CN не дёрнут). 0.42.1 = order-tag Drop-field fix, инертен на блог-портфолио (без e-commerce каталога). NEW concepts/tandemmebel-vds-deploy-runbook.md + UPDATE concepts/snolla-live-prod-inplace-image-bump.md (тираж 0.42.1 = 4 in-place bump-сайта) + host-stacks/vds-kzntsv/tandemmebel.compose.yml (тег+комментарий 0.42.1) + index.md. Rollback = тег ed96b18 в registry (+ b02ca18). Тираж snolla 0.42.1 закрыт полностью.

[2026-07-12] deploy | tandemmebel.ru cutover LIVE — последний из тиража snolla 0.42.x. DNS reg.ru tandemmebel.ru+www→89.253.255.94 (verify ns1/ns2.reg.ru оба), traefik Host-rule staging→боевой на стеке 20 (env 8/8 preserve, prune:false, pullImage:false — образ ed96b18/0.42.0 не менялся, без пересборки по решению оператора). LE-серт issued on first hit: CN=tandemmebel.ru, SAN оба, until 2026-10-10. Live-smoke С VDS GREEN: key pages 200, sitemap 184 page-locs, sharp media webp 200, robots из БД. Gotham-Pro.css 0B→4436B (латентный прод-баг починен). Rollback = revert DNS→80.64.31.36 ИЛИ PUT staging-host. UPDATE entities/ruvds-iis-host (tandemmebel→🗑️ cutover VDS, биндинги оставлены как rollback) + host-stacks/vds-kzntsv/tandemmebel.compose.yml (rule боевой, заголовок live). Тираж snolla 0.42.x полностью живой (5/5 стеков на VDS).

[2026-07-03] ingest | NEW concepts/snolla-admin-appdata-acl-500-after-scp-migration — разведка «почему /admin/assets/<owner>/delete → 500» на RUVDS IIS. Корень: app pool IIS AppPool\snolla (ApplicationPoolIdentity) имел на C:\sites\snolla\App_Data только (RX) после scp-миграции 23.05 → File.Delete в AssetsService.DeleteAsset кидает UnauthorizedAccessException → необработанное 500 (event log пуст, IIS substatus 0/win32 0). NRE-версии исключены проверкой строк в БД (Folders root + Files). Fix: icacls App_Data /grant "IIS AppPool\snolla:(OI)(CI)(M)" /T (44293 файла, verified (I)(M) на таргете). Класс шире delete — все Local-записи из админки (upload/кэши/галереи). Также: заменён labtools-price.pdf (owner d375c419) в ОБА хранилища (MinIO assets/… ETag→6426ddd0 + локалка IIS, MD5 сверены). Split-brain админка(Local)↔боевой app(MinIO) — cross-ref concepts/galleries-storage-class-local-not-s3.

[2026-06-29] deploy | pilorama98.ru (контейнер pilonuxt) cf2bba2 LIVE (стек 16) — ADR-0010: формы переехали с monolith @snollajs/snolla на @snollajs/forms-api, snolla дропнут целиком, core@0.1.1 (Buffer вместо btoa). Тот же build-пайплайн (форс-регенерация клиента + save|ssh load + push с VDS). Новый обязательный шаг — tree-check .output/server/node_modules ПЕРЕД перекатом (вся сага content-api↔snolla про dual-instance, dev маскирует unmet-deps): docker run --rm --entrypoint sh <img> -c 'find /app/.output/server/node_modules ...' → подтвердил 0× snolla, 0× btoa, ровно 1× data@0.9.1, core 0.1.1 + content-api 0.14 + forms-api 0.1.0. Smoke: SSR /+/catalog→200 (= btoa/snolla-дроп бандл не сломал), robots/yandex из БД (ADR-0009 не регресс), форма POST /snolla-forms/forms?path=/checkout пустой→422 JSON (valid НЕ слал — реальное письмо менеджеру), /nope→404. Гоча smoke-харнеса: forms-api отдаёт 422 только при Accept: application/json (иначе prefersJson(req) false → ветка res.status(result.status||404).end() даёт 404 — это не баг приложения, а отсутствие Accept в curl). Источник: наряд [deploy-pilonuxt-forms-api-drop-snolla]. См. concepts/portainer-stack-management-vds § Stack redeploy.

[2026-06-29] deploy | pilorama98.ru (контейнер pilonuxt) 40bb383 LIVE (стек 16) — DB-backed staticPages + robots.txt (ADR-0009). Build из монорепы victor/pilorama98.ru: ключевой шаг — форс-регенерация gitignored-клиента apps/web/src/generated/ (rm -rf + yarn workspace nuxt-app schema-gen против live MSSQL), иначе ensure-schema skip-if-present собрал бы старый клиент без getStaticPage/getRobotsTxt → server-500. Push с дома повторил traefik-499 на .output-слое даже при образе 425МБ (не multi-GB) → канонический fallback docker save | ssh vds 'docker load' + push с VDS (registry локален) сработал. Перекат через Portainer PUT стек 16 (pullImage:true, байты+UTF8 gotcha #9). Smoke acceptance 6/6 телами: robots полный из БД (Yandex Clean-param + Sitemap, не статика), yandex/google верификации 200, /nope→Nuxt-404, /+/catalog→200. Источник: наряд [deploy-pilonuxt-static-pages-robots]. См. concepts/portainer-stack-management-vds § Stack redeploy.

[2026-06-24] ingest | entities/vdsina-outline-3xui.md (new) + sources/vdsina-outline-3xui-inventory-2026-06-24.md (new) — задокументирован ранее неизвестный VDS: VDSina Амстердам 46.151.25.64 (v1621967.hosted-by-vdsina.ru), «основной боевой VPN» семьи. Два стека на одной машине: Outline/Shadowbox (docker, :443 chacha20, 11 access-keys, mgmt :8080) + 3x-UI/Xray 25.10.15 (панель :50806 /ecCqrtFVl4zl5kFjdj/, VLESS xhttp :43666 / grpc :46743, все security=none). Ubuntu 20.04.6 (панель VDSina врёт «22»), 1 vCPU/1 GiB/30 GiB, up 17д, healthy. Секреты → pass vdsina-outline/full-env (host-key, root pass, Outline mgmt apiUrl+cert+11 keys, panel user+secret). Открытое: пароль панели — только bcrypt-хеш, plaintext не извлечён. Кросс-линк добавлен в nl-vds-3xui (другой NL-VDS, Aeza). +index.md (2 строки). Источник: SSH-инвентаризация 2026-06-24.

[2026-06-18] ingest | concepts/registry-oci-image-index-gc.md (раздел real-run) — первый боевой registryGc dryRun:false на dangling-фиксе (books master-289c660, под добро юзера): 63 DELETE, 0 ошибок, 0×405 → REGISTRY_STORAGE_DELETE_ENABLED=true подтверждён живьём; 61 dangling + 2 datable снесены, реестр почищен (web 20→4 и т.д.). Побочка-урок: master у books-api/books-ops-mcp был dangling (не пересобирались ~3нед) → снесён → :master 404 (outage нет, контейнеры на локальных образах, но redeploy упрётся). Политика: не удалять named-теги master/latest даже dangling (protectRe → +master/latest); проверить keep/drop digest-коллизию. Источник: real run + post-state probe books-* :master.

[2026-06-18] ingest | concepts/registry-oci-image-index-gc.md (раздел dangling-индексы) — перепрогон registryGc dryRun на descent-фиксе (master-dcd7c91) вскрыл 2-й root-cause: реестр засорён dangling image-индексами (тег жив, платформенный sub-manifest отдаёт MANIFEST_UNKNOWN — вычищен прежним host-side registry garbage-collect, не следящим index→child для multi-arch). books-web: 19 тегов → 3 датируемых, 16 dangling. date-GC защищает их как null-dated → не удаляет, хотя они и есть мусор (логика задом наперёд). Рекомендация books: различать transient-error (protect) vs MANIFEST_UNKNOWN (eligible). freedBytes от dangling ~0 (слои уже вычищены). +index.md hook. Источник: dryRun #2 + полный manifest-обход books-web 2026-06-18.

[2026-06-18] ingest | concepts/registry-oci-image-index-gc.md (new) + concepts/bindmount-config-edit-preserve-mode.md (расширен) — следствие закрытия [books-task-runner-registry-auth-cred]. (1) Новый концепт: 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), 1 версия=1 index+attestation. Зафиксировано на books registryGc dryRun (deleted=0 при 14 tags). (2) bindmount-постмортем дополнен: bind-mount затеняет config-каталог образа целиком → нужна полная кред-секция, не дельта; + worked example task-runner registry-секция (mode не слетел, постмортем сработал). +index.md (2 строки). Источник: dryRun-верификация registryGc + манифест-dump books-web 2026-06-18.

[2026-06-18] ingest | concepts/registry-kzntsv-auth-model.md (new) + concepts/bindmount-config-edit-preserve-mode.md (new) — registry.kzntsv.site = standalone registry:2 + htpasswd Basic (бинарный доступ, НЕ Gitea-packages; нет per-repo ACL/robot-токенов; hot-reload htpasswd; GC через v2 DELETE + host garbage-collect; завёл юзера books-ci для books job-scheduler pull, кред в pass vds-kzntsv/registry-books-ci). Постмортем: правка bind-mounted default.json через mktemp+mv уронила режим 644→600 → books-job-scheduler EACCES crash-loop (прод-даун slovo-cron), fix chmod/chown --reference=backup. +entities/vds-kzntsv.md (registry-строка) +index.md. Источник: консультация+инфра-деплой books registry-auth + инцидент 2026-06-18.

[2026-06-17] ingest | concepts/stostayer-web-deploy-runbook.md (new) — ранбук деплоя легаси web на прод stostayer: канал build(offline)→push docker.stostayer.ru→Portainer-стек 16 через container-IP API (172.18.0.2:9000) с хоста мимо Angie BA; rollback; БЛОКЕР ESM-стена (top-level await @stostayer/data на build + ERR_REQUIRE_ESM @snollajs/snolla в рантайме d02f740) → 0.3.18 остаётся; гоча VPN-IP бан хостером при retry-push-шторме. Источник: попытка деплоя stostayer-web-complaint-form-deploy 2026-06-17 (откат на 0.3.18). +index.md.

[2026-06-17] update | entities/windows-recovery-host.md — уточнён live-state двух stostayer-IIS-сайтов: добавлена таблица порт→connection string→БД (stostayer :8090→www.stostayer.ru,1433 внешний прод + S3 minio.stostayer.ru; stostayer.old :8091→mssql.kzntsv.site,1433 наш VDS), путь админок /admin, live-проверка 2026-06-17 (W3SVC Running, :8090/:8091 LISTENING, :80 нет). Пофикшена стейловая строка в «Ключевые папки» (stostayer.old conn localhost→mssql.kzntsv.site). Источник: live-аудит IIS на DESKTOP-NSEF0UK.

[2026-06-17] update | concepts/portainer-stack-management-vds.md +раздел «Stack redeploy (новый image tag)» (JWT→GET file байтами→подмена тега→PUT pullImage:true, env=[] плейсхолдером, тело UTF-8) + gotcha #9 (PS 5.1 Invoke-RestMethod декодит /file как ISO-8859-1 → кириллические compose-комментарии mojibake → PUT падает yaml: could not find expected ':'; fix = байты+UTF8) + #10 (пустой env схлопывается). Источник: redeploy-pilonuxt-gsc-structured-data (19a4a84 в проде, stack 16).

[2026-06-14] update | concepts/minio-imgproxy-on-vds.md +раздел «S3 access для клиентских приложений» (lookup: endpoint https://minio.kzntsv.site / сырой 89.253.255.133:9000 / inter http://minio:9000, root accessKey AKIAJ... + secret в pass minio-vds/full-env, форма ключа, ssl/region/pathStyle). Закрывает класс-вопрос «дай MinIO endpoint+креды» БЕЗ SSH. Прецедент: inbox snolla 2026-06-14 (raw-stream content-api), ответ отправлен.

[2026-06-11] ingest | verdaccio-restore-packument-desync — postmortem: disaster-restore вернул тарболлы но древний/пустой packument → publish свежей версии EEXISTS 409. Fix: снять только коллизирующий целевой .tgz (бэкап first), republish; НЕ rm -rf каталог (убьёт locally-published историю). Применено к @snollajs/{data,mailer,numbering,content-api}.

[2026-06-11] ingest | verdaccio-token-lifecycle — restart trap (ephemeral secret → 401), max_users:-1 + pnpm 409 постмортем, JWT config fix, yarn classic vs berry token refresh recipe.

[2026-06-11] ingest | yarn-npm-minimal-age-gate — Yarn ≥4.16 client-side supply-chain gate: версии <24ч → YN0016 «quarantined». Независим от auth (gate #2 после 401). default 1d, читается глобально (per-scope не работает), fix npmMinimalAgeGate:0 / YARN_NPM_MINIMAL_AGE_GATE=0. Диагностировано с pilorama98.ru (контейнер pilonuxt); опровергнута первичная гипотеза «серверный карантин verdaccio».

[2026-06-11] update | MSSQL backup gap closed — /opt/stacks/backup/scripts/run.sh расширен: 5 prod DBs через docker exec mssql sqlcmd BACKUP DATABASE ... WITH COPY_ONLY, INIT (Express, без COMPRESSION); .bak в bind-mount → mv в DUMP_DIR → rsync kreknin. Обновлён concepts/mssql-on-vds (TODO→реализовано).

[2026-06-11] lint | 10 issues found, 8 fixed inline

  • 🔴 recovery-architecture-snapshot.md: добавлена пометка ИСТОРИЧЕСКАЯ ЗАПИСЬ (рерайт текущей архитектуры отложен — большая задача)
  • 🔴 snolla-recovery-vm.md: помечена УДАЛЕНА 2026-06-08, updated date исправлен
  • 🟡 ruvds-iis-host.md: зачёркнуты 2 закрытых риска (imgproxy SPOF снят, LE renewal закрыт); добавлена ссылка на winacme; updated 2026-06-11
  • 🟡 future-resilient-architecture-goals.md: dead task link cms-stopgap-backup-daily заменён на текстовое примечание
  • 🟡 mssql-on-vds.md: исправлен frontmatter (status→type, добавлен updated)
  • 🟡 vds-kzntsv.md: добавлен MSSQL в software stack table
  • 🟡 orphan winacme-iis-owin-catchall-http01: входящая ссылка добавлена из ruvds-iis-host
  • ДОФИКСИРОВАНО: 3 broken links в recovery-architecture-snapshot убиты; TODO mssql backup integration закрыт (реализован)
  • НЕ ФИКСИРОВАНО: orphan mssql-container-data-restore — оставлен

[2026-06-08] update | entities/windows-recovery-host — декоммишн после Synology-recovery: снесены traefik/mssql/minio/imgproxy/es + 21 husk-стек + VM snolla-recovery (95ГБ) + C:\nas-recovery (~150ГБ) + IIS-сайт snolla + C:\sites\snolla + локальный MSSQL. Осталось: IIS stostayer/stostayer.old (репойнт на mssql.kzntsv.site, orphan-fix), lightrag, markitdown-MCP, mutable-dev VM. C: free 62→275ГБ (+~176ГБ docker pending vhdx-compact). image-pipeline SPOF снят. Источник: .tasks/decommission-windows-recovery-host.md.

[2026-06-08] ingest | concepts/morethencms-null-settingsdata-https-502 — RCA+fix: maljarka.tandemmebel.ru отдавал 502 только на HTTPS (HTTP=200). Корень = dbo.Sites.SettingsData=NULL у тенанта maljarka (нет блока httpSecure) → KeyNotFoundException в SnollaMiddleware/Owin.ErrorHandler на HTTPS-ветке. Fix = UPDATE dbo.Sites SET SettingsData='{httpSecure:...}' + Restart-WebAppPool snolla; verified 443→200 server-local + external. Audit: maljarka — единственный NULL-сайт с :443-биндингом; rimiz degraded по другой причине. Обновлён ../entities/ruvds-iis-host. Источник: live-диагностика 2026-06-08.

[2026-06-05] ingest | concepts/winacme-iis-owin-catchall-http01 — постоянный self-renewing LE pipeline на RUVDS IIS (win-acme v2.2.9, 25-SAN cert, SYSTEM scheduled task). Главное: OWIN-catch-all CMS жрёт /.well-known/acme-challenge/ → решено отдельным IIS-приложением в пуле «No Managed Code» + патч шаблона Web_Config.xml (snять Owin-handler). Заменяет ручной traefik-acme-json-to-iis-cert-import для renewal'а; снимает зависимость RUVDS от домашнего traefik. Закрывает дедлайн cert-expiry 2026-07-22 (новый cert до 2026-09-03). Источник: .tasks/iis-migration-to-ruvds.md Decisions log 2026-06-05.

[2026-05-28] ingest | concepts/es-destructive-delete-incident-2026-05-26 — RCA для удаления 3 user-индексов на canonical ES elasticsearch.kzntsv.site (books VDS stack 33) во время cutover-prep. Caller identity unrecoverable (audit log = X-Pack платный, traefik accessLog был выключен). 2 preventive controls applied + verified: ES env action.destructive_requires_name=true + traefik JSON accessLog. Источник: .tasks/restore-elasticsearch-indices-books-vds.md § Closure note.

2026-05-21

  • bootstrap: empty wiki skeleton (CLAUDE.md, index.md, log.md, overview.md, raw/README.md) committed

[2026-05-21] ingest | concepts/admin-infra-project

[2026-05-21] seed | CLAUDE.md Domain conventions — design-context pointers (task: admin-infra-project-pointers)

[2026-05-21] migrate | subtree-import 6 entities + 17 concepts + 3 sources from MoreThenCms (history preserved via subtree-split + temp-prefix merge)

[2026-05-21] regen | index.md catalog refresh after subtree import

[2026-05-21] ingest | concepts/ocis-on-vds-deploy-recipe — oCIS deploy recipe + gotchas (UID mismatch, PROXY_TLS, PROXY_ENABLE_BASIC_AUTH, LibreGraph user-create); updated entities/vds-kzntsv (added owncloud row to stack/hostnames/file-layout); source: .tasks/owncloud-vds-deploy.md

[2026-05-23] ingest | concepts/windows-server-2025-core-bootstrap — default-blockers (SMB closed, IIS/URL-Rewrite/.NET unverified) + transfer-методов матрица (RDP-redirect / SMB / WinRM / SFTP); recommendation = SMB inbound с source-IP whitelist на время migration. Source: failed-robocopy инцидент 2026-05-23 18:08 (.tasks/iis-migration-to-ruvds.md Decisions log).

[2026-05-24] ingest | concepts/books-ssh-access — SSH access audit на shared VDS pre-cutover Фазы 3 tenant-split. Retained keys table (1 key, vitya core dev), removed cosmetic dead root key, sshd hardening verified via sshd -T (not raw config), fail2ban active 2670 failed/37 banned, only vitya@94.19.247.14 в access log last 7 days. Source: .tasks/books-ssh-audit-shared-vds.md.

[2026-05-24] ingest | RUVDS IIS migration + backup pipeline — entities/ruvds-iis-host (NEW, 80.64.31.36 Win Server 2025 Core, 25 SNI bindings, 2/24 hostnames DNS-flipped) + sources/iis-migration-to-ruvds-2026-05-23 (NEW, SSH/scp pivot после SMB-block by home-ISP) + sources/ruvds-backup-daily-kreknin-2026-05-24 (NEW, rclone+SFTP SYSTEM task daily 04:30) + concepts/traefik-acme-json-to-iis-cert-import (NEW, PFX+SNI recipe) + UPDATE concepts/windows-server-2025-core-bootstrap (SMB deprecate, HTTP middlebox warning, HTTP/2 note, backup-strategy + cert-import закрыты) + UPDATE entities/windows-recovery-host (IIS partial-cutover state, imgproxy SPOF carve-out) + UPDATE overview (RUVDS line). Sources: .tasks/iis-migration-to-ruvds.md, .tasks/ruvds-backup-daily-kreknin.md.

[2026-05-28] ingest | vds-kzntsv DHCP outage postmortem — concepts/vds-kzntsv-dhcp-outage-2026-05-28 (NEW, симптомокартина + диагностический алгоритм + recovery runbook + RCA) + sources/vds-kzntsv-incident-2026-05-28 (NEW, timeline 05:25 backup OK → 08:15 detect → 08:43 statics fix → 08:50 disk GC; ticket text) + UPDATE entities/vds-kzntsv (Доступ §+subnet/gw/hypervisor/DNS resolvers; pass-store вместо .common/secrets; Known issues §NEW with 2026-05-28 incident; Open issues bump GC priority + iputils-ping note) + UPDATE concepts/rusonyx-vps-onboarding-quirks (quirk #9 NEW — gw в /18 надсети + recovery commands). Live session, no raw source ingested.

[2026-05-28] update | vds-kzntsv DHCP outage post-resolution — после reset хостером в 13:52 MSK выяснилось что root cause — конфликт двух сетевых стеков (netplan+networkd поверх ожидаемого provider's ifupdown). Их start/ipadd ожидает чистый ifupdown, не мог auto-recover при разрыве DHCP binding. Resolution: mask netplan+systemd-networkd, reboot, provider положил /etc/network/interfaces.d/ifcfg-eth0 с /18 netmask. UPDATE concepts/vds-kzntsv-dhcp-outage-2026-05-28 (revised RCA + permanent-fix § + anti-pattern + revised lessons-learned) + UPDATE sources/vds-kzntsv-incident-2026-05-28 (timeline до 14:00 + final config) + UPDATE entities/vds-kzntsv (mask /18, ifupdown stack, kernel cmdline net.ifnames=0) + UPDATE concepts/rusonyx-vps-onboarding-quirks (quirk #9 переписан про /18, quirk #10 NEW про ifupdown vs netplan stack). Memory vds-kzntsv-rusonyx-network-recovery переписан с новыми фактами.

[2026-05-29] update | ES destructive-delete RECURRENCE — true root cause найден, диагноз сменился. UPDATE concepts/es-destructive-delete-incident-2026-05-26 (correction-блок + Hypothesis помечена ОПРОВЕРГНУТА + новая секция «Рецидив 2026-05-29 — true root cause»: ransom-бот через открытый 0.0.0.0:9200 мимо traefik+basicAuth, ES 7.10 free без auth; read_me=BTC-выкуп; снос by-name мимо Control #1; accessLog пуст т.к. бот шёл прямо в :9200; firewalld bypass docker-publish; Control #3 = убрать публикацию host-порта via Portainer PUT stack 33; restore из daily-2026-05-25; exposure-audit таблица — mongo/books-db/bookva-db/minio/bookva-minio тоже exposed но credentialed). bookva не пострадал (bookva-es порт не публикует). Live incident response session.

[2026-06-05] ingest | NL VDS 3x-UI node + Reality PQ×dest root-cause

  • new entities/nl-vds-3xui.md (213.176.64.253, Ubuntu 24.04, 3x-UI 3.2.7 / Xray 26.6.1); creds -> pass nl-vds-3xui/full-env
  • new concepts/reality-pq-mldsa65-dest-incompatibility.md (root cause: ML-DSA-65 PQ ClientHello X25519MLKEM768 + Akamai dest www.intel.com -> HRR -> handshake fail; fix = PQ-capable dest e.g. www.microsoft.com, verified via isolation matrix)
  • index.md updated (entity + concept). Fix NOT applied — awaiting user command.

[2026-06-05] ingest | NL VDS 3x-UI session — honest final state + lessons

  • NEW sources/nl-vds-3xui-setup-2026-06-05.md (chronicle: Reality PQ fix, port 443→2053, mtg MTProto, SOCKS5, friend-client instr; HONEST outcome — у реальных клиентов из РФ работает только plain VLESS 32030)
  • NEW concepts/proxy-debugging-test-the-real-client.md (anti-pattern: свои curl/standalone-тесты ≠ боевой клиент; overclaim «РКН режет 443» / MSS-clamp по MTU-догадке сломал коннект)
  • REWROTE entities/nl-vds-3xui.md — убраны ложные «Reality verified/fixed», «mtg неотличим»; честная таблица статусов (32030 🟢, Reality 2053 / MTProto 8443 / SOCKS 47020 🔴 у клиентов); MSS-clamp снят
  • UPDATE concepts/reality-pq-mldsa65-dest-incompatibility.md — caveat «снятие PQ ≠ рабочий Reality у GUI-клиентов» + source link
  • index.md updated (2 new pages). Креды/ссылки — pass nl-vds-3xui/full-env.

[2026-06-06] decision | nl-vds-3xui: +3 classic Shadowsocks inbounds (ports 32031/32/33) for Outline-app, per-key revocable; protocol e2e-tested OK, RF reachability unverified (SS DPI-blocked in RF); creds in pass; discovered undocumented VLESS:13027.

[2026-06-10] ingest | concepts/mcp-init-resilience

[2026-06-27] refactor | books-vds: документирован публичный bookva-db endpoint :33306 (+ slovo/bookva DB-exposure, mongo/ES internal) в § Доступ; закрыт wiki-drift по порту

[2026-07-05] decision | тираж snolla 0.42.1 (live-prod in-place bumps). NEW concepts/snolla-live-prod-inplace-image-bump.md (переиспользуемый рецепт build→staging-acceptance-С-VDS→env-preserving Portainer PUT put-stack.js→live-smoke). UPDATE 3 рунбука секцией «0.42.1 in-place bump»: labtools-vds-deploy-runbook (стек 17, labtools:566d41c), emspb-vds-deploy-runbook (18, emspb:95a5c42), labtools.pro-vds-deploy-runbook (19, labtools-pro:0610432). FIX orphan: все 3 рунбука добавлены в index.md (не были каталогизированы). Tasks [labtools-ru|emspb|labtools-pro-deploy-snolla-0-42-1] 🟢.

[2026-07-24] ingest | concepts/stostayer-markdown-render-404-incident-2026-07.md — постмортем инцидента 404/500 на body_repair_service (stostayer.ru). Двойной корень: (1) код-баг snolla import markdown from 'markdown-it'; markdown(); → инстанс выброшен, markdown.render undefined, краш на markdown-поле-шаблонах (латентный ~3 мес, с коммита 1e3f897 2026-04-21); (2) exact-pin-staleness — @snollajs/content-api@0.8.0 workspace:* запёк @snollajs/snolla: 0.7.4 exact → фиксовая 0.7.7 легла top-level, content-api юзал nested баговую 0.7.4. Фикс: snolla 0.7.7 + core 0.26.1 (код) + content-api 0.8.2 ^0.7.7 (упаковка). Деплой stostayer-web:0.3.22 через pscp SSH:20435 + sudo docker load + Portainer PUT pullImage:false (без push в :443, бана нет). Pre-build чек yarn.lock single-snolla ловит класс. index.md updated (+1). Cleanup workspace-caret-interpackage-deps — vitya scope. Memory: stostayer-deploy-image-via-pscp-load-avoid-443-push.md.

[2026-08-13] refactor | concepts/stostayer-web-deploy-runbook — letter path .claude-inbox.agents/inbox (rename idea 13 cascade)

[2026-08-18] ingest | NEW concepts/sched-fnf-r8-verification-stand.md — стенд верификации F&F r8 (schedule-as-entity): путь, версии core 0.40.1/storage-* 0.3.1, карта 15 репро-скриптов (миграции/движок/политики), подтверждённый контракт, как продолжить №4/№5. NEW concepts/windows-docker-test-harness-gotchas.md — переиспользуемые грабли Windows-верификации (rmSync-EBUSY, vitest-DDL-таймаут, монотонность фейк-часов, изоляция DB, висельники node). index.md updated (+2).

[2026-08-18] ingest | UPDATE concepts/sched-fnf-r8-verification-stand.md — сессия №4/№5: admin-api-test.mjs (52/52, F1 tz-hoist + F3 PATCH-merge подтверждены на core 0.40.2), UI-стенд ui-backend.mjs + sched-ui serve :8081 + браузерный CDP (13/13), находки U1 (форма-tz interval/once → 400) и U2 (таблица шире контейнера ~58px). index.md hook обновлён.

[2026-08-18] ingest | NEW concepts/nvm-junction-ismain-gate-gotcha.md — ESM isMain-гейт молча no-op под junction-префиксом npm-рута (C:\nvm4w\nodejs → realpath …\nvm\v22.22.0): import.meta.url резолвится в realpath, argv[1] держит литеральный → main() не выполняется, exit 0. Бьёт global-install под любым version-manager'ом (nvm/mise/volta). Фикс realpath-сравнения (sched bd38aab, daemon 0.3.2). NEW concepts/nvm-windows-node-switch.md — Node 22→24.19.0 рецепт: junction-свап, per-version глобалы, PATH-кэш shell'а, npm 11 allow-scripts. Оба из сессии CLI-F&F sched 2026-08-18. index.md updated (+2).

[2026-08-18] ingest | NEW concepts/openapi-generator-3-1-spec-gotchas.md — из F&F openapi-client sched (2026-08-18): генерация Python-клиента из 3.1-спеки openapi-generator 7.24.0. Гочи: (1) ответы {} в спеке + wrapped-тело ({task/run/schedule:…}) → pydantic ValidationError, фикс — реальные схемы ответов, обход raw-транспорт + by_alias=True; (2) const:true → строковый enum ('true') ломает boolean; (3) oneOf+discriminator → actual_instance=None, контент только через raw JSON; Java 11+ обязателен (системная 8 падает), Windows excluded-порты 8090/8091 (EACCES), консоль cp1251 без →/«». Полные находки F-1..F-5: sched/.agents/inbox репорт 19:15Z; пример sched/examples/admin-client-python (24/24). index.md updated.

[2026-08-18] ingest | NEW concepts/sched-admin-client-openapi.md — F&F раунд openapi-claim sched (по предписанию таски): Python-клиент одной командой (openapi-generator 7.24.0 из спеки verdaccio 0.1.2), сьют 24/24 + smoke 19/19 против published daemon 0.3.4 (:8127), вердикт «claim подтверждён с оговорками» (8 операций требуют raw-обхода). Код sched/examples/admin-client-python (e89e868), репорт — sched инбокс 19:15Z, находки F-1..F-5 (спеку не чинил). Таска [sched-admin-client-openapi] 🟢. Гочи генерации — concepts/openapi-generator-3-1-spec-gotchas.md. index.md updated.

[2026-08-18] ingest | UPDATE concepts/openapi-generator-3-1-spec-gotchas.md + concepts/sched-admin-client-openapi.md — round 2 ретест (0.2.0/daemon 0.3.5): все 5 находок F-1..F-5 закрыты, raw_ops.py удалён, 11/11 ранее-сырых операций typed-only, сьют 24/24 + smoke 19/19 (коммит sched d658ff0, репорт sched инбокс 22:55Z). Новые грабли в окружение: CLI спавнит java из PATH а не JAVA_HOME; wrapped-ответы в components.responses → InlineObjectN; info.version не бьётся с версией пакета. index.md hooks обновлены.

[2026-08-23] ingest | NEW concepts/sched-runtime-to-file-managed-migration.md — sched slovo+bookva переведены на file-managed (durable config, #991 closed): инцидент 2026-08-23 (спин, runtime-расписания в памяти демона) → миграционный рецепт (файл in-place из git, live-sync ≤60с НЕ конвертирует runtime-таски, DELETE /api/tasks+/schedules, verify fileManaged:true/дубли 0/ручной run), gotchas (id=taskName vs UUID, ghost-таски, task-runner config кэш→рестарт, SMTP from==auth Yandex, URL-encode имён). SMTP-уроки линкуются на snolla-smtp-mail-delivery-2026-08 (не дублируются). index.md updated (+1).

[2026-08-23] ingest | NEW 3 concepts (books deploy session): books-vds-no-gitea-actions (решение: Actions выпилены, сборка локально, процедура + gotcha больших пушей), registry-traefik-buffering-gotcha (Client Closed Request на >1.5GB пушах, обход curl-монолитами), config-custom-env-mapping-in-mounted-dirs (mapping-файл в mounted-дире обязателен). index.md updated (+3).

[2026-08-24] ingest | concepts/deploy-policy-mappa