sing-box клиент с разделением трафика:
часть приложений и сайтов идёт через VPN, остальное — напрямую, по правилам,
которые задаются в одном файле policy.conf. Одна и та же подписка и
политика работают и на Linux (headless-сервер, systemd), и на Windows
(ноутбук, TUN + Task Scheduler). Провайдер — любой с протоколом VLESS
(Durev, Marzban, 3x-ui, свой сервер) — в секрете только ключ или ссылка
подписки, никаких привязок к конкретному провайдеру в коде нет.
- Избирательность по программам — например, только
claudeиantigravityидут через VPN, всё остальное — напрямую. - Избирательность по сайтам — список «через VPN» и список «всегда напрямую» (банки, госуслуги — туда лучше не пускать чужой IP).
- Автовыбор самого быстрого сервера — встроенный
urltestраз в несколько минут сам перепроверяет задержку до пачки серверов и переключается на быстрейший, без разрыва текущих соединений. - Проверка живости нод — при сборке каждая нода реально проверяется
запросами к
api.anthropic.com(ждать 401/404),www.youtube.comиopenrouter.ai/api/v1/models(ждать 200); в гонкуurltestпопадают только прошедшие проверку (B-010). - xhttp-ноды через Xray-core — подписки, где почти все ноды на
транспорте xhttp (которого sing-box не понимает), держатся через
отдельный
xray-core: та же связка sing-box(TUN)→xray, что у официального приложения Durev (B-007/B-011). - Telegram по IP, а не по доменам — MTProto/CDN-подключения к голым
91.108.x/149.154.xтоже идут через VPN (правила по CIDR + geosite), особенно важно для TUN-режима на Windows (B-013). - Телеметрия провайдера 24/7 (B-015) — каждые 30 минут записывается живость, пинг и HTTP-доступность каждой ноды; сводка по провайдерам, странам и времени жизни нод накапливается месяцами.
- Автовосстановление — на Linux systemd перезапускает клиент при падении;
на Windows дежурный watchdog каждые 5 минут проверяет канал и после трёх
последовательных сбоев перезапускает клиент. Каждая проверка и причина
восстановления сохраняются в журнале;
statusобъясняет текущий пул нод.
- Linux: любой дистрибутив с systemd (проверено на Debian; ставится и на Ubuntu/Fedora/RHEL/Arch), права root, архитектура amd64 или arm64.
- Windows: Windows 10/11, PowerShell 5.1+, Python 3 в
PATH(используется рендерером конфига), права администратора (установщик иGolemVpn.ps1сами поднимают права). - В любом случае: ключ VLESS (
vless://…), ссылка подписки (https://…) или body-ответа подписки из браузера (base64-блок).
git clone https://github.com/chudodey/golem-vless-client.git vpn-client
cd vpn-client
sudo bash scripts/install.shСкрипт сам определяет дистрибутив (apt/dnf/yum/pacman), ставит
зависимости, скачивает статический бинарник sing-box (одна и та же сборка для
любого дистрибутива — распаковка из архива, не системный пакет) и раскладывает
файлы:
| Что | Куда (по умолчанию) |
|---|---|
| Программа и скрипты | /opt/golem-vless/ |
Ваши настройки (policy.conf, endpoints.txt) |
/etc/golem-vless/ |
| Кэш sing-box и телеметрия | /var/lib/golem-vless/ |
| Команда управления | /usr/local/bin/vpnctl |
Пути переопределяются переменными PREFIX/ETC/STATE перед запуском
install.sh, если нужно поставить в нестандартное место. Повторный запуск
install.sh безопасен — не затирает уже заполненные policy.conf и
endpoints.txt. Также ставит systemd-таймер телеметрии golem-vless-stats.timer.
Из корня проекта, в PowerShell от имени администратора:
.\windows\Install-GolemVless.ps1 -StartУстановщик качает sing-box.exe и xray.exe, копирует скрипты и
policy.conf в %LOCALAPPDATA%\GolemVLESS, создаёт VPN-задачу и watchdog и
раскладывает файлы так:
| Что | Куда |
|---|---|
Скрипты, sing-box.exe, xray.exe |
%LOCALAPPDATA%\GolemVLESS\bin\ |
Ваши настройки (policy.conf, endpoints.txt) |
%LOCALAPPDATA%\GolemVLESS\config\ |
| Конфиг, кэш, логи, телеметрия | %LOCALAPPDATA%\GolemVLESS\state\ |
| Автозапуск | задачи GolemVLESS, GolemVLESS-Watchdog, GolemVLESS-Refresh |
Секреты остаются вне репозитория — в config\endpoints.txt. Перед установкой
(или на первом старте) закройте другой активный TUN-клиент, например Durev
VPN: одновременно работать может только один TUN-клиент.
Перед каждым запуском, перезапуском, watchdog-восстановлением и авто-refresh
Golem проверяет внешние VPN/TUN (Durev, Happ и распространённые клиенты). При
обнаружении он ничего не останавливает и не меняет, а пишет причину в
%LOCALAPPDATA%\GolemVLESS\state\connection-events.jsonl и завершает свою
операцию. Это защищает рабочее соединение, через которое ведётся отладка.
Синтаксис и оба списка правил одинаковы на обеих системах: что через VPN,
что напрямую, и параметры автовыбора ([auto-select]). Внутри файла всё
объяснено в комментариях. Лежит он в разных местах:
| Linux | Windows | |
|---|---|---|
policy.conf |
/etc/golem-vless/policy.conf |
%LOCALAPPDATA%\GolemVLESS\config\policy.conf |
endpoints.txt |
/etc/golem-vless/endpoints.txt |
%LOCALAPPDATA%\GolemVLESS\config\endpoints.txt |
@provider myprovider
vless://uuid@host:443?security=reality&…#Имя-ноды
ACTIVE=1
или ссылка подписки (список нод одной строкой):
@provider myprovider
https://example.com/sub/TOKEN
ACTIVE=1
Можно несколько @provider-блоков подряд; ACTIVE=N выбирает N-й
распознанный узел как ручной вариант (актуально только если автовыбор
выключен). Если сеть блокирует скачивание подписки (DPI) — вставьте
base64-тело ответа подписки из браузера вместо ссылки (см. «Частые проблемы»).
Проверка, что ключ распознался (без запуска сервиса):
# Linux
python3 /opt/golem-vless/scripts/render_config.py \
--endpoints /etc/golem-vless/endpoints.txt --check-only# Windows
python ".\scripts\render_config.py" --endpoints "$env:LOCALAPPDATA\GolemVLESS\config\endpoints.txt" --check-only- Ключ:
sudo nano /etc/golem-vless/endpoints.txt(см. форматы выше). - Правила:
vpnctl policy→ правки →vpnctl reload. - Запуск:
sudo vpnctl on, затемsudo vpnctl status.
- Ключ: если не вставили до установки —
notepad "$env:LOCALAPPDATA\GolemVLESS\config\endpoints.txt". - Правила:
notepad "$env:LOCALAPPDATA\GolemVLESS\config\policy.conf"→ правки →GolemVpn.ps1 restart. - Запуск:
GolemVpn.ps1 start.
Проверка на любой системе: приложение из списка видит IP VPN-сервера,
обычный curl.exe https://ifconfig.io/ip — домашний IP.
| Команда | Что делает |
|---|---|
vpnctl on / off / restart |
включить / выключить / перезапустить |
vpnctl status |
состояние, текущий сервер, проверка обоих маршрутов |
vpnctl nodes |
список серверов с задержкой (мс), быстрейший — сверху |
vpnctl fastest |
сейчас же перепроверить и переключиться на быстрейший |
vpnctl check <имя> |
убедиться, что программа <имя> реально идёт через VPN |
vpnctl reload |
пересобрать конфиг (включая обновление URL-подписок) и перезапустить |
vpnctl policy |
открыть policy.conf в $EDITOR (по умолчанию nano) |
vpnctl logs [N] |
последние N строк журнала (по умолчанию 50) |
vpnctl stats / report |
собрать телеметрию нод и показать сводку / просто сводку (B-015) |
on, off, restart и reload требуют root (sudo). status, nodes,
fastest, check и logs можно запускать без root; policy требует прав
на запись в файл конфигурации (обычно sudo vpnctl policy).
Устанавливается в %LOCALAPPDATA%\GolemVLESS\bin\GolemVpn.ps1 и умеет сам
поднимать права. Параметр -Wait держит окно открытым до Enter
(используется ярлыками на рабочем столе).
| Команда | Что делает |
|---|---|
GolemVpn.ps1 status (по умолчанию) |
состояние задач, процессы sing-box/xray, число ключей, активный сервер, системный прокси, внешний IP |
GolemVpn.ps1 start / stop / restart |
включить / выключить / перезапустить |
GolemVpn.ps1 logs |
последние строки лога sing-box |
GolemVpn.ps1 diagnose |
собрать отчёт state\diagnostic.txt |
GolemVpn.ps1 refresh |
вручную обновить подписку и перезапустить клиент при изменении |
GolemVpn.ps1 stats / report |
собрать телеметрию и показать сводку / просто сводку (B-015) |
GolemVpn.ps1 watchdog |
история проверок, авто-восстановлений и смен ноды |
GolemVpn.ps1 uninstall |
полное удаление (задачи, процессы, %LOCALAPPDATA%\GolemVLESS, ярлыки) |
- Linux:
vpnctl reloadтянет свежие ноды при каждой пересборке конфига (--fetch); при недоступности подписки рендерер использует последний кэш вstate/last-subscription.txt. - Windows: ежедневно в 04:00 задача
GolemVLESS-Refreshскачивает свежий список вstate\last-subscription.txtи, если sha256 пула изменился, перезапускает клиент (лог —state\subscription-refresh.log). Тот же кэш — офлайн-фолбэк рендерера. Ручной запуск —GolemVpn.ps1 refresh.
Чтобы временно остановить Windows-клиент и вернуться к Durev:
Stop-ScheduledTask GolemVLESS
Stop-ScheduledTask GolemVLESS-WatchdogОдного «сервис запущен» недостаточно — split-маршрутизация может быть сломана
незаметно (см. «Частые проблемы»). Правильная проверка — оба маршрута
сразу; на Linux это делает vpnctl status:
| Проверка | Ожидаемый результат |
|---|---|
Сайт из [domains-direct] (например банк) |
открывается с вашего обычного IP |
Сайт из [domains-via-vpn] |
открывается с IP/страной VPN-сервера |
vpnctl check <имя-программы-из-policy.conf> |
✓ уходит через VPN |
Встроенный urltest sing-box, не самописный скрипт: раз в interval из
policy.conf замеряет задержку до candidates серверов-кандидатов из вашей
подписки и переключается на самый быстрый. Переключение не рвёт уже открытые
соединения; упавший сервер выбывает из гонки автоматически. Параметр
tolerance (мс) не даёт «дёргаться» между серверами с почти одинаковой
скоростью — поэтому в списке серверов текущий сервер иногда не самый верхний,
это нормально, а не баг.
Перед сборкой конфига клиент дополнительно проверяет живые ноды (--probe
по умолчанию): параллельным TCP-пингом до каждой ноды (host:port) отсеивает
мёртвые и упорядочивает пул urltest по измеренной задержке. Поэтому в гонке
участвуют только живые быстрые ноды, а медленный/«Автовыбор»-узел, отвечающий
только через секунду, не выигрывает. Выключить сканирование — --no-probe
(или PROBE=0 в env для vpnctl reload) и --probe-timeout.
Выключить автовыбор и закрепить один сервер вручную: enabled = no в
[auto-select], затем ACTIVE=N в endpoints.txt выбирает нужный по номеру
из render_config.py --check-only.
Например, для оплаты картой: сервис (ChatGPT и пр.) сверяет страну карты со
страной IP, поэтому на время оплаты удобно ограничить выезд одной-двумя
странами. В [auto-select]:
countries = US # только ноды США
countries = US, GB # США и Великобритания
countries = # пусто — фильтр выключен (вариант по умолчанию)Автовыбор (urltest) при этом остаётся включённым — он просто гоняет
только ноды из списка; если живая US-нода одна, urltest деградирует в
закреплённую ноду, а не прыгает на «любую быструю». Фильтр применяется до
всех проб и до сборки обоих конфигов, поэтому TCP/HTTP-пробы, пул urltest
и пул xhttp-нод (через xray) видят только разрешённые страны. Страна
определяется по имени ноды (флаг-эмодзи, «United States», «USA», «US 03»,
«США» и т.п.); ноды с нераспознанной страной под активным фильтром
исключаются (fail-closed — во время оплаты лишние сюрпризы не нужны).
Порядок действий:
-
Проверить заранее, какие ноды попадут под фильтр (не трогая работающий клиент):
python3 /opt/golem-vless/scripts/render_config.py \ --endpoints /etc/golem-vless/endpoints.txt --check-only
(на Windows:
python scripts\render_config.py --endpoints "$env:LOCALAPPDATA\GolemVLESS\config\endpoints.txt" --check-only) -
Вписать
countries = US(илиUS, GB) → применить. -
После оплаты — убрать значение (
countries =) → применить.
Применение: Linux — sudo vpnctl reload; Windows — GolemVpn.ps1 restart.
Тот же режим, но без ручного редактирования файлов — отдельное терминальное окно с мастером (один UAC при запуске):
-
Установить (копирует скрипт + обновлённый
render_config.pyв%LOCALAPPDATA%\GolemVLESS\binи кладёт ярлык на рабочий стол):.\windows\install-country-switch.ps1
(на свежих установках ярлык «VPN страна выхода (оплата)» появляется в папке
Golem VPN Windowsуже изInstall-GolemVless.ps1). -
Запустить ярлык → мастер показывает текущий фильтр и ведёт по шагам: выбор страны (US/GB/US+GB/своя) → список нод под фильтром со временем отклика каждой → подтверждение →
countries = …вpolicy.confи перезапуск клиента (прогресс в этом же окне). -
Окно «замирает»: можно заниматься делом (клиент уже в нужной стране).
-
По [Enter] мастер возвращает прежний режим (
countries =), перезапускает клиент и закрывается. Даже если закрыть окно черезqили оно завершится неожиданно, watchdog автоматически снимет временный фильтр через 30 минут (время можно поменять параметром-DurationMinutes, от 5 до 240).
Параметр командной строки для быстрого запуска: CountrySwitch.ps1 US
(пропускает вопрос о стране). Ноды со временем отклика берутся из временного
рендера с --probe-out — работающий клиент не затрагивается.
countries = US оставляет в гонке 1–2 ноды; добавление GB даёт
запасной вариант. И страна IP — лишь один из сигналов антифрода Stripe:
адрес биллинга карты и отпечаток браузера тоже участвуют, так что совпадение
«US-карта + US-IP» правильно, но саму решимость платежа гарантирует только
сам эквайер.
На Linux install.sh ставит systemd-таймер golem-vless-stats.timer, который
каждые 30 минут собирает данные (golem-vless-stats.service, oneshot):
TCP-пинг и HTTP-проверку каждой ноды, фиксирует появления/исчезновения нод и
текущий выбор клиента. Журнал append-only событий лежит в
$STATE/stats/events-YYYY-MM.jsonl (со снимком нод nodes.json).
render_config.py записывает телеметрию и при каждой обычной сборке конфига.
| Система | Собрать + сводка | Только сводка |
|---|---|---|
| Linux | vpnctl stats |
vpnctl report |
| Windows | GolemVpn.ps1 stats |
GolemVpn.ps1 report |
Ещё вариант на Linux:
python3 scripts/stats.py report --state-dir /var/lib/golem-vless --months 1Сводка показывает таблицы: провайдеры (общая доступность, средний пинг, рождаемость/смертность нод), время жизни каждой ноды, страны и динамику по месяцам — какой провайдер реально стабильнее, а не кажется.
Задача GolemVLESS-Watchdog запускается раз в 5 минут. Она проверяет, что
sing-box (и xray, если он нужен текущему пулу) запущены, а запрос через
локальный VPN-прокси получает HTTP 204. Разовая ошибка не вызывает перезапуск:
счётчик должен дойти до 3 подряд, чтобы избежать ненужных разрывов из-за
краткого сбоя сети.
& "$env:LOCALAPPDATA\GolemVLESS\bin\GolemVpn.ps1" watchdog
& "$env:LOCALAPPDATA\GolemVLESS\bin\GolemVpn.ps1" statusstatus показывает последний запуск watchdog, серию сбоев, число проверок,
перезапусков и смен ноды в сохранённом журнале, а также почему сформирован
именно текущий пул нод. Файл истории: %LOCALAPPDATA%\GolemVLESS\state\watchdog-events.jsonl.
У urltest конкретный победитель выбирается внутри sing-box и может меняться
без перезапуска; поэтому статус честно показывает режим и число кандидатов, а
не выдаёт стартовую ноду рендера за фактический live-выход.
Для безопасной отладки используется такой цикл: включить Durev/Happ и передать результат диагностических команд; затем выключить внешний VPN, дождаться, что Golem preflight разрешит запуск, запустить Golem и проверить соединение. Если соединения нет — остановить только Golem, вернуть внешний VPN и сообщить результат. Golem не пытается сам переключать эти два режима.
Ярлыки управления держат окно открытым после команды, включая ошибку. stop
явно проверяет, что локальный порт Golem 127.0.0.1:2080 закрыт; он не ищет
и не завершает процессы Durev/Happ по общему имени движка.
Особого случая: сервер на Linux, ноутбук на Windows. Ярлыки на рабочем столе,
которые дёргают ssh + vpnctl на сервере, не открывая терминал.
cd 'путь\до\vpn-client\desktop'
powershell -ExecutionPolicy Bypass -File install-shortcuts.ps1Создаст на рабочем столе папку VPN Dell с ярлыками: включить, выключить,
статус, быстрейший сервер, список серверов, перезапустить, применить
настройки, телеметрия, сводка. Перед использованием откройте vpn.ps1 и
поправьте $DellHost и $KeyPath под свой сервер и SSH-ключ. Повторный
запуск установщика безопасен (перезаписывает те же файлы).
Режим проверяет подписку, запуск sing-box и прокси поверх включённого Durev, не создавая TUN на хосте. Это не тест маршрутизации приложений хоста, но позволяет отладить ноды без потери соединения. Однократно включите компонент Sandbox (потребуется перезагрузка):
Enable-WindowsOptionalFeature -Online -FeatureName Containers-DisposableClientVM -AllПосле перезагрузки, с включённым Durev:
.\windows\sandbox\Prepare-Sandbox.ps1
Start-Process "$env:LOCALAPPDATA\GolemVLESS\sandbox\Golem-VPN-Test.wsb"Результат после закрытия Sandbox:
Get-Content "$env:LOCALAPPDATA\GolemVLESS\sandbox\results\report.txt"Симптом: ссылка подписки открывается в браузере, но
render_config.py --fetch виснет и падает по таймауту на TLS-рукопожатии
(TCP до :443 проходит, дальше тишина). Это блокировка по SNI: браузер
скрывает имя домена через ECH, а curl/Python — нет. Обход без VPN (иначе
курица и яйцо):
- открыть ссылку подписки в браузере;
- скопировать тело ответа — обычно один base64-блок;
- вставить его в
endpoints.txtвместо строки со ссылкой (саму ссылку закомментировать#, не удалять — пригодится для обновления вручную).
Рендерер понимает вставленный base64-блок так же, как скачанный, — --fetch
для такой строки не нужен.
Конфиг рендерится в формат DNS-серверов и inbound-полей sing-box 1.12+; на sing-box 1.11 конфиг упадёт с «legacy DNS servers is deprecated». Установщик ставит 1.13.16; при ручном обновлении следите за версией.
Ноды многих подписок (в т.ч. основные ноды Durev) используют транспорт
xhttp (type=xhttp, :8443, mode=stream-one). sing-box не
реализует xhttp/splithttp вообще — но клиент такие ноды не отбрасывает
(B-011): они идут через отдельно запускаемый xray-core, который эту связку
понимает нативно (та же схема, что у официального приложения Durev). Признак
того, что это работает: state\xray-config.json существует, и
vpnctl status/GolemVpn.ps1 status показывают xray-core PID .... Если
xray не установлен (скачивание не удалось при установке) — рендерер тихо
предупреждает и не включает такие ноды в пул, но не падает; поставьте бинарник
вручную в bin\xray.exe (Windows) / поставить xray в PATH (Linux) или
перезапустите установку.
Проверьте sing-box version → секция Tags должна содержать with_gvisor.
Стек TUN в конфиге всегда gvisor (задаётся в коде рендерера, не
настраивается через policy.conf) — со стеком system на некоторых
ядрах/ВМ TUN оказывается полностью мёртв: пакеты доходят до интерфейса
(счётчики RX/TX растут), но ни одно соединение не устанавливается — ни через
VPN, ни напрямую, — и это выглядит как «сломался только прямой доступ», хотя
сломан весь datapath. Ошибок в логе при этом нет. Если кто-то менял
tun_stack в render_config.py вручную — верните gvisor.
На Linux правила [processes-via-vpn] работают только благодаря capability в
systemd-юните: CAP_DAC_READ_SEARCH + CAP_SYS_PTRACE. sing-box определяет
программу, читая /proc чужого процесса — без этих прав он молча не находит
процесс (в логе никакой ошибки не будет) и просто не применяет правило.
Если юнит переустанавливали руками или урезали capability — проверьте после
этого vpnctl check <имя>. (На Windows process-matching работает через сам
sing-box, дополнительных прав не нужно.)
process_name matching в sing-box смотрит на имя исполняемого файла. Все
Node-приложения запускаются как node, все Python — как python3. Если
вписать в [processes-via-vpn] голое имя интерпретатора — через VPN уйдут
все программы на этом языке, а не одна нужная. Используйте полный путь
(process_path, вторая форма записи в policy.conf): на Linux —
readlink -f $(command -v claude), на Windows — абсолютный путь к .exe.
sudo bash scripts/uninstall.sh # оставляет policy.conf и endpoints.txt
sudo bash scripts/uninstall.sh --purge # удаляет вообще всё, включая ключСкрипт снимает и systemd-таймер телеметрии golem-vless-stats.timer.
& "$env:LOCALAPPDATA\GolemVLESS\bin\GolemVpn.ps1" uninstallПодтвердите удаление — команда снимет задачи GolemVLESS,
GolemVLESS-Watchdog, GolemVLESS-Refresh, убьёт sing-box/xray, выключит
системный прокси, удалит ярлыки «Golem VPN Windows» и весь каталог
%LOCALAPPDATA%\GolemVLESS.
secrets/endpoints.txt,/etc/golem-vless/endpoints.txt,%LOCALAPPDATA%\GolemVLESS\config\endpoints.txt— секреты, не коммитить (защищены.gitignore), права0600на Linux.- Не убирайте
CAP_DAC_READ_SEARCH/CAP_SYS_PTRACEиз systemd-юнита, не проверив после этогоvpnctl check— молча сломается маршрутизация по программам (см. «Частые проблемы» выше). - После первого включения на удалённом сервере проверяйте доступ новой SSH-сессией, не текущей.
[domains-direct]вpolicy.conf— держите там банки и госуслуги: трафик к ним через чужой сервер — лишний риск блокировки/фрода-фильтров.- Запасной вход по паролю (B-016): логин/пароль хранится в
secrets/server-access.txt(в.gitignore), применяетсяscripts/enable-password-login.sh. Парольный SSH разрешён только из локальной сети (Match Address 192.168.88.0/24в концеsshd_config); извне — лишь ключевой вход. Консоль с монитора/клавиатуры доступна всегда.
Проект распространяется под лицензией MIT.
vpn-client/
docs/
backlog.yaml ← бэклог идей/задач (машиночитаемый YAML, см. шапку файла)
policy.conf ← ЕДИНСТВЕННЫЙ файл, который обычно нужно править
secrets/
endpoints.txt ← ваш ключ (gitignore, создаётся из example при install.sh)
endpoints.example.txt ← шаблон
server-access.txt ← запасной логин/пароль сервера (в .gitignore, B-016)
server-access.txt.example ← шаблон
scripts/
install.sh ← установка на Linux (мультидистрибутивная)
uninstall.sh ← удаление с Linux
vpnctl ← команда управления Linux (ставится в /usr/local/bin)
render_config.py ← policy.conf + endpoints.txt → generated/config.json (общий движок)
stats.py ← телеметрия качества нод (B-015)
enable-password-login.sh ← запасной вход по паролю: консоль + SSH только из LAN (B-016)
systemd/
golem-vless-client.service ← systemd-юнит (capabilities для TUN и process-routing)
golem-vless-stats.timer ← телеметрия каждые 30 минут (B-015)
golem-vless-stats.service ← oneshot-сбор телеметрии
windows/
Install-GolemVless.ps1 ← установка на Windows (TUN-клиент)
GolemVpn.ps1 ← команда управления Windows
Run-GolemVless.ps1 ← лаунчер (вызывается задачей/ярлыком)
Watch-GolemVless.ps1 ← watchdog (каждые 5 минут)
Refresh-Subscription.ps1 ← ежедневное обновление подписки
Run-Hidden.vbs ← скрытый запуск задач без консольного окна
desktop/ ← опционально: ярлыки для управления сервером Dell
vpn.ps1
install-shortcuts.ps1
generated/ ← артефакты рендера (gitignore, пересоздаётся)