Skip to content

feat: принять вклад форка в howdeploy/dev - #24

Merged
Ap3x0s merged 17 commits into
howdeploy:devfrom
Ap3x0s:main
Sep 19, 2026
Merged

Ap3x0s merged 17 commits into
howdeploy:devfrom
Ap3x0s:main

Conversation

@Ap3x0s

@Ap3x0s Ap3x0s commented Sep 16, 2026 •

Copy link
Copy Markdown
Collaborator

Цель

Принять актуальный вклад форка Ap3x0s в howdeploy/dev, сохранив Bash hardening, Electron GUI, CLI-команды, тесты и синхронизированную документацию. После этого будет подготовлен отдельный promotion PR из dev в main.

Что добавлено относительно старого howdeploy/main

Bash/Xray runtime

  • обновлённый installer/update/uninstall lifecycle с IPv6-aware DNS, UFW ownership manifest, SSH-port safety, certbot/IP-TLS и nginx rollback;
  • multi-route HAPP quickstart с schema-v3 профилем и семью маршрутами, включая xhttp-legacy;
  • CLI для профилей, fingerprint, SNI, port и bypass, с JSON-clean stdout для GUI;
  • backup/validation/rollback paths, миграции, cascade, self-steal и routing hardening;
  • геоданные сервера (country/city/flag/OS) и корректный subscription_url.

Electron Desktop GUI

  • активный Electron + React + TypeScript GUI в src/;
  • Dashboard, guided deployment, Server Keys и Server Settings;
  • SSH password/private-key authentication, direct root/sudo, TOFU host-key pinning;
  • управление профилями, fingerprint/SNI/port, QR и подписками;
  • multilingual renderer: RU/EN/ZH;
  • PySide6 клиент отделён в gui-legacy/ как legacy-приложение.

Документация и CI

  • README и техническая документация синхронизированы на английском, русском и китайском языках;
  • добавлен reference docs/desktop-gui.md и его переводы;
  • исправлены stale claims по ownership, UFW, OS prerequisites, fingerprint semantics, HAPP, lifecycle update paths, uninstall и CI;
  • зафиксированы 24 Bash validation-теста и 9 Electron unit-файлов;
  • разделены Electron release workflow, legacy GUI workflow и Bash CI.

Проверки

  • bash -n xrayebator install.sh update.sh uninstall.sh — PASS;
  • все 24 validation/test-*.sh — PASS (0 failures; известные warnings об отсутствующем rg и тестовом lock path не влияют на результат);
  • npm run typecheck — PASS;
  • npm run build — PASS;
  • npm test — 38/39 на Windows; единственный platform-specific failure — POSIX /bin/sh в tests/unit/shell-command.test.ts; Linux CI является источником истины;
  • git diff --check — PASS;
  • stale-claim scan (config_url, old xray test, old test count, stale xray:xray, fork install URLs) — без совпадений.

Scope

Этот PR — только Ap3x0s/main → howdeploy/dev. Сторонние PR #22 и #23 не включены. После проверки и принятия этого PR продвижение howdeploy/dev → howdeploy/main будет отдельным reviewable PR; автоматического merge в main в рамках этого PR нет.

Runtime follow-ups

Аудит выявил отдельные hardening-направления в lifecycle paths (например, exact-backup coverage quickstart/update и более строгая ownership-транзакция nginx uninstall). Они не маскируются документацией и не смешаны с этим integration/documentation PR.

Ap3x0s added 16 commits August 16, 2026 04:26
…ort-change/bypass), перевод на форк Ap3x0s, синхронизация документации, исправления CI
Синхронизация main с dev: влит PR howdeploy#18 и последующий харднинг SSH-доступа из upstream/dev (shell-command, ssh-access, SshAccessForm, vless + unit-тесты). Содержимое main после мержа побайтово равно dev.
mktemp даёт имя config.json.tmp.XXXXXX, а Xray определяет формат конфига по
последнему расширению файла — там случайный суффикс, не json. Ядро отвечает
«Failed to get format», grep не находит «Configuration OK.», и шаг 6 падает с
кодом 1 на ЛЮБОЙ чистой установке. Проверено на живом сервере: те же байты с
расширением .json проходят, без — нет; поведение одинаково на 25.9.5 и 26.3.27,
то есть это не регрессия нового ядра.

Флаг -format json работает на обоих ядрах и уже является соглашением проекта:
xrayebator → safe_restart_xray (строка 1670) вызывает так же.

Затрагивает только dev: блок предварительной валидации внесён c52d863
(«close dev-to-main readiness blockers», 2026-08-11) и отсутствует в main.
Deployer при коде != 0 брал только stderr. Но install.sh печатает статус и все
«✗ …» в stdout, а в stderr попадает шум: прогресс-бар curl и
«TERM environment variable not set.» от clear(). В итоге вместо
«config.json не прошёл валидацию» пользователь видел бар на 100% и не мог
понять причину.

extractInstallFailure() снимает ANSI, ищет последнюю строку с «✗» в
объединённых stdout+stderr, иначе берёт хвост вывода. Путь quickstart так уже
делал — теперь оба согласованы.
Синхронизация main с dev поверх фикса установки.

В dev: 98eac09 (валидация временного config.json с -format json) и
d3a55a8 (GUI показывает настоящую причину провала install.sh).
Содержимое main после мержа побайтово равно dev.
@Ap3x0s Ap3x0s changed the title fix: repair installer config validation and GUI error reporting feat: ??????? ?????????? ????? ????? ? howdeploy/dev Sep 19, 2026
@Ap3x0s Ap3x0s changed the title feat: ??????? ?????????? ????? ????? ? howdeploy/dev feat: принять вклад форка в howdeploy/dev Sep 19, 2026
@Ap3x0s
Ap3x0s merged commit 42908e0 into howdeploy:dev Sep 19, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant