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.
Триггер — 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.
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-проекте.
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>
- 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>
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>
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>
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>
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>
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>
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>
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>