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:
@@ -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
|
||||
|
||||
|
||||
@@ -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`.
|
||||
|
||||
## Что не выносить в конфиг
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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 критерий миграции
|
||||
|
||||
|
||||
Reference in New Issue
Block a user