Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
3c09e38
Мультипротокол, срез 1: нейтральный backend-реестр + CLI backend-status
Ap3x0s Oct 3, 2026
839a7ec
Мультипротокол, срез 2: backend Hysteria 2 (install/uninstall/status,…
Ap3x0s Oct 3, 2026
ef6455c
Мультипротокол, срез 3: гранты Hysteria 2 per-profile + подписка + по…
Ap3x0s Oct 3, 2026
23932ae
Мультипротокол, срез 4: backend AmneziaWG 2.0 (kernel DKMS, install/u…
Ap3x0s Oct 3, 2026
ccfa306
Мультипротокол, срез 5: peer-модель AmneziaWG + клиентский .conf + по…
Ap3x0s Oct 3, 2026
56554da
Мультипротокол, срез 6: аддитивные backends-поля в inspect и profiles…
Ap3x0s Oct 3, 2026
43f5e46
Живой тест (2.26.125.147): 4 фикса Hysteria 2, найденных на реальном …
Ap3x0s Oct 3, 2026
71e662c
Живой тест (2.26.125.147): 5 фиксов AmneziaWG, найденных на реальном …
Ap3x0s Oct 4, 2026
087c5cb
Документация: мультипротокольный этап 1 + AWG 3.1 (en/ru/zh)
Ap3x0s Oct 4, 2026
878b25c
AWG 3.1 реализован: HeaderProtectionKey + RandomTrailers + S3/S4, тум…
Ap3x0s Oct 4, 2026
e33ec63
GUI этап 2, срез A: main-адаптеры мультибэкенда (IPC backends:*)
Ap3x0s Oct 4, 2026
88f0f3f
GUI этап 2, срез B: секция «Мультипротокольные бэкенды» в Server Sett…
Ap3x0s Oct 4, 2026
f727c2e
Hysteria 2: флаг страны в имени ключа подписки (единый вид с VLESS в …
Ap3x0s Oct 4, 2026
86ea17d
GUI этап 2, срез C: выдача ключей бэкендов у профиля (текст + QR + гр…
Ap3x0s Oct 4, 2026
2b3d2c7
GUI этап 2, срез D: самодокументирующаяся шапка .conf + доки о выдаче…
Ap3x0s Oct 4, 2026
8e8cb4f
GUI этап 2: визуальная переработка карточек бэкендов (по фидбеку)
Ap3x0s Oct 4, 2026
e6c11ad
GUI этап 2: бэкенд-ключи на странице «Ключи» (hysteria2 из подписки +…
Ap3x0s Oct 4, 2026
0b4bcd3
GUI этап 2, итерация по фидбеку: prefetch+кэш, общий бокс, AWG как кл…
Ap3x0s Oct 4, 2026
5caffb1
GUI этап 2: бэкенд-ключи персистятся и грузятся параллельно (равный т…
Ap3x0s Oct 4, 2026
abbb80d
GUI этап 2: страница Ключей красится из стора сразу (устранена устаре…
Ap3x0s Oct 4, 2026
9f8c16e
GUI этап 2: AWG-конфиг — last-known-good, спиннер внутри карточки, фи…
Ap3x0s Oct 4, 2026
7f6821b
GUI этап 2: AWG-карточки рендерятся из стора мгновенно (без гейта bac…
Ap3x0s Oct 4, 2026
6eeb96c
GUI этап 2: бэкенды — весь текст внутри бокса, ноты во внутренних зат…
Ap3x0s Oct 4, 2026
75af549
GUI этап 2: единая внутренняя выемка на оба бэкенда (по фидбеку)
Ap3x0s Oct 4, 2026
8df3ee2
Документация: паритет с этапом 2 мультипротокола (CLI-таблицы, GUI, д…
Ap3x0s Oct 4, 2026
72b4130
GUI: экспорт AWG-ключа в родном формате vpn:// для AmneziaVPN
Ap3x0s Oct 4, 2026
113ca12
GUI: protocol_version в vpn:// — приложение считало конфиг legacy
Ap3x0s Oct 4, 2026
4a0ceb3
GUI: vpn:// в родном shape AmneziaWG-контейнера (server-level junk + …
Ap3x0s Oct 4, 2026
2c9198b
GUI: vpn:// 1-в-1 с экспортом AmneziaVPN (range-таймеры, client_pub, …
Ap3x0s Oct 4, 2026
de93197
AWG: junk-диалект один в один с Amnezia + синхронизация документации
Ap3x0s Oct 4, 2026
d1948ab
GUI: «QR · AmneziaVPN» выдаёт финальный рабочий формат, только 3.1
Ap3x0s Oct 4, 2026
81b312f
GUI: официальные логотипы Hysteria/Amnezia в бэкенд-блоках + ужат зазор
Ap3x0s Oct 5, 2026
86173d0
GUI: кнопки бэкендов — одно состояние, цветовая логика вкл/выкл
Ap3x0s Oct 5, 2026
9fccd4b
GUI: фикс инверсии тумблера AWG 3.1 — статус и действие разделены
Ap3x0s Oct 5, 2026
89cf599
AWG: apt-get с APT_LOCK_OPTS (регрессия apt-lock-race) + доки «один к…
Ap3x0s Oct 5, 2026
931f678
GUI i18n: семантика устройств в заметках бэкендов
Ap3x0s Oct 5, 2026
de950a6
GUI: Перевыпуск и Срок для бэкенд-ключей (Hysteria 2 / AmneziaWG)
Ap3x0s Oct 5, 2026
877c6a3
SNI: данные по замеру 03.09.2026 + регрессия легаси-синхронизации (из…
Ap3x0s Oct 5, 2026
23d2b52
AWG/firewall: перенос портов под ephemeral-range и отказ от ufw reloa…
Ap3x0s Oct 5, 2026
9a92d9e
HAPP client routing: split-профиль из bypass-наборов + плейсхолдеры +…
Ap3x0s Oct 5, 2026
52e192c
GUI: Срок для бэкенд-ключей (пресеты в диалоге и на карточках) + SNI …
Ap3x0s Oct 5, 2026
3f26b61
GUI: Revoke и Срок на карточках бэкендов — паритет с VLESS-карточками
Ap3x0s Oct 5, 2026
d17a916
nginx: буферы 32k в IP-TLS шаблоне подписки (хвост PR #23)
Ap3x0s Oct 5, 2026
71f6bfc
SNI: дефолт новых профилей — www.cloudflare.com (самый стабильный)
Ap3x0s Oct 6, 2026
b21217e
Доки: синк после SNI-дефолта и IP-TLS буферов
Ap3x0s Oct 6, 2026
d33fdb2
GUI: мультипротокольные карточки в «Создать профиль» + бэкенд-карточк…
Ap3x0s Oct 6, 2026
461e630
GUI: бэкенд-карточки профилей — на свою строку, а не третьим элементо…
Ap3x0s Oct 6, 2026
b17fdcb
GUI: бэкенд-карточки профилей — по фидбеку
Ap3x0s Oct 6, 2026
6235609
GUI: бэкенд-боксы профилей — отдельные сиблинги, метка Revoke, без замка
Ap3x0s Oct 6, 2026
4fa5d9e
GUI: бэкенд-боксы — Удалить всегда, подпись протокольная
Ap3x0s Oct 6, 2026
e0b80cc
GUI: бэкенд-боксы — зелёная строка статуса вместо «системный VPN · fu…
Ap3x0s Oct 6, 2026
cc23585
GUI: убрана кнопка «Ключи» и её диалог — копирование только в Ключах
Ap3x0s Oct 6, 2026
c2f746a
CLI: delete — чистый JSON в stdout и реген бэкендов после удаления пр…
Ap3x0s Oct 6, 2026
29b3602
GUI: создание бэкенд-профилей — как у VLESS (выбор + кнопка), имена п…
Ap3x0s Oct 6, 2026
2d17ea0
CLI+GUI: создание бэкенд-профиля выдаёт ключ ТОЛЬКО выбранного протокола
Ap3x0s Oct 6, 2026
c811e7f
Доки: синк семантики создания/удаления и бэкенд-боксов (en/ru/zh)
Ap3x0s Oct 6, 2026
c02cf5c
CLI: revoke --full падал на single-route профилях (невалидный path в jq)
Ap3x0s Oct 6, 2026
f37047b
GUI: Revoke на бэкенд-боксах — только «Полный отзыв»
Ap3x0s Oct 6, 2026
9764df2
GUI: Revoke confirm — мягкий danger-soft как у «Удалить» на dashboard
Ap3x0s Oct 8, 2026
602f003
CLI: убрать мёртвые дубли валидатора HAPP routing и endpoint-verifier
Ap3x0s Oct 8, 2026
841ff9a
CLI: quickstart деградирует в http_tls вместо dead-end, если LE не мо…
Ap3x0s Oct 8, 2026
9e6ec14
GUI: http_tls-fallback — ключи по SSH, partial-статус и честная диагн…
Ap3x0s Oct 8, 2026
bf2c4c3
Доки: http_tls-fallback quickstart (ru/en/zh × configuration/architec…
Ap3x0s Oct 8, 2026
de14943
Доки: geo-разметка ASN расходится между базами (ipinfo FI vs ipwho/ip…
Ap3x0s Oct 8, 2026
3608f87
GUI: убрать мёртвый https-URL подписки в http_tls-fallback
Ap3x0s Oct 8, 2026
a8cd8d6
GUI+доки: плашка бэкендов «в разработке · запасной» -> «дополнительны…
Ap3x0s Oct 8, 2026
64061bb
Доки: http_tls-fallback — подписка остаётся loopback-only, публичного…
Ap3x0s Oct 8, 2026
96e8895
CHANGELOG: раздел 0.6.5 (UNRELEASED, beta) — мультипротокол, http_tls…
Ap3x0s Oct 8, 2026
43b2d45
Релизный документ v0.6.5 (ru/en) — бета-баннер, мультипротокол, http_…
Ap3x0s Oct 8, 2026
9fe2949
Релиз 0.6.5: убрать аннотацию «без личных данных» у полевых заметок (…
Ap3x0s Oct 8, 2026
f76005e
GUI: обновление менеджера с явной веткой — бета-режим «обновиться с dev»
Ap3x0s Oct 8, 2026
06411f5
GUI: человекочитаемые подписи веток в меню обновления
Ap3x0s Oct 8, 2026
287befb
Релиз 0.6.5 + CHANGELOG: описать выбор ветки обновления (авто/main/dev)
Ap3x0s Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,76 @@

User-facing Xrayebator changes. The server manager and Electron application are published from the canonical `howdeploy/Xrayebator` repository.

## [0.6.5] - UNRELEASED (beta)

Multi-protocol stage: Xray Reality is joined by Hysteria 2 (UDP/QUIC) and AmneziaWG 3.1
(system VPN), a neutral backend registry with per-profile grants and lifecycle, a
HAPP client-routing generator with split routing, softer SNI defaults, a graceful
`http_tls` degradation path for hosters that filter port 80, and a wave of GUI feedback
polish. **0.6.5 is in testing — if you need a proven build, stay on 0.6.0.**

### Added

- **Hysteria 2 backend** (multi-protocol slices 2–3): install/uninstall/status via the
registry, a dedicated `hysteria` system user with its own `hysteria-server.service`
(CAP_NET_BIND_SERVICE), QUIC buffer sysctls, per-profile grants (`hysteria2-grant`)
with passwords stored in the profile JSON, server config regenerated from profiles
with rollback, adaptive TLS (Let's Encrypt cert copied with a renewal deploy-hook,
or self-signed with `insecure=1` client links), and `hysteria2://` lines appended to
both subscription bodies behind a kill switch.
- **AmneziaWG 3.1 backend** (slices 4–5 + 3.1): kernel module via DKMS (amnezia PPA
with a manual source-build fallback), `awg0` interface with junk params matching the
official Amnezia dialect, per-profile peers with keypair + preshared key, `awg0.conf`
regenerated from profiles, client `.conf` and `awg-conf` JSON for the GUI, AWG 3.1
format on by default (`HeaderProtectionKey`, `RandomTrailers`, `S1`–`S4`) with an
`awg-31` toggle and explicit re-download warnings, and the GUI delivering keys in the
app-native `vpn://` shape for AmneziaVPN.
- **Multi-protocol GUI**: a "multi-protocol backends" panel in Server settings with
official Hysteria/Amnezia logos, backend profile cards alongside VLESS cards
(create flow with an explicit protocol choice — a new profile receives keys only
from the chosen backend), per-backend QR (including "QR · AmneziaVPN"), expiry,
revoke and delete with immediate backend-key revocation on profile deletion.
- **HAPP client routing** (`bypass` CLI + generator): managed HAPP profile can carry
split routing from bypass groups, with placeholders (`{{GEOIP_URL}}`, `{{GEOSITE_URL}}`,
`{{LAST_UPDATED}}`) resolved per subscriber — geo databases are downloaded through the
subscription itself.
- **quickstart `http_tls` graceful degradation**: when Let's Encrypt cannot validate
http-01 for the IP (`Connection reset by peer` — the hoster filters port 80), the
deploy no longer dead-ends: markers switch to `http_tls`, the subscription stays
loopback-only (there is no public subscription URL at all — the GUI loads keys over
SSH from `127.0.0.1:8080`), a self-signed certificate is generated for future backends,
and the result JSON carries `degraded:true` / `tls_mode:"http_tls"` / `certbot_reason`.
Re-running quickstart after the hoster unblocks port 80 restores HTTPS.
- SNI candidates updated from the 03.09.2026 reachability measurements; the default SNI
for new profiles is `www.cloudflare.com`.
- Server country in key names: the HAPP profile fragments are labelled with a country
flag and name (`🇫🇮 Finland · happ-...`) resolved from the server IP geo databases.
- `validation/` grew from 28 to 34 scripts: backend registry, Hysteria 2 lifecycle,
AmneziaWG junk/renderers/lifecycle, HAPP client routing, legacy profile port sync,
quickstart `http_tls` fallback, apt-lock race, profile revoke/expire CLI.
- Branch choice for server updates: the "Update Xrayebator" button became a menu —
"Auto — as pinned on the server" (previous behavior), "main — latest stable release",
"dev — every feature first" (may be unstable): a server can be moved to the dev
manager before the merge without polluting main; switching back is an update from main.

### Fixed

- `revoke --full` crashed on single-route profiles (invalid jq path).
- `xrayebator profile-delete` printed colored status lines into stdout JSON; the CLI
path is JSON-clean now and backend grants are revoked in the same command (no
orphaned AWG peers or Hysteria passwords).
- Backend keys are granted only for the explicitly chosen protocol — creation no longer
issues keys from every installed backend.
- AWG ports moved out of the ephemeral range and ufw reloads are avoided during batch
firewall updates.
- Dead duplicate function definitions in the single-file manager removed (a shadowed
validator whose body would have clobbered subscription markers if ever called).
- The GUI no longer shows a dead `https://IP:8443` subscription URL on degraded
(`http_tls`) servers: no public link is displayed or saved at all, keys are fetched
over SSH, and the server is stored as "partially configured" with a degraded badge.
- Backend key creation/revoke/expiry dialogs match the VLESS card semantics
(danger-soft confirmations, device notes, expiry presets).

## [0.6.0] - 2026-10-01

Access control in the panel: subscription revocation (link-only or full), profile expiry
Expand Down
17 changes: 11 additions & 6 deletions CLAUDE.md

Large diffs are not rendered by default.

9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

<p>
<strong>inbounds</strong> · <strong>profiles</strong> · <strong>subscription</strong> ·
<strong>bypass</strong> · <strong>cascade</strong>
<strong>bypass</strong> · <strong>cascade</strong> · <strong>hysteria2</strong> ·
<strong>amneziawg</strong>
</p>

<p>
Expand All @@ -28,8 +29,10 @@
Xrayebator installs Xray-core, brings up Reality inbounds on random ports, and provisions a standard
schema-v3 HAPP profile of seven routes for a new setup. Existing seven-route profiles can be reused only
when they have enough live routes, so inspect the profile JSON when debugging labels or schema. The client
receives the routes as a single HTTPS subscription link. Current server line — 3.0; the optional Electron
desktop app is versioned separately.
receives the routes as a single HTTPS subscription link. As of the multi-protocol stage, optional
Hysteria 2 (fast UDP) and AmneziaWG 2.0/3.1 (system VPN) backends can be installed on the same VPS from
menu items 11–13, with per-profile grants wired into the shared revoke/expire lifecycle. Current server
line — 3.0; the optional Electron desktop app is versioned separately.
</p>

</div>
Expand Down
8 changes: 6 additions & 2 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

<p>
<strong>инбаунды</strong> · <strong>профили</strong> · <strong>подписка</strong> ·
<strong>bypass</strong> · <strong>каскад</strong>
<strong>bypass</strong> · <strong>каскад</strong> · <strong>hysteria2</strong> ·
<strong>amneziawg</strong>
</p>

<p>
Expand All @@ -28,7 +29,10 @@
Xrayebator ставит Xray-core, поднимает Reality-инбаунды на случайных портах и для новой установки
создаёт стандартный schema-v3 HAPP-профиль из семи маршрутов. Существующий семимаршрутный профиль
может быть переиспользован при наличии живых маршрутов, поэтому при отладке label/schema проверяйте
profile JSON. Клиент получает маршруты одной HTTPS-ссылкой подписки. Актуальная серверная линия — 3.0;
profile JSON. Клиент получает маршруты одной HTTPS-ссылкой подписки. Начиная с мультипротокольного
этапа, на тот же VPS опционально ставятся бэкенды Hysteria 2 (быстрый UDP) и AmneziaWG 2.0/3.1
(системный VPN) — пункты меню 11–13, гранты per-profile включены в общий жизненный цикл
revoke/expire. Актуальная серверная линия — 3.0;
опциональное Electron-десктоп-приложение имеет отдельную версию.
</p>

Expand Down
7 changes: 5 additions & 2 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

<p>
<strong>入站</strong> · <strong>配置档</strong> · <strong>订阅</strong> ·
<strong>分流</strong> · <strong>级联</strong>
<strong>分流</strong> · <strong>级联</strong> · <strong>hysteria2</strong> ·
<strong>amneziawg</strong>
</p>

<p>
Expand All @@ -27,7 +28,9 @@
<strong>一个 bash 脚本,把干净的 VPS 变成私人 VLESS Reality 服务器。</strong><br>
Xrayebator 安装 Xray-core,在随机端口上建立 Reality 入站,并为新安装创建包含七条线路的标准
schema-v3 HAPP 配置档。已有七线路配置档在满足存活线路数量时可能被复用,因此排查 label 或 schema
时请检查配置档 JSON。客户端通过一条 HTTPS 订阅链接获取线路。当前服务器版本线为 3.0;可选
时请检查配置档 JSON。客户端通过一条 HTTPS 订阅链接获取线路。自多协议阶段起,同一台 VPS 可选装
Hysteria 2(高速 UDP)与 AmneziaWG 2.0/3.1(系统级 VPN)后端——菜单项 11–13,每配置档授权纳入统一的
revoke/expire 生命周期。当前服务器版本线为 3.0;可选
Electron 桌面应用单独版本化。
</p>

Expand Down
43 changes: 40 additions & 3 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ configuration and systemd unit form the HAPP subscription path. The active deskt

/usr/local/etc/xray/
├── config.json # inbounds, outbounds, routing and DNS
├── profiles/<name>.json # profile metadata, subscription token, expiry (.expire)
├── profiles/<name>.json # profile metadata, subscription token, expiry (.expire), backend grants (.backends)
├── upstreams/cascade.json # cascade upstream parameters
├── backups/ # config backups made before runtime mutations
├── .private_key / .public_key # Reality keys
Expand All @@ -62,10 +62,18 @@ configuration and systemd unit form the HAPP subscription path. The active deskt
├── .current_branch # manager branch used by lifecycle updates
└── migration markers # records of completed one-time migrations

/usr/local/etc/xrayebator/ # multi-protocol backend root (neutral, Xray paths untouched)
├── backends.json # backend registry: installed/version/port/flags (644, no secrets)
└── backends/
├── hysteria2/ # server.yaml (regenerated from profiles), certs, placeholder credential
└── awg/ # awg0.conf (0600), server-params.json (0600)

/usr/local/share/xray/ # geoip.dat and geosite.dat
/var/log/xray/ # runtime log directory written by the Xray service
/etc/systemd/system/xray.service.d/security.conf
/etc/systemd/system/xrayebator-sub.service
/etc/systemd/system/hysteria-server.service # Hysteria 2 backend (optional)
/etc/systemd/system/awg-quick@awg0.service # AmneziaWG backend (optional, from amneziawg-tools)
/etc/nginx/sites-available/xrayebator-sub
```

Expand Down Expand Up @@ -102,13 +110,17 @@ The base is built from the saved subscription markers:
```text
https://<domain>/sub/<32-hex-token> # public TLS on 443
https://<domain>:8443/sub/<32-hex-token> # public TLS on another port
http://<IP>:8080/sub/<token> # http_tls fallback (LE could not validate http-01)
http://127.0.0.1:8080/sub/<token> # local-only fallback
```

The interactive HAPP setup can select the public port and `_subscription_base_url` preserves that
choice. The non-interactive `quickstart --email <address>` and `quickstart --without-email` IP-TLS paths
provision nginx, certificate and markers on `8443`, then emit JSON containing `subscription_url` for that
endpoint. Without an email, Certbot is explicitly told to register without an ACME contact; renewal
endpoint. When Let's Encrypt cannot validate http-01 (the hoster filters port 80 for foreign sources),
quickstart degrades to `http_tls`: the markers switch to that mode, the subscription is published over
HTTP from the loopback handler and the JSON carries `degraded:true`; rerunning the deploy after port 80
is unblocked restores ip_tls. Without an email, Certbot is explicitly told to register without an ACME contact; renewal
notices and email-based recovery are unavailable. The token is stored in the profile as `sub_token`;
revoke rotates it and invalidates the previous URL, while a full revoke (`profile-revoke --full`) also
changes the uuid in every inbound of the profile so already-downloaded configurations stop connecting.
Expand All @@ -132,7 +144,32 @@ or quickstart when the required routes are absent. A profile with no live inboun

The handler also serves the token-protected `geoip.dat` and `geosite.dat` resources required by the
managed HAPP routing profile. HAPP receives its routing metadata, while v2rayNG and v2rayN receive
the compatible VLESS body without HAPP-only metadata.
the compatible VLESS body without HAPP-only metadata. When the Hysteria 2 backend is installed and
the profile has a grant, the handler additionally appends one `hysteria2://` line to both the HAPP
and the generic subscription bodies, gated by the registry flag `sub_body`; expired or disabled
profiles never get the line.

## Multi-protocol backends

Beyond Xray, the manager can install additional transports on the same VPS. All backend state lives
in the neutral root `/usr/local/etc/xrayebator/` (registry `backends.json` plus per-backend
directories); the Xray state paths are untouched. Per-profile backend credentials live in the
profile's additive `.backends` object, which makes the profile JSON the single source of truth:
server-side configs (`backends/hysteria2/server.yaml`, `backends/awg/awg0.conf`) are always
regenerated from profiles, and profile lifecycle events (create, delete, revoke, expire, restore)
propagate through `_backend_apply_profile_lifecycle` to every installed backend.

- **Hysteria 2** — fast UDP transport. Own systemd unit `hysteria-server.service` running as the
dedicated `hysteria` user with `CAP_NET_BIND_SERVICE`; UDP 443 by default; adaptive TLS (the
subscription Let's Encrypt certificate plus a renewal deploy-hook, or a self-signed certificate);
`auth: userpass` with one credential per profile and a placeholder user while the map would
otherwise be empty (Hysteria rejects an empty map).
- **AmneziaWG 2.0** — system VPN. Kernel module via DKMS (PPA `amnezia/ppa` primary, source build
fallback), interface `awg0` through `awg-quick@awg0`, subnet `10.8.1.0/24`, per-profile peers
(keypair + preshared key + address), `ip_forward` and MASQUERADE on the default-route interface.
The distro unit reads `/etc/amnezia/amneziawg/awg0.conf`, which is a symlink to the managed file.
- Both backends are optional, installed and removed from menu items `11`–`13` or the `hysteria2-*`
/ `awg-*` CLI commands, and are never installed by default.

## Update paths

Expand Down
Loading
Loading