fix7: продакшен-реализация полного reconcile swap и интеграций

- Полностью переписан swap-модуль в режиме exclusive ownership\n- Добавлены verify/checks, статус фактического swap-state и drift\n- Интегрирован ensure-swap в daemon и systemd ExecStartPre\n- Усилен lock API (таймауты) и применение в traffic/firewall/swap\n- Усилен parser firewall (JSON-first + устойчивый text fallback)\n- Обновлены config validation, runtime tools и default priority\n- Синхронизированы docs и build/package hygiene\n- Удалены member Cargo.lock в пользу корневого lockfile
This commit is contained in:
2026-05-11 17:30:15 +05:00
parent 819cc9c308
commit 7a4e9764b1
17 changed files with 842 additions and 957 deletions
+5 -4
View File
@@ -89,11 +89,12 @@
- [ ] `ensure-swap` создаёт `/swapfile` размером 2048 MB.
- [ ] Права `/swapfile` — `0600`.
- [ ] `swapon --show` показывает активный swap.
- [ ] В `/etc/fstab` нет дублей.
- [ ] Если до запуска был активен другой swap, после `ensure-swap` он выключен.
- [ ] После `ensure-swap` активен ровно один swap: `/swapfile`.
- [ ] Все старые swap entries удалены из `/etc/fstab`.
- [ ] Для block-device swap выполняется только `swapoff` и удаление `fstab` entry; block device не удаляется.
- [ ] `vm.swappiness = 1` применён.
- [ ] Повторный `ensure-swap` не пересоздаёт корректный swap.
- [ ] Несовместимый существующий swap не удаляется молча.
- [ ] Повторный `ensure-swap` ничего не пересоздаёт и не добавляет дублей.
## I. Anti-torrent nftables guard
+2 -2
View File
@@ -35,7 +35,7 @@ window_end_utc = "02:00"
enabled = true
path = "/swapfile"
size_mb = 2048
priority = -2
priority = 1
swappiness = 1
```
@@ -82,7 +82,7 @@ swappiness = 1
`swap.enabled` — включает setup-задачу swap.
`swap.path`, `swap.size_mb`, `swap.priority`, `swap.swappiness` — параметры аварийного swap. Default: 2 ГБ, низкий priority, `swappiness = 1`.
`swap.path`, `swap.size_mb`, `swap.priority`, `swap.swappiness` — параметры managed swap. При `swap.enabled=true` пакет приводит swap-state к exclusive состоянию: активен ровно один swap (`swap.path`), остальные выключаются и swap-entries в `/etc/fstab` пересобираются в одну managed строку. Рекомендуемый low priority — `1`, `swappiness = 1`.
## Что не выносить в конфиг
+8 -2
View File
@@ -31,7 +31,7 @@ It does not replace Amnezia. It controls the surrounding system state that the o
Two systemd services run:
```bash
/usr/sbin/awg2-harness daemon --config /etc/awg2-harness/config.toml
/usr/sbin/awg2-harness --config /etc/awg2-harness/config.toml daemon
/usr/sbin/awg2-reboot-scheduler --config /etc/awg2-harness/config.toml
```
@@ -440,7 +440,13 @@ Production reboot path is external binary/service `awg2-reboot-scheduler`:
- one `/etc/fstab` entry with configured priority;
- `vm.swappiness = 1` persisted and applied.
The module must be idempotent. It must not delete unknown swap state automatically.
When `swap.enabled=true`, AWG2 Harness owns host swap state exclusively.
The desired state is exactly one active swap entry: `swap.path`.
All other active swap devices/files are disabled via `swapoff`.
All non-comment swap entries in `/etc/fstab` are removed and replaced by one managed AWG2 entry.
Regular-file swapfiles that are not the configured `swap.path` may be deleted only after successful `swapoff`.
Block devices are never deleted, only disabled and removed from fstab.
The operation must be idempotent.
## 18. Testing
+8 -5
View File
@@ -54,13 +54,16 @@ install -m 0644 /root/awg2-harness.config.toml /etc/awg2-harness/config.toml
### C3. Validate and apply
```bash
awg2-harness validate-config --config /etc/awg2-harness/config.toml
awg2-harness validate-runtime --config /etc/awg2-harness/config.toml
awg2-harness apply-limits --config /etc/awg2-harness/config.toml
awg2-harness apply-firewall --config /etc/awg2-harness/config.toml
awg2-harness status --config /etc/awg2-harness/config.toml
awg2-harness --config /etc/awg2-harness/config.toml validate-config
awg2-harness --config /etc/awg2-harness/config.toml validate-runtime
awg2-harness --config /etc/awg2-harness/config.toml ensure-swap
awg2-harness --config /etc/awg2-harness/config.toml apply-limits
awg2-harness --config /etc/awg2-harness/config.toml apply-firewall
awg2-harness --config /etc/awg2-harness/config.toml status
```
When `swap.enabled=true`, AWG2 Harness will disable all other active swap entries and rewrite `/etc/fstab` swap entries to a single managed swapfile.
### C4. Enable services
```bash
+3 -2
View File
@@ -234,7 +234,8 @@ Requires=docker.service
[Service]
Type=simple
User=root
ExecStart=/usr/sbin/awg2-harness daemon --config /etc/awg2-harness/config.toml
ExecStartPre=/usr/sbin/awg2-harness --config /etc/awg2-harness/config.toml ensure-swap
ExecStart=/usr/sbin/awg2-harness --config /etc/awg2-harness/config.toml daemon
Restart=always
RestartSec=5
StandardOutput=journal
@@ -250,7 +251,7 @@ WantedBy=multi-user.target
Логика reboot работает только через встроенный scheduler `traffic_core`. Окно перезагрузки задаётся в конфиге, включая корректные окна через полночь. Механика `systemctl --no-block reboot` сохраняется.
`ensure-swap` должен создать 2 ГБ swap-файл с правами `0600`, добавить одну запись в `/etc/fstab`, включить swap и выставить низкую склонность к использованию (`vm.swappiness = 1`, низкий priority). Если на сервере уже есть несовместимый swap, команда должна сообщить об этом явно, а не разрушать чужое состояние без подтверждения.
`ensure-swap` работает как exclusive reconciler: при `swap.enabled=true` пакет полностью владеет swap-state хоста. После reconcile активен ровно один swap (`swap.path`), все прочие активные swap entries выключены (`swapoff`), а все старые swap-строки в `/etc/fstab` заменены на одну managed-запись AWG2. Для block-device swap выполняются только `swapoff` и удаление записи из `fstab`; device не удаляется.
## 13. Acceptance критерий миграции