Files
infra/docs/ai/architecture.md
T
DmitryandClaude Sonnet 5 d2e1e6876a docs: AI project context (docs/ai) and repository documentation refresh
- 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
2026-09-03 07:06:10 +03:00

7.4 KiB
Raw Blame History

Архитектура

Контекст и точки входа

Репозиторий является control plane, а не приложением с единым runtime. Оператор запускает цели ansible/Makefile; Make загружает локальные secrets, применяет safety gates и вызывает playbooks. ansible.cfg выбирает inventory, roles и локально установленные Galaxy collections.

Канонические источники:

  • хосты и группы: ansible/inventory/hosts.yml;
  • общий доступ и сеть: ansible/inventory/group_vars/all/main.yml;
  • сводные сведения о сервисах: ansible/inventory/group_vars/all/services.yml;
  • SSH transport: ansible/ssh_config;
  • ручные операции: ansible/Makefile.

Программные потребители реестра:

  • playbooks/reverse-proxy.yml — сборка Caddyfile;
  • playbooks/ru-vps-base.yml — стек Caddy и его закреплённый образ;
  • playbooks/pve-backup-jobs.yml — списки VMID заданий PBS (поле backup.job);
  • roles/backup_audit — VMID для аудита (флаг monitoring.backup_audit_vmid);
  • playbooks/validate.yml — сверка реестра с фактическим состоянием Proxmox.

Остальное (pve-*.yml, status.yml, monitoring, SSH config) по-прежнему дублирует значения и должно меняться согласованно.

Топология

  • ru-vps: public VPS, qdevice, Caddy, OpenVPN server и SSH JumpHost.
  • cloud-pc, mini-pc: Proxmox VE nodes.
  • lxc_infra: PBS, OpenVPN gateway и service LXC.
  • monitoring: CT 146 на cloud-pc; Uptime Kuma активен, Prometheus stack заморожен.

Актуальные VMID, placement, IP, ports, domains и backup policy не копируются сюда: их нужно читать из homelab_services и сверять с hosts.yml.

Provisioning Flow

  1. make deploy-<service> загружает ignored .env из корня репозитория.
  2. playbooks/pve-<service>.yml создает или сверяет LXC.
  3. Часть playbooks вызывает roles/pve_lxc через Proxmox API.
  4. Остальные подключаются по SSH к PVE node и выполняют pct create/set/start.
  5. Следующий play настраивает LXC, runtime, systemd и health checks.

Два provisioner-пути имеют разные check-mode и ownership guards. Нельзя переносить service между ними как косметический рефакторинг.

Service Runtime

  • Большинство сервисов используют systemd units вокруг docker run.
  • Grimmory использует Compose и отдельный DOCKER-USER firewall unit.
  • Uptime Kuma и сохраненный monitoring stack используют legacy docker-compose.
  • lxc_docker_host и compose_service описывают будущий общий паттерн, но ни один production playbook их пока не вызывает.

Network Flow

ansible_ssh_common_args подключает ansible/ssh_config. Обычный путь управления:

controller -> ru-vps:3422 -> 192.168.1.x target

pbs и ovpn-mini являются direct-LAN исключениями. LXC обычно управляются как root, а PVE nodes и ru-vps - как service account ansible.

OpenVPN site tunnel:

ru-vps 10.78.0.1:8443/tcp <-> ovpn-mini 10.78.0.2 -> 192.168.1.0/24

Публичный service flow:

Internet -> Caddy on ru-vps -> OpenVPN -> ovpn-mini -> LAN service

Потеря ru-vps или site tunnel одновременно влияет на public upstreams и обычный SSH management path.

Reverse Proxy

playbooks/reverse-proxy.yml выбирает записи homelab_services с блоком proxy, валидирует metadata и Caddyfile, обновляет marked blocks и проверяет upstreams. Ansible управляет Caddyfile, но не установкой и lifecycle контейнера Caddy на ru-vps. Grimmory OPDS/KOReader routes имеют специальные headers и отключение compression; их нельзя упрощать без device compatibility tests.

Backup и Update

playbooks/pve-backup-jobs.yml задает cluster-level PBS schedules. Offsite restic profiles выполняются systemd timers и используют application-aware SQLite backup или MariaDB dump. roles/backup_audit проверяет freshness, restic check и выборочные restores, после чего атомарно пишет textfile metrics.

Update playbooks выполняют:

fresh backup/audit -> reapply service declaration -> health verification

Backup является prerequisite для ручного recovery, а не автоматическим rollback.

Monitoring

Uptime Kuma в CT 146 является активным monitoring UI. Его роль останавливает и отключает homelab-monitoring, сохраняя конфигурацию и данные Prometheus stack. make monitoring защищен CONFIRM=1 и предназначен только для отдельно принятого решения о восстановлении старого stack.

Exporter roles, groups и backup metrics остаются в репозитории. Hardcoded Prometheus targets могут расходиться с inventory, пока stack заморожен.

Grimmory MCP

tools/grimmory-mcp/src/server.js запускает локальный stdio MCP. Grimmory API используется read-only; authentication POST не меняет library data. Явно вызванные sync tools читают API, опционально загружают cover, атомарно обновляют managed sections Obsidian notes и запускают внешний vault index script.

Sync не является общей транзакцией: full sync может закончиться после частичного набора успешных book updates. Vault path и credential file защищены отдельными проверками, описанными в edge-cases.md.

Testing Boundaries

  • Ansible имеет static lint и syntax checks, но не имеет Molecule/idempotence harness.
  • check.yml проверяет reachability и expected IP, а не service health.
  • status.yml формирует наблюдательный отчет и не является failing health gate.
  • Grimmory MCP имеет Node test suite.
  • Gitea Actions workflow существует, но runner и Actions не активированы.

Неизвестно

  • Текущие runtime versions Proxmox VE, OpenVPN, Caddy и restic не закреплены repo manifests.
  • UI-only состояние AdGuard, Uptime Kuma monitors и часть service credentials не может быть установлена из репозитория.
  • Наличие DHCP reservation для Grimmory и намеренность отсутствия backup CT 148 требуют проверки оператором.