- docs/ai/: stable, repo-verified context - README, architecture, tech-stack, edge-cases, plan (confirmed active work only), migration-tofu (the blue-green OpenTofu migration runbook and per-service findings), legacy-warning, links. - AGENTS.md: slimmed to a working contract that points at docs/ai instead of restating it; CLAUDE.md is an adapter that @-includes it. - README.md, ansible/README.md, ansible/roles/README.md, roles/lxc_docker_host/README.md: bring wording in line with the current control plane (Makefile entry point, registry, tofu, memoir-bot gone). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012uoq5AVK8mkBgg83Mq6o5V
6.9 KiB
6.9 KiB
Edge Cases и риски
Proxmox Provisioning
- Handled: ряд service playbooks проверяет hostname существующего VMID перед изменением контейнера.
- Gap: generic
roles/pve_lxcне содержит общего foreign-VMID guard; часть callers и directpctplaybooks также не выполняет ownership assertion. - Gap: некоторые
pct starttasks считают любой return code255допустимым, что может скрыть ошибку, не связанную с already-running state. - Unknown:
--check --diffне моделирует Proxmox module calls и command-heavy playbooks полностью.make dry-*является preview, а не isolated simulation.
Validation Semantics
playbooks/check.ymlпроверяет Ansible reachability иexpected_lan_ip.playbooks/status.ymlподавляет многие command errors и отображает DOWN/failed состояния в отчете; успешный exit code не означает healthy infrastructure.make lintзапускает ansible-lint и yamllint из корня репозитория и включает all-playbook syntax loop, то есть воспроизводит CI.- CI workflow не исполняется без включенных Gitea Actions и runner.
- Ansible roles не имеют Molecule, idempotence или integration test harness.
Network Failure Domains
- Потеря
ru-vpsнарушает обычный ProxyJump к большинству hosts и public Caddy. - Потеря OpenVPN site tunnel нарушает private upstream path public services.
- Потеря Mihomo одновременно затрагивает egress Hermes, внешние Uptime Kuma probes, emergency Telegram и Gyro notifications.
- Normal SSH использует
StrictHostKeyChecking=accept-new; emergency и Gyro paths требуют заранее проверенных pinned host keys. - Proxmox API TLS validation по шаблону
.env.exampleотключен по умолчанию.
Secrets и Privilege
- Handled: ignored
.env, Vault,0600,no_logи external password files не позволяют хранить ожидаемые secrets в tracked config. - Constraint: никогда не переносить значения из ignored/archived
.envв docs, output или commits. - Risk:
bootstrap-pve-api-token.ymlвращает privileged token и переписывает весь корневой.envцеликом, а не построчно. ТеряютсяMONITORING_*,EMERGENCY_*иPROXMOX_ROOT_PASSWORD. С 2026-09-02 у задачиbackup: true, но восстанавливать придётся вручную. Запускать только как отдельную осознанную операцию. - Constraint: строки в
.envпишутся с префиксомexport, и это не стиль:bootstrap-monitoring-pve-token.ymlищет их черезregexp: "^export NAME=". Убрать префикс — значит получить дубликаты строк вместо обновления. - Risk: LXC управляются как root, shell hosts используют
ansibleс passwordless sudo.
Backups и Updates
- Handled: SQLite backup API + integrity check, atomic MariaDB dump, per-profile
flock, PBS/restic freshness audit и selective restore. - Gap: update failures не запускают automatic rollback; backup только обеспечивает возможность ручного recovery.
- Gap: PBS audit проверяет freshness, но не выполняет restore или PBS data integrity
drill. Обычный
restic checkне читает все data packs. - Gap: recurring Grimmory audit проверяет non-empty SQL dump, но не импортирует его во временную MariaDB.
- Gap: CT 148
emergency-botне имеет backup/monitoring в service registry. - Constraint: code-only downgrade Grimmory после Flyway migration запрещен; нужен previous image вместе с pre-upgrade database backup.
- Concurrency: нет repository-wide lock от одновременных operator/update runs;
preflight через
pgrep vzdumpимеет race до запуска нового backup. - Handled: storage-level
prune-backupson PVE storagepbsremoved declaratively; retention now runs centrally in PBSprune-pbs, so the PBS side is the only authority for PBS-backed retention. The weekly PBS-container backup on storagebackupwithkeep-last=2remains an intentional exception.
Monitoring
- Active Uptime Kuma и frozen Prometheus stack не должны запускаться как две параллельные monitoring architectures без отдельного решения.
- Hardcoded Prometheus targets могут расходиться с inventory и service registry.
- Central monitoring на
cloud-pcне может независимо сообщить о полном отказе своего node без внешнего наблюдателя.
Reverse Proxy и Firewall
- Handled: reverse proxy metadata, Caddyfile, container config и upstreams проходят validation до/после restart.
- Constraint: Ansible не управляет lifecycle Caddy container на
ru-vps. - Constraint: не упрощать Grimmory OPDS/KOReader handlers и не удалять его
DOCKER-USERprotection без эквивалентных compatibility/security checks. - Constraint: не включать cluster-wide PVE firewall без аудита всех guests с
firewall=1.
Grimmory MCP
- Handled и tested: pagination guards, optional 204/404 resources, concurrent auth promises, credential ownership/mode/no-follow checks, vault path containment, cover size/type validation, atomic note writes и preservation of user markers.
- Gap: full sync не транзакционен и может завершиться с частично обновленным vault.
- Gap: нет mutex для concurrent sync/index rebuild.
- Gap: поиск existing note для каждой книги повторно сканирует весь notes directory.
- External dependency: Python и vault-owned index script должны существовать и завершиться в timeout; они не управляются этим репозиторием.
Требующие проверки состояния
- Завершена ли initial UI configuration AdGuard.
- Создана ли DHCP reservation/exclusion для Grimmory
192.168.1.34. - Настроены ли Gyro Vault secrets; tracked configuration не подтверждает их наличие.
- Является ли отсутствие backup для CT 148 намеренным решением.