Commit Graph

85 Commits

Author SHA1 Message Date
b159e4847e tasks: [infra-inventory] scope → two-tier (public + admin-detailed)
User clarification: «у все должно быть общее представление, где что живёт,
а у админа — полное представление, на чём всё едет».

Расширение scope существующей таски (создана несколькими минутами ранее
с single-page подходом):

- Deliverable A — light в projects-wiki/concepts/infrastructure-inventory.md
  (audience: все агенты, разрабы, босс). Канонические hostnames + IP-map +
  anti-aliases. Mental map для design-conversations.

- Deliverable B — heavy в .admin/.wiki/concepts/infrastructure-stack.md
  (audience: только админ). Per-stack: версии, internal IPs, volumes,
  depends-on graph, backup paths, DR runbook pointers. На чём всё едет.

Probing-фаза общая, потом split по level of detail. A и B cross-references.
2026-05-22 17:13:51 +03:00
d87b4f445e tasks: + [infra-inventory] — single source of truth, кончать гадать hostnames [infra-inventory]
Триггер — incident 2026-05-22 в .workshop-сессии: агент ляпнул
gitea.kzntsv.site (canonical = git.kzntsv.site), плюс перепутал
client-IP в traefik access-логах с destination-IP, и построил
неверный root-cause для board-viewer 404.

User: "никакого gitea.kzntsv.site нет, есть только git.kzntsv.site,
нужна инвентаризация чтобы и боссы и агенты и разрабы знали железо".

Таска: единая страница в projects-wiki/concepts/infrastructure-inventory.md
с canonical hostnames, IP-картой, anti-aliases, pointers в bootstrap-concept'ы
каждой машины. Pointer из .admin/.wiki/CLAUDE.md.
2026-05-22 17:07:57 +03:00
19c71cddae tasks(board-viewer): close 🟢 + Portainer-migration sweep noted в header
STATUS header reflects Portainer-canonical sweep + 12 stacks migrated.
board-viewer-vds-deploy closed как часть sweep (Portainer Id=3).
2026-05-22 16:47:52 +03:00
d99602894f ops(vds): Portainer-canonical rule + migrate 12 ad-hoc stacks
Findings из сессии 2026-05-22 (user корректировка: «через портейнер!»):
deploy через ssh + docker compose up — anti-pattern, breaks ops surface
homogeneity. Все stacks на VDS должны быть Portainer-managed.

Retro-migrated 12 stacks (board-viewer, ntfy, registry, verdaccio, gitea,
owncloud, postgres, mongo, mariadb, redis, minio-imgproxy, mssql) через
JWT auth + /api/stacks/create/standalone/string API. Migration script
template в новой wiki концепции.

Skipped traefik+portainer (management plane recreate ломает access).

Gotchas закреплены в portainer-stack-management-vds.md §Gotchas:
- env_file: .env requires strip + env array в API payload
- ./ binds для sibling files (nginx.conf) absolutize → /opt/stacks/<>/
- docker login registry.kzntsv.site обязателен на VDS host
- container recreate downtime ~30-60s/stack (sequential)
- Portainer working_dir /data/compose/<id>/ не /opt/stacks/<name>/

CLAUDE.md новое правило: VDS docker stacks → Portainer canonical.
STATUS header updated; board-viewer-vds-deploy closed 🟢 как часть sweep.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 16:47:16 +03:00
65c6ad9eea tasks: import board-viewer-vds-deploy from dev-project [board-viewer-vds-deploy]
Ops-handoff из ~/projects/board-viewer/.tasks/[board-viewer-cron-deploy]:
dev-проект сдал code-complete (артефакты deploy/ + smoke против real Gitea),
оставшиеся pending — DNS / build+push / VDS bootstrap / smoke — это ops-сторона.

