MatchaLab VPN 1.4.1 - сборка для Linux (x86-64)
================================================

Десктоп-клиент MatchaLab на .NET 8 + Avalonia. Сборка self-contained:
собственный рантайм .NET внутри, отдельно ставить .NET не нужно.

Протоколы:
  - MatchaWG (AmneziaWG) - движок amneziawg-go ВШИТ в сборку. Никакие
    amneziawg-tools / awg-quick / resolvconf больше не нужны.
  - Hysteria2 - через sing-box (вшит в сборку, ставить отдельно не нужно).


ЗАПУСК (portable, без установки)
--------------------------------
  ./run.sh

Требуется графическая сессия X11 или Wayland (через XWayland; на niri
нужен xwayland-satellite, на Hyprland XWayland включён по умолчанию).


УСТАНОВКА В СИСТЕМУ (рекомендуется)
----------------------------------
  sudo ./install.sh

Копирует приложение в /opt/matchalab, добавляет ярлык и иконку, ставит
правило polkit для беспарольного подключения и проверяет зависимости.
Удаление:
  sudo ./uninstall.sh

Без беспарольного правила (пароль при каждом подключении, как обычно):
  sudo ./install.sh --no-polkit


ЗАВИСИМОСТИ
-----------
Всё, что нужно от системы: polkit (pkexec) и iproute2 (команда ip) -
оба есть в любом дистрибутиве по умолчанию. Движки туннелей
(amneziawg-go, sing-box) вшиты в сборку.


WAYLAND: niri / Hyprland / sway
-------------------------------
  - Окно можно тайлить и растягивать - интерфейс масштабируется целиком.
  - Повторный запуск приложения НЕ создаёт вторую копию, а показывает окно
    уже работающей - так возвращают окно, спрятанное крестиком, если нет
    трея: просто запустите MatchaLab ещё раз из лаунчера.
  - Трей: нужен бар с поддержкой StatusNotifierItem (waybar с модулем
    "tray" и т.п.). Без трея всё работает - см. пункт выше.
  - pkexec требует запущенного polkit-агента. Либо поставьте правило
    беспарольного подключения (sudo ./install.sh - тогда агент не нужен),
    либо добавьте агент в автозапуск композитора, например:
      Hyprland:  exec-once = systemctl --user start hyprpolkitagent
      niri:      spawn-at-startup "lxqt-policykit-agent"
  - Автозапуск MatchaLab: галочка в настройках создаёт XDG-autostart
    (~/.config/autostart), который niri/Hyprland сами не читают. Добавьте
    в конфиг композитора:
      Hyprland:  exec-once = /opt/matchalab/MatchaLab --min
      niri:      spawn-at-startup "/opt/matchalab/MatchaLab" "--min"

Примечание про GNOME: иконки трея (StatusNotifierItem) по умолчанию
скрыты - нужно расширение "AppIndicator and KStatusNotifierItem Support".
В KDE/XFCE/Cinnamon трей работает из коробки.


ФОНОВЫЙ РЕЖИМ И АВТОЗАПУСК
-------------------------
Приложение живёт в системном трее. Закрытие окна (крестик) прячет его -
процесс и туннель продолжают работать. Полный выход - пункт "Выход"
в меню трея. Запуск с ключом --min стартует без окна (для автозапуска).


ПОДКЛЮЧЕНИЕ (детали)
--------------------
Поднятие туннеля требует прав root (TUN, маршруты). Через pkexec:

  - MatchaWG: конфиг пишется в ~/.config/MatchaLab/matchalab.conf (600).
    Приложение само запускает вшитый amneziawg-go, передаёт ему ключи и
    обфускацию по UAPI, ставит адреса и маршруты через ip, DNS - через
    systemd-resolved (resolvectl), а без него аккуратной подменой
    /etc/resolv.conf с восстановлением при отключении. Ставится обходной
    host-маршрут до сервера, чтобы шифрованный трафик не зациклился.
    Если сервер не ответил на рукопожатие, попытка автоматически
    повторяется с чистым интерфейсом.
  - Hysteria2: запускается вшитый sing-box (стек gvisor - на Linux
    системный стек рвёт крупные TCP-потоки), он поднимает TUN и
    раскладывает трафик по сплиту.

Лог туннеля MatchaWG: /tmp/matchalab-awg.log
Настройки: ~/.config/MatchaLab/ , секрет-ключ: ~/.local/share/MatchaLab/


ОГРАНИЧЕНИЯ
-----------
  - Одновременно с другим полнотуннельным VPN работать не будет (в т.ч.
    AmneziaVPN в режиме полного туннеля - handshake нашего сервера не пройдёт).
  - Служба-туннель на Linux не переподнимается сама: если интерфейс упал,
    переключите VPN заново кнопкой.
