[PR #10] [MERGED] v3.0.0: multi-instance — несколько туннелей одновременно #16

Closed
opened 2026-10-31 21:01:47 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/MrTheory/os-amneziawg/pull/10
Author: @SergeyLimonov
Created: 6/5/2026
Status: ✅ Merged
Merged: 6/6/2026
Merged by: @MrTheory

Base: develop ← Head: feature/multi-instance


📝 Commits (10+)

  • e6fde4e CLAUDE.md was removed from git index
  • ff23566 Test Connection error fix
  • 250f8fe feat: multi-instance tunnels — ArrayField model, migration, CRUD API, grid UI
  • 9588995 fix: flatten ArrayField mount (no double instances nesting), run migrations in install.sh
  • 869599c fix: empty Edit dialog (hyphen in grid id), Import add-button selector for Tabulator, orphaned runtime conf sweep
  • 8359e3c feat: per-row Start/Stop tunnel buttons, granular watchdog recovery
  • 57d6f12 feat: tunnel selector on Diagnostics tab (multi-instance)
  • b2d98c4 feat: Test Connection failure hints (BACKLOG #2)
  • fc02506 docs: v3.0.0 — multi-instance documentation overhaul
  • 638e855 fix: normalize multi-layer HTML encoding of I1-I5 during migration (BACKLOG #5)

📊 Changes

19 files changed (+1660 additions, -698 deletions)

View changed files

📝 .gitignore (+1 -0)
➖ CLAUDE.md (+0 -93)
📝 Changelog.md (+66 -2)
📝 PREREQUISITES.md (+18 -6)
📝 README.md (+145 -47)
📝 install.sh (+60 -82)
📝 plugin/etc/inc/plugins.inc.d/amneziawg.inc (+35 -8)
📝 plugin/mvc/app/controllers/OPNsense/AmneziaWG/Api/InstanceController.php (+282 -111)
📝 plugin/mvc/app/controllers/OPNsense/AmneziaWG/Api/ServiceController.php (+71 -5)
📝 plugin/mvc/app/controllers/OPNsense/AmneziaWG/IndexController.php (+10 -2)
📝 plugin/mvc/app/controllers/OPNsense/AmneziaWG/forms/dialogInstance.xml (+104 -12)
📝 plugin/mvc/app/models/OPNsense/AmneziaWG/Instance.xml (+146 -141)
➕ plugin/mvc/app/models/OPNsense/AmneziaWG/Migrations/M2_0_0.php (+105 -0)
📝 plugin/mvc/app/views/OPNsense/AmneziaWG/general.volt (+212 -73)
📝 plugin/scripts/AmneziaWG/amneziawg-ifstats.php (+29 -18)
📝 plugin/scripts/AmneziaWG/amneziawg-service-control.php (+207 -57)
📝 plugin/scripts/AmneziaWG/amneziawg-testconnect.php (+106 -25)
📝 plugin/scripts/AmneziaWG/amneziawg-watchdog.php (+43 -14)
📝 plugin/service/conf/actions.d/actions_amneziawg.conf (+20 -2)

📄 Description

Что это

Релиз v3.0.0: поддержка нескольких AmneziaWG-туннелей одновременно (awg0–awg99) — задача BACKLOG #1, плюс BACKLOG #2, #3, #5. Закрывает основной запрос: два и более независимых VPN-провайдера / разные туннели для разных Firewall Rules.

Breaking change: миграция конфигурации

Плоская модель //OPNsense/amneziawg/instance заменена на ArrayField //OPNsense/amneziawg/instances/instance (UUID-ключи). При обновлении с 2.x:

  • миграция M2_0_0 выполняется автоматически на шаге 4 install.sh (через run_migrations.php — миграции моделей OPNsense НЕ запускаются при инстанцировании);
  • private.key переименовывается в <uuid>.key;
  • legacy-узел удаляется; поля I1–I5 нормализуются от многослойной HTML-кодировки;
  • работающий туннель при обновлении не прерывается.

Основные изменения

UI (вкладка Tunnels вместо Instance):

  • грид туннелей + диалог редактирования (dialogInstance.xml кормит и грид, и диалог);
  • колонка runtime-статуса: running / no handshake / stopped;
  • per-row кнопки Start/Stop (▶/■) — управление туннелем без влияния на остальные;
  • Import .conf открывает Add-диалог с заполненными полями; Generate Keypair в диалоге;
  • авто-подстановка свободного номера интерфейса, валидация дубликатов.

Engine:

  • start_instance/stop_instance/sentinel_repair configd-действия;
  • per-instance stopped-флаги (/var/run/amneziawg_stopped_awgN.flag) — per-row Stop переживает watchdog; сервисные Start/Restart/Apply сбрасывают их;
  • зачистка runtime-конфигов awgN.conf при остановке (SEC-1: удалённый туннель не оставляет ключ на диске);
  • watchdog стал гранулярным: перезапускает только упавший туннель, живые сессии не рвутся; мёртвый sentinel чинится без перезапуска туннелей.

Diagnostics:

  • селектор туннеля: статистика, Test Connection и Copy Debug Info по выбранному awgN;
  • Test Connection при ошибке классифицирует причину (interface_down / handshake_stale / dns_failure / no_route / remote_unresponsive) и показывает подсказку следующего шага (BACKLOG #2).

Исправления:

  • пустой Edit-диалог: mapDataToFormUI матчит форму по id.split('-')[0] — id гридов теперь без дефисов;
  • кнопка Add в 26.x Tabulator (button.command-add, fallback для 25.x);
  • reconfigure сбрасывает stopped-флаг (watchdog возобновляет мониторинг после Apply).

Документация: README (multi-instance, Gateway в 26.x, файловая структура), Changelog v3.0.0 + бэкфил v2.7.0.

Тестирование (OPNsense 26.1, FreeBSD 14.3, amnezia-kmod 2.0.11)

  • ✅ Миграция 2.7.0 → 3.0.0 (двойной прогон со snapshot: структура, ключ, legacy-cleanup, кодировка I1, непрерывность туннеля)
  • ✅ CRUD через GUI: Add/Edit/toggle/delete (+удаление ключа), дубликат номера отклоняется
  • ✅ Import .conf → заполненный диалог; Generate Keypair
  • ✅ Два живых VPS параллельно (164.215.97.155 + 45.38.3.136), одновременные handshake; AWG 2.0 параметры (Jc/S1-S4/H1-H4 диапазоны/I1 CPS) дошли до драйвера
  • ✅ Per-row Start/Stop + флаги; watchdog: рестарт только упавшего, уважение per-row стопов, sentinel_repair
  • ✅ Lifecycle, boot autostart (syshook), per-instance ifstats/testconnect + anti-injection
  • ✅ Uninstall: чистое удаление всех путей, настройки в config.xml сохраняются

🤖 Generated with Claude Code


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/MrTheory/os-amneziawg/pull/10 **Author:** [@SergeyLimonov](https://github.com/SergeyLimonov) **Created:** 6/5/2026 **Status:** ✅ Merged **Merged:** 6/6/2026 **Merged by:** [@MrTheory](https://github.com/MrTheory) **Base:** `develop` ← **Head:** `feature/multi-instance` --- ### 📝 Commits (10+) - [`e6fde4e`](https://github.com/MrTheory/os-amneziawg/commit/e6fde4ec82bb4de84fadc4d60511cd2a98dd35bf) CLAUDE.md was removed from git index - [`ff23566`](https://github.com/MrTheory/os-amneziawg/commit/ff235667e62b9d5ff50e492fe484b3cfedad28b0) Test Connection error fix - [`250f8fe`](https://github.com/MrTheory/os-amneziawg/commit/250f8fe88e2a7ee5b760d348d32acae65cc8c205) feat: multi-instance tunnels — ArrayField model, migration, CRUD API, grid UI - [`9588995`](https://github.com/MrTheory/os-amneziawg/commit/95889955648ffcb9c6596a182815bd3441080fb5) fix: flatten ArrayField mount (no double instances nesting), run migrations in install.sh - [`869599c`](https://github.com/MrTheory/os-amneziawg/commit/869599c939e404f2e2d165367c9ef42b8422343a) fix: empty Edit dialog (hyphen in grid id), Import add-button selector for Tabulator, orphaned runtime conf sweep - [`8359e3c`](https://github.com/MrTheory/os-amneziawg/commit/8359e3c72b9c87900c42af6b7be14c744b4cda34) feat: per-row Start/Stop tunnel buttons, granular watchdog recovery - [`57d6f12`](https://github.com/MrTheory/os-amneziawg/commit/57d6f12856074c5b9de850f8bd8f6e44d50305af) feat: tunnel selector on Diagnostics tab (multi-instance) - [`b2d98c4`](https://github.com/MrTheory/os-amneziawg/commit/b2d98c497042bee989b52b639c43d88d583c395b) feat: Test Connection failure hints (BACKLOG #2) - [`fc02506`](https://github.com/MrTheory/os-amneziawg/commit/fc02506668f5a62191ca85e74ac7f330a41dbdf7) docs: v3.0.0 — multi-instance documentation overhaul - [`638e855`](https://github.com/MrTheory/os-amneziawg/commit/638e855c22f38f5f61c6ca3098ceb222d874ed81) fix: normalize multi-layer HTML encoding of I1-I5 during migration (BACKLOG #5) ### 📊 Changes **19 files changed** (+1660 additions, -698 deletions) <details> <summary>View changed files</summary> 📝 `.gitignore` (+1 -0) ➖ `CLAUDE.md` (+0 -93) 📝 `Changelog.md` (+66 -2) 📝 `PREREQUISITES.md` (+18 -6) 📝 `README.md` (+145 -47) 📝 `install.sh` (+60 -82) 📝 `plugin/etc/inc/plugins.inc.d/amneziawg.inc` (+35 -8) 📝 `plugin/mvc/app/controllers/OPNsense/AmneziaWG/Api/InstanceController.php` (+282 -111) 📝 `plugin/mvc/app/controllers/OPNsense/AmneziaWG/Api/ServiceController.php` (+71 -5) 📝 `plugin/mvc/app/controllers/OPNsense/AmneziaWG/IndexController.php` (+10 -2) 📝 `plugin/mvc/app/controllers/OPNsense/AmneziaWG/forms/dialogInstance.xml` (+104 -12) 📝 `plugin/mvc/app/models/OPNsense/AmneziaWG/Instance.xml` (+146 -141) ➕ `plugin/mvc/app/models/OPNsense/AmneziaWG/Migrations/M2_0_0.php` (+105 -0) 📝 `plugin/mvc/app/views/OPNsense/AmneziaWG/general.volt` (+212 -73) 📝 `plugin/scripts/AmneziaWG/amneziawg-ifstats.php` (+29 -18) 📝 `plugin/scripts/AmneziaWG/amneziawg-service-control.php` (+207 -57) 📝 `plugin/scripts/AmneziaWG/amneziawg-testconnect.php` (+106 -25) 📝 `plugin/scripts/AmneziaWG/amneziawg-watchdog.php` (+43 -14) 📝 `plugin/service/conf/actions.d/actions_amneziawg.conf` (+20 -2) </details> ### 📄 Description ## Что это Релиз **v3.0.0**: поддержка нескольких AmneziaWG-туннелей одновременно (`awg0`–`awg99`) — задача BACKLOG #1, плюс BACKLOG #2, #3, #5. Закрывает основной запрос: два и более независимых VPN-провайдера / разные туннели для разных Firewall Rules. ## Breaking change: миграция конфигурации Плоская модель `//OPNsense/amneziawg/instance` заменена на ArrayField `//OPNsense/amneziawg/instances/instance` (UUID-ключи). При обновлении с 2.x: - миграция `M2_0_0` выполняется автоматически на шаге 4 `install.sh` (через `run_migrations.php` — миграции моделей OPNsense НЕ запускаются при инстанцировании); - `private.key` переименовывается в `<uuid>.key`; - legacy-узел удаляется; поля I1–I5 нормализуются от многослойной HTML-кодировки; - работающий туннель при обновлении не прерывается. ## Основные изменения **UI (вкладка Tunnels вместо Instance):** - грид туннелей + диалог редактирования (`dialogInstance.xml` кормит и грид, и диалог); - колонка runtime-статуса: running / no handshake / stopped; - per-row кнопки Start/Stop (▶/■) — управление туннелем без влияния на остальные; - Import .conf открывает Add-диалог с заполненными полями; Generate Keypair в диалоге; - авто-подстановка свободного номера интерфейса, валидация дубликатов. **Engine:** - `start_instance`/`stop_instance`/`sentinel_repair` configd-действия; - per-instance stopped-флаги (`/var/run/amneziawg_stopped_awgN.flag`) — per-row Stop переживает watchdog; сервисные Start/Restart/Apply сбрасывают их; - зачистка runtime-конфигов `awgN.conf` при остановке (SEC-1: удалённый туннель не оставляет ключ на диске); - watchdog стал гранулярным: перезапускает только упавший туннель, живые сессии не рвутся; мёртвый sentinel чинится без перезапуска туннелей. **Diagnostics:** - селектор туннеля: статистика, Test Connection и Copy Debug Info по выбранному `awgN`; - Test Connection при ошибке классифицирует причину (`interface_down` / `handshake_stale` / `dns_failure` / `no_route` / `remote_unresponsive`) и показывает подсказку следующего шага (BACKLOG #2). **Исправления:** - пустой Edit-диалог: `mapDataToFormUI` матчит форму по `id.split('-')[0]` — id гридов теперь без дефисов; - кнопка Add в 26.x Tabulator (`button.command-add`, fallback для 25.x); - reconfigure сбрасывает stopped-флаг (watchdog возобновляет мониторинг после Apply). **Документация:** README (multi-instance, Gateway в 26.x, файловая структура), Changelog v3.0.0 + бэкфил v2.7.0. ## Тестирование (OPNsense 26.1, FreeBSD 14.3, amnezia-kmod 2.0.11) - ✅ Миграция 2.7.0 → 3.0.0 (двойной прогон со snapshot: структура, ключ, legacy-cleanup, кодировка I1, непрерывность туннеля) - ✅ CRUD через GUI: Add/Edit/toggle/delete (+удаление ключа), дубликат номера отклоняется - ✅ Import .conf → заполненный диалог; Generate Keypair - ✅ **Два живых VPS параллельно** (164.215.97.155 + 45.38.3.136), одновременные handshake; AWG 2.0 параметры (Jc/S1-S4/H1-H4 диапазоны/I1 CPS) дошли до драйвера - ✅ Per-row Start/Stop + флаги; watchdog: рестарт только упавшего, уважение per-row стопов, sentinel_repair - ✅ Lifecycle, boot autostart (syshook), per-instance ifstats/testconnect + anti-injection - ✅ Uninstall: чистое удаление всех путей, настройки в config.xml сохраняются 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-10-31 21:01:47 +00:00
Sign in to join this conversation.
No labels
pull-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
MrTheory/os-amneziawg#16
No description provided.