Per новое правило workshop CLAUDE.md §5 — таски с ops acceptance criteria
(DNS, docker stack, traefik, systemd, etc.) живут в .admin, не в app-проекте.
2026-05-22 16:05:50 +03:00
adcd8bda1f tasks(minio+iis): close 🟢 — CMS image pipeline стоп-на-windows-host
Finding: MoreThenCms.Modules.Imgproxy.dll (closed-source) содержит
hardcoded https://imgproxy.kzntsv.site URL (strings analysis из binary).
Архитектура: browser → traefik → IIS snolla → ImgproxyHandler →
server-side GET imgproxy.kzntsv.site → windows-host traefik → imgproxy-nginx
→ imgproxy → MinIO localhost:9000.

Sample URL decode: https://www.pilorama98.ru/imgproxy/<sig>/.../
czM6Ly9waWxvcmFtYTk4L3Byb2R1Y3RzL2wv... → base64 =
s3://pilorama98/products/l/<uuid>.jpg

DLL closed-source, исходника в репо нет. 4 options рассмотрены
(hosts+cert trick / nginx-relay / keep-as-is / decompile+recompile).
User decision: Option C — оставить как есть. Windows-host imgproxy/nginx
/MinIO живут indefinitely, VDS stack = standby.

minio-imgproxy-vds-migration 🟢 — VDS stack ready as standby
iis-cutover-to-vds-services 🟢 — MSSQL leg done, image pipeline stays
Decommission window-host MSSQL осtaется (48ч soak до 2026-05-24);
MinIO/imgproxy/nginx на windows — НЕ decommission.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:47:29 +03:00
8a30696a45 tasks(minio): clarify VDS imgproxy permanent home = imgproxy.vds.kzntsv.site
User confirmed imgproxy.kzntsv.site занят другим сервисом на другом сервере
(не наш scope). VDS imgproxy уже на imgproxy.vds.kzntsv.site (live).

CMS audit 2026-05-22 не нашёл refs на imgproxy/kzntsv/minio в:
- snolla source code (recursive grep)
- Admin/ templates
- bin/MoreThenCms.Modules.Imgproxy.dll strings (только namespace literal)
- MoreThenCms DB SiteSettings + ModuleProperties
- Public HTML rendering (всё relative /images/ + /themes/)

DLL deployed но не wired в active flow — vestigial или invoked через
Azure storage SDK (AccountName=snolla;AccountKey=... connection string
в snolla/Web.config — Azure-compat доступ к MinIO с неустановленным
endpoint). Identification реального consumer'а — отдельная audit-задача
перед source decommission.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 10:07:43 +03:00
e17e8eb1c3 mssql+minio vds migration done — IIS snolla cutover live
- mssql-vds-migration 🟢: Express 2022 Linux на mssql.kzntsv.site:1433,
  5 DBs restored (schema 2019→2022 auto-upgrade), 8 prod hosts 200 OK
- minio-imgproxy-vds-migration 🟡: stack live, 3 GiB / 19324 obj mirrored
  (2020→2025 upgrade via S3 API), DNS swap imgproxy.kzntsv.site pending
- iis-cutover-to-vds-services 🟡: 1 web.config edit catch-all для 11 hosts;
  MinIO leg pending DNS swap (URLs уже через imgproxy.kzntsv.site domain)
- 3 wiki concepts: mssql-on-vds, minio-imgproxy-on-vds, index updated

Findings: (1) server logins НЕ переезжают в .bak — orphan fix manual,
(2) traefik recreate-not-restart для port mapping change,
(3) PowerShell не вызывает pass bash-script (NULL pw → misleading auth fail),
(4) mc 2025 не auto-creates target buckets, (5) non-ASCII filename silent
skip в mc mirror — verify по count+size обязательно.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:55:17 +03:00
86a94d7f9d tasks(vds-migration): decompose umbrella → 3 child tasks
- mssql-vds-migration : Express edition, BACKUP/RESTORE method, mssql.kzntsv.site:1433
- minio-imgproxy-vds-migration : MinIO upgrade 2020→latest, mc mirror, includes imgproxy+nginx
- iis-cutover-to-vds-services 🔵: atomic web.config repoint (1 file → 11 hosts), blocked on both migrations
- umbrella mssql-minio-migration-to-vds 🟢: decomposed (kept for history)

