mirror of
https://github.com/oqyude/nixos.git
synced 2026-10-10 05:55:24 +03:00
metaagent: install v3.0.0, migrate docs/arch/* → .agent/
- install.sh: .agent/src/ (PROTOCOLS, COMMANDS, TEMPLATES, install.sh/ps1, GUIDE)
- .temp/ добавлен в .gitignore
- .agent/checkpoints.json: phases.init=completed, project_type=existing
- .agent/rules/project-rules.md: R1-R5 (инварианты, ловушки, куда лезть, проверки)
- .agent/context/analysis-report.md: стек, архитектура, конвенции, кандидаты CI
- .agent/context/project-state.md: сжатый слепок (хосты, сервисы, ADR)
- .agent/roadmap/sources.md: открытые вопросы слоёв 0-11 (бывший invariants.md)
- .agent/tasks/manifest.{json,md}: 16 задач A1-F + 23 в backlog
- .agent/decisions/0001-sops-secrets-paths.md: ADR для инварианта S1
- AGENTS.md: metaagent-шапка + сжатая выжимка nixos (yaml frontmatter сохранён)
- удалены docs/arch/{map,invariants,todo}.md
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
# Analysis Report
|
||||
|
||||
## Session
|
||||
|
||||
- **Session ID:** `metaagent-init-2026-10-09`
|
||||
- **Target repo:** `S:/Git/nixos`
|
||||
- **Date:** 2026-10-09
|
||||
- **Project type:** `existing` (NixOS-конфиг, 120 `.nix`, ~8.5k строк)
|
||||
|
||||
## 1. Общая информация
|
||||
|
||||
- **README:** одна строка без смысла (`"I'm a super newbie who just posted my stuff here. Now maybe about intermediate"`); функциональную роль README играет `AGENTS.md` (корень).
|
||||
- **Лицензия:** не указана.
|
||||
- **CI/CD:** отсутствует. `nix flake check` — единственная автоматическая защита, прогоняется вручную. `deploy/default.nix:27-29` — `checks = builtins.mapAttrs (... deployChecks)`, но они покрывают только deploy-сценарий.
|
||||
- **Точка входа:** `flake.nix` → `nixosConfigurations.<attr>` (хосты) + `nixOnDroidConfigurations.<attr>` (Android). Реестр хостов: `configurations/default.nix:13-39`.
|
||||
- **Система сборки:** Nix + NixOS flakes. Home-manager, sops-nix, disko, deploy-rs, grub2-themes, justray.
|
||||
|
||||
## 2. Стек технологий (existing)
|
||||
|
||||
| Компонент | Значение |
|
||||
|---|---|
|
||||
| Язык | Nix (`.nix`) |
|
||||
| Фреймворк | NixOS modules + home-manager |
|
||||
| База данных | PostgreSQL (в `modules/server/postgresql.nix`), sqlite (3x-ui) |
|
||||
| Тестовый раннер | отсутствует (см. §5) |
|
||||
| Пакетный менеджер | Nix (`nix flake`, `nix-env`, `nix profile`) |
|
||||
| Линтер/форматтер | отсутствует (комментарий-density 38/120 файлов без комментариев — открытый вопрос 0.2) |
|
||||
|
||||
## 3. Архитектура (existing)
|
||||
|
||||
```
|
||||
flake.nix
|
||||
├── configurations/ ← реестр хостов (1 запись = 1 машина)
|
||||
│ ├── default.nix ← hosts + xlib + mkSystem
|
||||
│ ├── <host>.nix ← модульное тело хоста
|
||||
│ └── hardware/<host>.nix
|
||||
├── home/ ← home-manager (per device-type)
|
||||
├── modules/
|
||||
│ ├── options.nix ← кросс-модульные опции
|
||||
│ ├── default.nix ← defaultModule + strictModule (для nix-on-droid)
|
||||
│ ├── essentials/ ← packages, services, settings, ssh, shell, systemd-routines
|
||||
│ └── <type>/ ← per-type: desktop/, server/, vds/, wsl/, containers/, termux/, other/
|
||||
├── lib/
|
||||
│ ├── mkSystem.nix ← nixosSystem + specialArgs(xlib, inputs)
|
||||
│ └── xlib/ ← чистые данные: devices, dirs, helpers
|
||||
├── overlays/, pkgs/, deploy/, secrets/ (sops)
|
||||
└── .sops.yaml ← один age-ключ на secrets/<name>.(yaml|json|env|ini)
|
||||
```
|
||||
|
||||
**Паттерн:** модульный монолит с xlib-инъекцией (аналог dependency injection через `specialArgs`).
|
||||
|
||||
**Ключевые модули:**
|
||||
|
||||
| Модуль | Описание |
|
||||
|---|---|
|
||||
| `configurations/default.nix:13-39` | Реестр хостов (7 entries); `mkXlib` в строке 50 |
|
||||
| `configurations/<host>.nix` | Per-host: имя, тип, импорт модулей; 7 файлов |
|
||||
| `lib/xlib/default.nix:38-77` | `mkXlib` — единственная точка сборки xlib |
|
||||
| `lib/xlib/device.nix:12-41` | Закрытое множество device.types: { minimal, primary, secondary, server, vds, wsl, termux } |
|
||||
| `lib/xlib/helpers.nix` | `mkBindMount`, `mkSystemdBind`, `mkServiceStorage`, `mkNtfsMount`, `mkExfatMount`, `mkTmpDirs`, `mkSymlinks` |
|
||||
| `modules/options.nix` | Кросс-модульные опции: `host.builder.*`, `host."3x-ui".*` |
|
||||
| `modules/default.nix:9-39` | `nixosModules.default` — импортируется на каждый NixOS-хост; `nixosModules.strict:40-53` — для nix-on-droid |
|
||||
| `modules/essentials/` | `packages`, `services`, `settings`, `ssh`, `shell`, `systemd-routines` |
|
||||
| `modules/users.nix` | Пользователь `oqyude` (uid 1000, sapphira=1001), sops-секреты, hostKey bootstrap |
|
||||
| `modules/server/` | 20+ системных сервисов sapphira (см. `server/default.nix:imports`) |
|
||||
| `modules/server/systemd.nix` | rsync oneshots с `requiresMountsFor` guard (единственный пример guard'а) |
|
||||
| `modules/server/{nginx,coredns}.nix` | Reverse proxy + DNS для зон `zeroq.su` и `home.arpa` |
|
||||
| `modules/containers/` | podman-контейнеры: 3x-ui (заморожен), tape-rotation, remnanode, kokoro-tts, openhands, remnawave-examples |
|
||||
| `home/<type>.nix` | Home-manager per device-type; для `root` — без профиля |
|
||||
| `home/modules/opencode.nix` | OpenCode CLI + systemd user services (см. R2 — `Service` vs `serviceConfig`) |
|
||||
| `deploy/default.nix` | deploy-rs ноды: sapphira, otreca, rydiwo (НЕ atoridu/wsl/epral) |
|
||||
|
||||
## 4. Конвенции (existing)
|
||||
|
||||
- **Стиль:** Nix-форматирование, разные отступы в разных файлах (нет единого стандарта).
|
||||
- **Импорты:** `imports = [ ./foo.nix ./bar.nix ];` или list-spread. `lib.optional` для условных импортов.
|
||||
- **Типизация:** types из `lib.types` (например, `lib.types.str`, `lib.types.bool`, `lib.types.attrsOf`).
|
||||
- **Обработка ошибок:** `throw` + literal-сообщения (например, `lib/xlib/device.nix:12-41` — throw со списком валидных типов).
|
||||
- **Логирование:** не формализовано; rsync oneshots в `modules/server/systemd.nix` — единственный пример с `-v` + structured output.
|
||||
|
||||
## 5. Тесты (existing)
|
||||
|
||||
- **Команда запуска:** отсутствует. Единственная полуавтоматическая проверка — `nix flake check`.
|
||||
- **Всего тестов:** 0
|
||||
- **Пройдено:** N/A
|
||||
- **Упало:** N/A
|
||||
- **Пропущено:** N/A
|
||||
- **Упавшие тесты:** N/A
|
||||
|
||||
Кандидаты на CI-проверки (открытый вопрос 11.2):
|
||||
|
||||
1. ни одного `:latest` в образах (grep по `image =`)
|
||||
2. `nix flake check` зелёный — уже ловит A1
|
||||
3. домены в `coredns.nix` ↔ vhost'ы в `nginx.nix` совпадают в обе стороны
|
||||
4. для каждого потребителя `mkServiceStorage` каталог существует на `External`
|
||||
5. последнее правило самописной nftables-цепочки явное
|
||||
6. `listen.addr` — адрес интерфейса, а не сеть
|
||||
7. все файлы в `secrets/` матчат `path_regex` из `.sops.yaml`
|
||||
|
||||
## 6. Базовая проверка (existing)
|
||||
|
||||
- **Сборка:** не проверена в этой сессии (нет `nix` в PATH, AGENTS.md ссылается на `nix flake check`).
|
||||
- **Запуск:** N/A (NixOS-конфиг, не приложение).
|
||||
- **Git status:** рабочее дерево было чистым после коммита `7c9aa24` (yaml frontmatter в AGENTS.md). 1 modified файл (AGENTS.md) — fixed.
|
||||
|
||||
## 7. Требования (N/A для existing)
|
||||
|
||||
## 8. Примечания
|
||||
|
||||
- **Проход по репозиторию 2026-10-05**: 120 `.nix`, ~8.5k строк. Подтверждённые
|
||||
инварианты (1–6) зафиксированы в `.agent/rules/project-rules.md` (R1).
|
||||
- **Слои 9–11** (home-manager, deploy, формат) перенесены в `.agent/roadmap/sources.md`
|
||||
как открытые вопросы; см. §9.2, §10.1-10.4, §11.1-11.2 исходного `invariants.md`.
|
||||
- **Шаблон инварианта** (4 оси: Утверждение, Где, Почему, Действие) — для новых
|
||||
записей. Обратное: до правки `authelia.nix:51,108,109` шёл через хелпер
|
||||
`sopsPath = name: "/run/secrets/${name}"`; `open-webui.nix:95`, `tape-rotation.nix:61`,
|
||||
`remnawave.nix:61, 129, 136` — литеральный хардкод. См. ADR-0001.
|
||||
- **Bootstrap-цикл ключа** (R3) — должен быть задокументирован, иначе при
|
||||
переустановке хоста агент не выведет. Открытый вопрос 4.2.
|
||||
@@ -0,0 +1,107 @@
|
||||
# Project State
|
||||
# Auto-generated — updated by ANALYSE (initial) and METASTATE (on updates)
|
||||
|
||||
**Last updated:** 2026-10-09T20:30
|
||||
**Session:** metaagent-init-2026-10-09
|
||||
|
||||
## Project Type
|
||||
|
||||
`existing` — NixOS-конфиг домашнего флота. 7 host-outputs (6 NixOS + 1 nix-on-droid).
|
||||
|
||||
## Tech Stack
|
||||
|
||||
| Category | Technology |
|
||||
|----------|-----------|
|
||||
| Language | Nix |
|
||||
| Framework | NixOS modules + home-manager |
|
||||
| Database | PostgreSQL (sapphira), sqlite (3x-ui) |
|
||||
| Test runner | none — `nix flake check` is the only guard |
|
||||
| Package manager | Nix (flakes) |
|
||||
| Linter/formatter | none |
|
||||
|
||||
## Current Architecture
|
||||
|
||||
Модульный монолит с xlib-инъекцией. `flake.nix` → `nixosConfigurations.<attr>` через `configurations/default.nix`. Каждый хост получает `xlib` (identity + dirs + helpers) через `specialArgs` в `lib/mkSystem.nix`. `modules/default.nix` импортирует `nixosModules.default` (все NixOS) или `nixosModules.strict` (только nix-on-droid).
|
||||
|
||||
```
|
||||
configurations/ → 7 хостов (default, atoridu, rydiwo, otreca, sapphira, wsl, epral)
|
||||
modules/ → essentials + per-type (desktop/server/vds/wsl/containers/termux)
|
||||
home/ → home-manager per device-type
|
||||
lib/xlib/ → чистые данные (devices, dirs, helpers)
|
||||
deploy/ → deploy-rs ноды: sapphira, otreca, rydiwo
|
||||
secrets/ → sops, один age-ключ
|
||||
```
|
||||
|
||||
## Key Modules
|
||||
|
||||
| Module | Status | Description |
|
||||
|--------|--------|-------------|
|
||||
| `configurations/default.nix` | existing | Реестр хостов + `mkXlib` |
|
||||
| `lib/xlib/default.nix` | existing | `mkXlib` — единственная точка сборки xlib |
|
||||
| `modules/default.nix` | existing | `defaultModule` (NixOS) + `strictModule` (nix-on-droid) |
|
||||
| `modules/options.nix` | existing | Кросс-модульные опции |
|
||||
| `modules/users.nix` | existing | Пользователь + sops + hostKey bootstrap |
|
||||
| `modules/essentials/ssh.nix` | existing | openssh + hostKey |
|
||||
| `modules/server/{nginx,coredns}.nix` | existing | Reverse proxy + DNS (`zeroq.su`, `home.arpa`) |
|
||||
| `modules/server/postgresql.nix` | existing | PostgreSQL + `mkServiceStorage` (нужен B1 guard) |
|
||||
| `modules/server/systemd.nix` | existing | rsync oneshots с `requiresMountsFor` |
|
||||
| `modules/containers/3x-ui.nix` | frozen | Панель :latest, ядро Xray 26.7.x |
|
||||
| `home/<type>.nix` | existing | Per-type home-manager |
|
||||
| `home/modules/opencode.nix` | existing | OpenCode CLI + systemd user (см. R2) |
|
||||
| `deploy/default.nix` | existing | deploy-rs: sapphira, otreca, rydiwo |
|
||||
|
||||
## Hosts
|
||||
|
||||
| Attr | hostname | device.type | deploy | stateVersion | Примечание |
|
||||
|---|---|---|---|---|---|
|
||||
| `default` | nixos | minimal | — | — | Шаблон |
|
||||
| `atoridu` | atoridu | primary | — (manual) | 26.05 | xanmod, mini-PC, без nixos-hardware |
|
||||
| `rydiwo` | rydiwo | secondary | deploy-rs | 26.05 | Chuwi MiniBook, NTFS `lamet-drive` (mask=0000) |
|
||||
| `otrecа` | otreca | vds | deploy-rs | 25.05 | VPS, Tailscale-only SSH, nftables (нужен A3) |
|
||||
| `sapphira` | sapphira | server | deploy-rs | 25.05 | Домашний сервер, `firewall.enable = false` намеренно |
|
||||
| `wsl` | wsl | wsl | — (manual) | 24.11 | WSL на vetymae (Windows 192.168.1.100) |
|
||||
| `epral` | epral | termux | — | 24.05 | Android nix-on-droid, через `mobile.nix` |
|
||||
|
||||
## Services (sapphira, активные)
|
||||
|
||||
20+ системных сервисов + 6 контейнеров. Полный инвентарь в `tasks/manifest.json` (задачи A1-F). Все, использующие `mkServiceStorage`, нуждаются в B1 guard: postgresql, samba, homebox, gitea, navidrome, syncthing, uptime-kuma, immich, nextcloud, calibre-web, 3x-ui, tape-rotation.
|
||||
|
||||
## Network
|
||||
|
||||
```
|
||||
LAN 192.168.1.0/24:
|
||||
.20 sapphira (зашит в ~30 мест; см. вопрос 6.6)
|
||||
.1 роутер (gateway)
|
||||
.100 vetymae (Windows-хост с WSL)
|
||||
|
||||
Tailscale CGNAT 100.64.0.0/10:
|
||||
100.64.0.0 = sapphira (назначен вручную, в 4 файлах)
|
||||
100.86.62.4 = opencode на vetymae
|
||||
100.106.21.39 = miniflux
|
||||
|
||||
Internet:
|
||||
sapphira: пробросы роутера = 22, 80, 443, 8443 (xray), 22000 (syncthing)
|
||||
```
|
||||
|
||||
## Decisions in Effect
|
||||
|
||||
| ADR | Decision | Status |
|
||||
|-----|----------|--------|
|
||||
| ADR-0001 | sops-пути: `config.sops.secrets.<name>.path` (не литерал) | active |
|
||||
|
||||
Подробнее: `.agent/decisions/0001-sops-secrets-paths.md`.
|
||||
|
||||
## Testing Status
|
||||
|
||||
Тестов нет. Единственная защита — `nix flake check`. Кандидаты на CI-проверки (7 штук) — в `analysis-report.md §5`.
|
||||
|
||||
## Open Concerns
|
||||
|
||||
- **B1**: нет guard'а на несмонтированный `/mnt/services` — сервисы стартуют на пустой БД.
|
||||
- **A3**: nftables на VDS без явной финальной политики — неявный accept.
|
||||
- **C1–C5**: 3x-ui заморожен, но без формального ADR; `podman.autoPrune` + `:latest` = деградация без коммита.
|
||||
- **2.2/5.5**: `vetymae` / `lamet` / `therima` / `soptur` в `dirs.nix` — природа неясна.
|
||||
- **4.1/4.2**: root-SSH и bootstrap-цикл ключа — не задокументированы.
|
||||
- **6.6**: `192.168.1.20` зашит в 30 мест — рефакторинг отложен.
|
||||
|
||||
Полный список — в `roadmap/sources.md` (открытые вопросы слоёв 0-11).
|
||||
Reference in New Issue
Block a user