--- date: '2026-05-21' source: .workshop/.brainstorm/admin-infra-project.md status: promoted type: design title: admin-infra-project ingested_at: '2026-05-21T10:21:27.239Z' ingested_by: OpeItcLoc03@DESKTOP-NSEF0UK source_project: OpeItcLoc03/workshop --- ## Summary Design + execution plan for the `OpeItcLoc03/admin` infrastructure project — extracted from `MoreThenCms` catch-all that accumulated admin/recovery content during the 2026-05-18 SMR-cascade incident when git was unavailable. This document is the canonical design context for the migration tasks in `.tasks/STATUS.md`. ## Context **Incident:** 2026-05-18 WD40EFAX SMR-cascade in RAID 5 → dead Synology DSM. Git was hosted on the dead NAS. Several days gitless; client production rebuilt ad-hoc. **Current state (as of 2026-05-21):** - Git restored on VDS Rusonyx — `git.kzntsv.site` (gitea 1.25.5). See `concepts/vds-kzntsv` (after migration). - Client production temporary scheme: OpenWRT NAT → traefik on Windows host → IIS on host (attempt-2 migration closed 2026-05-21 36h soak). - All 8/8 client sites green via public HTTPS chain. - Known open issue: `maljarka.tandemmebel.ru` 502 in HTTPS-mode — CMS-side, stays in `MoreThenCms`. **Why admin:** `MoreThenCms` became a catch-all because git was down during the incident — admin/infra content (recovery, VDS bootstrap, traefik quirks, fault-tolerance roadmap placeholder) ended up mixed with CMS-domain content. Decoupling now. ## Identity - **Gitea:** `OpeItcLoc03/admin` - **Local:** `~/projects/.admin/` - **Default branch:** `master` - **Discipline overrides:** master-only, commit-freely, push-by-permission (per `.workshop` pattern) - **CLAUDE.md profile:** `use superpowers`, `use project wiki`, `use task management system`, `check across all projects`, `pull remote before work`, `follow project discipline`, `delegate to interns when allowed`, `recommend, don't menu`, `we're on Windows`, `talk like a caveman`. **Dropped vs MoreThenCms:** `follow tdd-criteria` (admin work is mostly non-TDD-shape: scripts, runbooks, configs; tdd-criteria carve-outs already cover this). ## Scope / mission `admin` — single home for the full infra agenda: 1. **Current ops / incidents** — vds-ops, backup runs, traefik-quirks 2. **Migration work** — IIS-on-host, DB-park, LE certs for DBs, DNS-01 for acme 3. **Fault-tolerance roadmap** — placeholder `future-resilient-architecture-goals` expands here into a real plan (RTO/RPO, 3-2-1, multi-host, monitoring, runbooks) 4. **Coordination of infra repos** — `vds-ops-mcp`, `synology-ops-mcp`, `agenda`, `projects-meta-mcp`, `projects-wiki`, `claude-skills` stay as their own repos; admin tracks tasks/decisions about them **Out of scope:** CMS-domain (stays in `MoreThenCms`), business projects (books, pilonuxt, etc.), workshop boss-zone. ## Content inventory — what migrates from MoreThenCms ### Stays in MoreThenCms (CMS-domain) **Tasks:** - `cms-admin-assets-root-folders-seed`, `cms-port-leak-fix`, `traefik-maljarka-502-bug` (CMS-side diagnosis), `cms-maljarka-https-mode-bug-fix` (open follow-up) **Wiki concepts:** - `cms-admin-assets-root-folder-seed`, `cms-server-port-leak-fix`, `cms-config-rewrite-pattern`, `cms-maljarka-https-mode-crash`, `webconfig-password-xml-escape` ### Migrates to admin (infra) **Tasks (7):** - `vds-kzntsv-bootstrap`, `vds-gc-cron`, `vds-backup-rsync-kreknin`, `vds-ntfy-push` - `nas-recovery`, `iis-on-host-migration`, `iis-traefik-dead-routes-cleanup` **Wiki entities (all 6):** - `dead-synology-diskstation`, `kreknin-synology`, `windows-recovery-host`, `snolla-recovery-vm`, `openwrt-router`, `vds-kzntsv` **Wiki concepts (18):** - `wd40efax-smr-cascade`, `hyper-backup-structure-and-recovery`, `vbox-windows-stability-tuning` - `mssql-container-data-restore` - `traefik-on-windows-docker-desktop`, `traefik-tcp-passthrough-vs-starttls`, `traefik-file-watch-wsl2-broken` - `docker-host-loopback-detect`, `compose-bcrypt-escape-trap` - `portainer-2.21-admin-password-regression`, `db-tls-self-signed-via-traefik-raw-tcp` - `rusonyx-vps-onboarding-quirks`, `registry-gc-mount-and-modify-flag`, `verdaccio-prune-semantics` - `recovery-architecture-snapshot`, `future-resilient-architecture-goals`, `iis-migration-2026-05-19-postmortem` **Wiki sources (all 3):** - `nas-recovery-session-2026-05-18`, `iis-host-migration-2026-05-19`, `vds-kzntsv-bootstrap-2026-05-20` ### Grey-zone (resolved) - `iis-on-host-migration` task + `iis-host-migration-2026-05-19` source → **admin** (hosting-platform migration; CMS-side bugs surfaced by it stay in MoreThenCms). - `recovery-architecture-snapshot` → **admin** (full request flow including admin layer; MoreThenCms doesn't need its own — uses breadcrumb to admin). ## Migration mechanics — git subtree split for per-file history **Goal:** preserve per-file git history for admin-domain files. CMS-only files appear in admin's git history as imported-then-deleted (acceptable noise, explained in cleanup commit message). **Recipe (executed in dedicated session — see task list):** 1. **Pre-step (DONE 2026-05-21):** `OpeItcLoc03/admin` repo created on Gitea (master, auto-init). Local clone `~/projects/.admin/`. Bootstrap commit added `CLAUDE.md`, `.gitignore` (with `!.wiki/` `!.tasks/` to override global ignore), `.tasks/STATUS.md` (header only), `.wiki/` skeleton (`CLAUDE.md`, `index.md`, `log.md`, `overview.md`, `raw/README.md`, empty `entities/`, `concepts/`, `packages/`, `sources/`). 2. **Subtree-split in MoreThenCms** — 4 history-extraction branches: ```powershell cd ~/projects/MoreThenCms git subtree split --prefix=.wiki/entities -b split-wiki-entities git subtree split --prefix=.wiki/sources -b split-wiki-sources git subtree split --prefix=.wiki/concepts -b split-wiki-concepts git subtree split --prefix=.tasks -b split-tasks ``` 3. **Subtree-add into admin** — clean targets work straight, populated targets need merge approach. `.wiki/entities/` and `.wiki/sources/` are empty (only `.gitkeep`) — `git subtree add` works after removing `.gitkeep`: ```powershell cd ~/projects/.admin git remote add morecms ~/projects/MoreThenCms git fetch morecms git rm .wiki/entities/.gitkeep .wiki/sources/.gitkeep git commit -m "prep: clear gitkeep before subtree import" git subtree add --prefix=.wiki/entities morecms/split-wiki-entities git subtree add --prefix=.wiki/sources morecms/split-wiki-sources ``` `.wiki/concepts/` already contains `admin-infra-project.md` (this doc, ingested at promote time) and `.gitkeep`. `.tasks/` already contains `STATUS.md`. `git subtree add` requires an empty prefix → fails. Use one of: - **(preferred) `git read-tree --prefix=