Discovery: 5 prod DBs ≤ 968 MB (Express OK), .ldf logs 12 GB → SHRINKFILE
pre-cutover. VDS: 79 GB free, 5.8 GB RAM avail. ownCloud capped 1G.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 09:02:49 +03:00
68706d0bee tasks(owncloud-vds-deploy): close 🟢 — 26 GB live + 60s timeout finding
Import complete: 25 044 objs / 26 GB. 99.97% залито rclone'ом (22.2 GB
за ~2.5 ч), оставшиеся 6 файлов (4.04 GB) — 4× .pat ~221 MB + 2× .seospider
1.55+1.7 GB — упали с 502/500 на каждом rclone PUT из-за 60-секундного
HTTP timeout в reva v2.27 datagateway (hardcoded в Go http.Client.Timeout,
не env-configurable).

Workaround: VDS-side curl PUT loopback через throwaway sftp key.
Local network 142 MB/s → 4.04 GB за 28 секунд, все PROPFIND size match.

Wiki: §Gotcha 5 в concepts/ocis-on-vds-deploy-recipe.md документирует
finding + recipe для workaround. Traefik buffering middleware пробован,
не помог (likely vulcand/oxy buffer bug на больших телах) — откатил.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 07:26:07 +03:00
74cf219533 wiki(concepts): ingest ocis-on-vds-deploy-recipe + entity refresh
New concept page documents the oCIS-on-VDS deploy pattern with the 4
non-obvious gotchas surfaced during owncloud-vds-deploy:

  1. UID mismatch — image ocis-user is 1000, host vitya is 1001 →
     compose `user: "1001:1001"` override (alt chown rejected as orphan-UID)
  2. PROXY_TLS=false — explicit per docs when reverse proxy terminates HTTPS
  3. PROXY_ENABLE_BASIC_AUTH=true — required for WebDAV/LibreGraph API
  4. LibreGraph POST /graph/v1.0/users — only way to create users (no CLI)

Plus decomposedfs storage layout, atomic-revert recipe, backup integration
note. Source: .tasks/owncloud-vds-deploy.md.

entities/vds-kzntsv.md updated: stack table + hostnames + file layout
include owncloud row.

index.md catalog + log.md ingest entry refreshed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 19:29:43 +03:00
c46e569908 tasks(owncloud-vds-deploy): file 🟡 — oCIS on VDS up + WebDAV verified
Deploy phase done: oCIS 7.1.0 в /opt/stacks/owncloud/ через traefik labels на
owncloud.kzntsv.site (LE cert valid), user 'vitya' создан через LibreGraph
API, WebDAV `/dav/files/vitya/` PROPFIND 200 OK.

Decisions in close-note: oCIS vs Seafile/Nextcloud chosen for drop-in
decomposedfs import + lightweight Go binary. user:1001:1001 override after
mount perms fail (host vitya UID 1001 ≠ image ocis-user UID 1000).
PROXY_ENABLE_BASIC_AUTH=true для WebDAV/LibreGraph admin API.

Backup integration: /opt/stacks/owncloud добавлен в rsync sources в
/opt/stacks/backup/scripts/run.sh (vds-backup-rsync-kreknin scope expanded).

Status 🟡 — pending user-side rclone copy 24.7GB → WebDAV (full copy лежит
на другом PC, не на этом).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 19:07:10 +03:00
f957830033 tasks: close [admin-infra-project-review] 🟢 — no new findings
Review pass executed from .workshop/ cwd per user explicit request.
4 parallel verification subagents covered: migration completeness,
per-file history preservation, secrets etap-1/2, commits-vs-spec audit.

All 8 impl-tasks pass acceptance criteria. F1-F3 from [verify-migration]
remain documented there (projects-meta-mcp owner-whitelist suspected;
knowledge_search scope mismatch; git log --follow subtree-graft limit).

User confirmed close by inspection.
2026-05-21 16:56:09 +03:00
fd8bb13e75 resilience(roadmap): workshop pass 1 — close design-task; file top-3 impl-tasks
- close [resilience-roadmap-design] 🟢 — roadmap expanded via interactive workshop
  with user (per-service RTO/RPO matrix for 10 services, CMS backup 2-phase plan,
  IIS migration track, 4 secondary topics documented as recommendations)
- file 3 impl-tasks  ready (spawned by roadmap-design):
  - cms-stopgap-backup-daily — Phase 1, plug RPO=∞ via daily rsync to kreknin
  - mssql-minio-migration-to-vds — Phase 2 enabler, achieves RPO 1h target
  - windows-hosting-vendor-research — design-task for IIS migration off home host
- unblock [admin-infra-project-review] 🔵 (last blocker cleared)
- expand .wiki/concepts/future-resilient-architecture-goals.md with §Workshop pass 1
  (canonical) above original §Pre-workshop placeholder (historical)

Key user-decisions zafiksirovany in workshop:
- CMS RTO 4h / RPO 1h (not 1h/15min — overkill for one-person infra)
- MSSQL+MinIO migrate to VDS (not Windows-side managed hosting)
- MSSQL Always-On AG rejected — log shipping every 60min sufficient
- IIS long-term dies with snolla-on-node; transitional via managed Windows host
- Cloud off-site = Yandex Object Storage when needed (kreknin already off-site)
- Monitoring = Uptime Kuma on VDS, high-priority among not-filed

Acceptance per spec (user confirmed plan + concrete impl-tasks top-3 + doc committed) — met.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 16:25:04 +03:00
d20a9d41e4 tasks: close secrets-manager-adopt 🟢 (etap-2 secret-management complete)
Pass-based encrypted-at-rest secret store live:
- gpg key RSA 4096 (fpr 0CB0B019...4FE3F59E), no expiration
- pass v1.7.4 at ~/.local/bin/pass (manual clone)
- 5 entries: interns/ollama-cloud-api-key, gitea/admin-token,
  vds-kzntsv/full-env, kreknin/full-env, snolla-smtp/full-env
- gpg-agent: pinentry-w32 + 30-day cache TTL
- Wrapper ~/.local/bin/interns-mcp-launcher.sh — pass show → env →
  exec python -m interns_mcp.server
- ~/.claude.json mcpServers.interns swapped to wrapper bash invocation
- Cross-machine: OpeItcLoc03/password-store-private (private), 7 commits
- Plaintext ~/.config/projects-secrets/ cleaned (5 secret files removed;
  README rewritten as pass-pattern marker)

Acceptance: all 4 spec criteria met.

Open follow-ups:
- meeting-room dirty WIP (etap-1 edit unstaged) — user decision needed
- setup-interns SKILL v0.5.0 — migrate phase 5/6 to pass+wrapper
- New endpoints — pattern documented in projects-secrets/README.md

Closes secrets-manager-adopt (admin agenda E.3); secrets-out-of-common
+ secrets-manager-adopt chain (E.1 → E.3) fully shipped this session.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:55:32 +03:00
7493e07b34 tasks: close secrets-out-of-common 🟢; promote secrets-manager-adopt 🔴
Etap-1 (secrets-out-of-common) done: 9 files migrated to
~/.config/projects-secrets/ (outside any git tree); interns-mcp
+ meeting-room consumers updated to env-override pattern;
setup-interns / using-interns skills updated + version-bumped;
safety filter ALWAYS_ASK_PATTERNS extended with **/projects-secrets/**.
.common/secrets/ removed entirely. Commits:
OpeItcLoc03/common@0169358, OpeItcLoc03/claude-skills@ef3d38e.

Open follow-up: meeting-room config.py edit unstaged due to pre-existing
dirty state (UU conflict + 13 staged files not authored by this session).

Etap-2 (secrets-manager-adopt) starts now — gpg + pass install,
key gen, migrate plaintext to encrypted, cross-machine via private Gitea.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:24:11 +03:00
2c486860ec chore: close verify-migration with findings F1-F3 (migration structurally complete)
Findings (not migration-blocking — verification surface issues):
- F1: tasks_aggregate filter quirk for OpeItcLoc03/* (cache content correct)
- F2: knowledge_search scope ≠ project wikis (spec acceptance criteria 3-4 mis-scoped)
- F3: git log --follow does not bridge subtree-merge graft (workaround documented)

Migration chain done: 4 admin-side + 3 morecms-side commits + 2 pushes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:02:39 +03:00
47ae0dccc6 chore: close morecms-cleanup-and-breadcrumb; unblock verify-migration → active
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:00:38 +03:00
14ee2ef85a chore: close admin-subtree-import-and-cleanup; unblock morecms-cleanup + resilience-roadmap-design
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 13:55:31 +03:00
38f1d3358a wiki(index): refresh catalog after subtree import — 6 entities, 18 concepts, 3 sources
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 13:52:32 +03:00
c55cb11948 tasks: merge imported MoreThenCms task history with admin live agenda
- 7 admin per-task files moved from .tasks-imported/ to .tasks/ (renames)
- NEXT-SESSION-PROMPT.md (iis-migration session handoff) kept as sibling
- .tasks-imported/STATUS.md removed (content merged into admin STATUS.md)
- admin STATUS.md gains 'Imported from MoreThenCms' section with all 7 admin
  done tasks verbatim. 4 CMS-domain task blocks excluded (stay in MoreThenCms):
  cms-admin-assets-root-folders-seed, cms-port-leak-fix,
  traefik-maljarka-502-bug, cms-maljarka-https-mode-bug-fix
- morecms-subtree-split marked done (acceptance: 4 split branches exist with
  per-file history)
- admin-subtree-import-and-cleanup marked active (in-progress this session)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 13:51:48 +03:00
3cdcdad048 cleanup: drop CMS files imported via subtree (they stay in MoreThenCms); drop stale bootstrap-manifest.md (per-project metadata from MoreThenCms's bootstrap, does not apply to admin) 2026-05-21 13:48:36 +03:00
85b3ee847f import-stage: .tasks/ via split (temp prefix, await STATUS.md merge)
git-subtree-dir: .tasks-imported
git-subtree-mainline: c40418239e
git-subtree-split: cbdc2b39aa
2026-05-21 13:48:02 +03:00
c40418239e import: merge .wiki/concepts/ from temp prefix into existing dir (history preserved via merge+rename) 2026-05-21 13:47:59 +03:00
4837fb32c8 import-stage: .wiki/concepts/ via split (temp prefix for merge into existing dir)
git-subtree-dir: .tmp-concepts
git-subtree-mainline: 98bcc37d32
git-subtree-split: c727aaa1b6
2026-05-21 13:46:51 +03:00
98bcc37d32 import: .wiki/sources/ from MoreThenCms via subtree-split
git-subtree-dir: .wiki/sources
git-subtree-mainline: d25c0577c8
git-subtree-split: a5e96432bc
2026-05-21 13:46:39 +03:00
d25c0577c8 import: .wiki/entities/ from MoreThenCms via subtree-split
git-subtree-dir: .wiki/entities
git-subtree-mainline: 6d8d75474d
git-subtree-split: 24661c10fb
2026-05-21 13:46:38 +03:00
6d8d75474d prep: clear gitkeep before subtree import 2026-05-21 13:46:33 +03:00
d558ccfaed chore: mark admin-infra-project-pointers done, unblock morecms-subtree-split
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 13:37:10 +03:00
67f7bbee74 wiki(claude): add design-context pointers for admin-infra-project
Replaces seeded stub in Domain conventions with a 3-source pointer block:
1. concepts/admin-infra-project.md (canonical local design)
2. ~/projects/.workshop/.archive/2026-05-21-admin-infra-project.md (rationale)
3. .wiki/overview.md (orientation only)

Closes task admin-infra-project-pointers — bootstrap pointer for the
entire migration / agenda chain.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 13:37:06 +03:00
40009b1b80 meta(tasks): create [admin-infra-project-review] in OpeItcLoc03/admin 2026-05-21 10:25:44 +00:00
3bcabfa3cc meta(tasks): create [secrets-manager-adopt] in OpeItcLoc03/admin 2026-05-21 10:25:15 +00:00
7363064d82 meta(tasks): create [secrets-out-of-common] in OpeItcLoc03/admin 2026-05-21 10:24:49 +00:00
8464d302a4 meta(tasks): create [resilience-roadmap-design] in OpeItcLoc03/admin 2026-05-21 10:24:25 +00:00
6a3361a583 meta(tasks): create [verify-migration] in OpeItcLoc03/admin 2026-05-21 10:23:55 +00:00
0c7c5f6236 meta(tasks): create [morecms-cleanup-and-breadcrumb] in OpeItcLoc03/admin 2026-05-21 10:23:38 +00:00
a009132367 meta(tasks): create [admin-subtree-import-and-cleanup] in OpeItcLoc03/admin 2026-05-21 10:23:15 +00:00
be8cb07ac7 meta(tasks): create [morecms-subtree-split] in OpeItcLoc03/admin 2026-05-21 10:22:51 +00:00
7aae45cdf0 meta(tasks): create [admin-infra-project-pointers] in OpeItcLoc03/admin 2026-05-21 10:22:00 +00:00
4c35e2a925 meta(wiki): log += ingest concepts/admin-infra-project 2026-05-21 10:21:29 +00:00
f1565eaff4 meta(wiki): index += concepts/admin-infra-project 2026-05-21 10:21:28 +00:00
531184111a meta(wiki): ingest concepts/admin-infra-project in OpeItcLoc03/admin 2026-05-21 10:21:28 +00:00
34e779e002 bootstrap: admin project skeleton (CLAUDE.md, .wiki/, .tasks/) 2026-05-21 13:17:45 +03:00
4d63aeef46 Initial commit 2026-05-21 10:13:57 +00:00
cbdc2b39aa fix(traefik-maljarka-502-bug): diagnosed — root cause CMS-side, не traefik
Bisect через X-Forwarded headers: IIS+CMS возвращает 502 specifically для
Host: maljarka.tandemmebel.ru + X-Forwarded-Proto: https. Без XFP=https → 200.
URL Rewrite rule из cms-port-leak-fix ставит HTTPS=on/SERVER_PORT=443 → CMS
код для этого hostname падает в HTTPS-context. Same class как
emspb /admin/assets 500 NullRef, rimiz 404 — pre-existing CMS issues.

Side finding: traefik file-watch broken под Docker Desktop Windows (WSL2 9p
не пропускает inotify). Rename .yml → .disabled оставался без эффекта 38min
после изменения; только docker restart traefik подхватил. Это значит
iis-traefik-dead-routes-cleanup был фантомным до сегодняшнего restart 07:42 UTC.

2 новых wiki concepts: traefik-file-watch-wsl2-broken (workarounds) +
cms-maljarka-https-mode-crash (3 workarounds + 5 investigation places).
Новая follow-up  cms-maljarka-https-mode-bug-fix.

Final smoke post-restart: 7 live hosts  Microsoft-IIS/10.0 без regression,
2 dead routes (sestech, ics-artmaterials) → 404 (cleanup теперь real).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 10:53:02 +03:00
c727aaa1b6 fix(traefik-maljarka-502-bug): diagnosed — root cause CMS-side, не traefik
Bisect через X-Forwarded headers: IIS+CMS возвращает 502 specifically для
Host: maljarka.tandemmebel.ru + X-Forwarded-Proto: https. Без XFP=https → 200.
URL Rewrite rule из cms-port-leak-fix ставит HTTPS=on/SERVER_PORT=443 → CMS
код для этого hostname падает в HTTPS-context. Same class как
emspb /admin/assets 500 NullRef, rimiz 404 — pre-existing CMS issues.

Side finding: traefik file-watch broken под Docker Desktop Windows (WSL2 9p
не пропускает inotify). Rename .yml → .disabled оставался без эффекта 38min
после изменения; только docker restart traefik подхватил. Это значит
iis-traefik-dead-routes-cleanup был фантомным до сегодняшнего restart 07:42 UTC.

2 новых wiki concepts: traefik-file-watch-wsl2-broken (workarounds) +
cms-maljarka-https-mode-crash (3 workarounds + 5 investigation places).
Новая follow-up  cms-maljarka-https-mode-bug-fix.

Final smoke post-restart: 7 live hosts  Microsoft-IIS/10.0 без regression,
2 dead routes (sestech, ics-artmaterials) → 404 (cleanup теперь real).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 10:53:02 +03:00
53847a7618 feat(iis-traefik-dead-routes-cleanup): done — sestech + isc-artmaterials disabled
Renamed sestech.yml + isc-artmaterials.yml to .disabled (backups
.bak-pre-dead-routes-cleanup-2026-05-21). Traefik file-provider auto-reloaded,
no restart needed. 4 sibling live hosts (emspb, on.snolla, www.tandemmebel,
kupimknigi) → Microsoft-IIS/10.0 без regression.

maljarka оказался НЕ dead — yml route'ит maljarka.tandemmebel.ru (subdomain),
не голый maljarka.ru. DNS на наш IP, IIS backend 200 OK. Изначальная task'а
перепутала hostname. Side-finding: traefik HTTPS возвращает 502 для этого
subdomain (backend сам 200). Новая  task traefik-maljarka-502-bug.

Files renamed live в C:\Users\vitya\projects\docker\diskstation\traefik\data\
custom\ (вне репо) — поэтому в diff только task/wiki updates.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 08:26:54 +03:00
24661c10fb chore(snolla-recovery-vm): savestate'нута после 36h успешного soak
VBoxManage controlvm snolla-recovery savestate — 45.6s, VMState=saved.
Savestate file 1.73 GB (compressed 4096 MB RAM). VBoxHeadless процессы
освободили ~4 GB private memory. Resume в 30 сек через startvm --type headless.

unregistervm --delete (~95 GB disk reclaim) запланирован на +неделю uptime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 08:14:51 +03:00
115c6549f5 chore(snolla-recovery-vm): savestate'нута после 36h успешного soak
VBoxManage controlvm snolla-recovery savestate — 45.6s, VMState=saved.
Savestate file 1.73 GB (compressed 4096 MB RAM). VBoxHeadless процессы
освободили ~4 GB private memory. Resume в 30 сек через startvm --type headless.

unregistervm --delete (~95 GB disk reclaim) запланирован на +неделю uptime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 08:14:51 +03:00
a5e96432bc feat(iis-on-host-migration): done — attempt 2 close-out, 8/8 sites green @ 36h soak
Soak passed: traefik Up 38h, w3wp 8.8h (scheduled IIS pool recycle ~29h, not crash).
HTTPS smoke 11 hostnames через full traefik chain — 8/8 наших sites вернули
Microsoft-IIS/10.0. 3 hostname'а оказались off-infra (DNS снят / parked / external
nginx) — не regression миграции, заведена follow-up  iis-traefik-dead-routes-cleanup.

Wiki: Phase 11 close-out section в sources/iis-host-migration-2026-05-19, log
ingest+decision entries.

VM snolla-recovery ready для savestate (waits user go).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 08:09:01 +03:00