diff --git a/fix1.txt b/fix1.txt deleted file mode 100644 index d7f0091..0000000 --- a/fix1.txt +++ /dev/null @@ -1,705 +0,0 @@ -Ты работаешь с проектом HY2XS_flamy / HY2XS. - -Контекст проекта: -HY2XS — это production installer/orchestrator для установки Hysteria2 + встроенной HY2XS admin panel на Debian 12 VPS. Оркестратор написан на Bun + TypeScript, admin panel является fork/refactor h-ui и собирается заранее, на target-сервере сборки быть не должно. Hysteria2 должен оставаться upstream vanilla binary. Проект не должен превращаться в Telegram-бота, CRM или generic server manager. Это узкий installer/runtime manager для Hysteria2 + HY2XS admin. - -Главная задача: -Провести production-hardening pass без костылей и без legacy. Исправить код, шаблоны, systemd, firewall, env/config layer, документацию и acceptance checks так, чтобы проект соответствовал официальным подходам Hysteria2/systemd и собственным docs проекта. - -ВАЖНО: -- Не делай косметические правки вместо архитектурных. -- Не добавляй временные обходы. -- Не оставляй legacy h-ui функциональность, если она не входит в scope HY2XS. -- Не меняй архитектуру на “собирать на target-сервере”. -- Не форкай Hysteria2. -- Не делай IPv6 support. В этом проекте серверы только IPv4. IPv6 должен быть явно out of scope. -- Все bind/listen должны быть IPv4-only. -- Все секреты должны быть chmod 600/root-only или доступны только нужному сервисному пользователю. -- После правок обнови документацию, примеры и acceptance criteria. - -Перед правками: -1. Изучи текущую структуру проекта: - - README.md - - docs/*.md - - hy2xs_implementation_plan-no_git/*.txt - - orchestrator/src/** - - package/templates/** - - package/systemd/** - - package/examples/** - - apps/** - - apps/frontend/** - - tools/build/** -2. Сверь спорные места с официальными docs: - - Hysteria2 server config - - Hysteria2 ACME/TLS - - Hysteria2 HTTP auth - - Hysteria2 trafficStats API - - Hysteria2 install script behavior - - systemd hardening options - - nftables safe apply practices - - Bun standalone compile behavior -3. Найди рассинхроны между docs и реализацией. -4. Исправь реализацию под production, а не просто подгони docs под текущий код. - -Ключевые проблемы, которые нужно исправить: - -1. Реализовать нормальный env/config layer - -Сейчас /etc/hysteria/post-install.env существует как reference-файл, но фактически не является полноценным слоем конфигурации. - -Нужно: -- Ввести единый runtime/deploy env-файл, который оркестратор умеет читать, валидировать и применять. -- Рекомендуемый путь: - - /etc/hy2xs/hy2xs.env как основной editable config layer - - /etc/hysteria/post-install.env как generated deployment snapshot/reference - Либо можно оставить один /etc/hysteria/post-install.env, но только если он реально становится читаемым оркестратором config layer. Предпочтительно разделить editable config и generated snapshot. -- Файл должен иметь права 0600. -- Файл должен содержать основные production-параметры: - - HY2XS_DOMAIN - - HY2XS_PUBLIC_HOST - - HY2XS_PUBLIC_PORT - - HY2XS_IPV6_ENABLED=false - - HY2XS_SSH_PORT - - HY2XS_FIREWALL_ENABLED - - HY2XS_FIREWALL_STAGED_APPLY - - HY2XS_UI_BIND_HOST=127.0.0.1 - - HY2XS_UI_PORT - - HY2XS_ADMIN_USER - - HY2XS_ADMIN_INITIAL_PASSWORD или путь к bootstrap secret file - - HY2XS_FORCE_PASSWORD_CHANGE=true - - HY2XS_TLS_MODE=acme|file|self_signed_dev - - HY2XS_ACME_EMAIL - - HY2XS_TLS_CERT_PATH - - HY2XS_TLS_KEY_PATH - - HY2XS_HYSTERIA_BIND_HOST=0.0.0.0 - - HY2XS_HYSTERIA_PORT=443 - - HY2XS_HYSTERIA_AUTH_MODE=http - - HY2XS_HYSTERIA_AUTH_URL=http://127.0.0.1:/hui/hysteria2/auth - - HY2XS_HYSTERIA_TRAFFIC_STATS_HOST=127.0.0.1 - - HY2XS_HYSTERIA_TRAFFIC_STATS_PORT - - HY2XS_HYSTERIA_TRAFFIC_STATS_SECRET - - HY2XS_HYSTERIA_OBFS_TYPE=salamander - - HY2XS_HYSTERIA_OBFS_PASSWORD - - HY2XS_HYSTERIA_BANDWIDTH_UP - - HY2XS_HYSTERIA_BANDWIDTH_DOWN - - HY2XS_HYSTERIA_IGNORE_CLIENT_BANDWIDTH=false - - HY2XS_HYSTERIA_CONFIG_PATH=/etc/hysteria/config.yaml - - HY2XS_HYSTERIA_VERSION or latest policy - - HY2XS_INSTALL_DIR=/opt/hy2xs-admin - - HY2XS_DATA_DIR=/var/lib/hy2xs-admin - - HY2XS_LOG_DIR=/var/log/hy2xs -- Добавить в orchestrator: - - загрузку env-файла; - - строгую валидацию; - - нормализацию типов; - - запрет несовместимых комбинаций; - - dry-run вывод; - - явную команду reconfigure. -- Изменение env-файла не должно автоматически менять runtime. -- Применение только через явную команду: - - hy2xs-orchestrator install --config /path/to/hy2xs.env - - hy2xs-orchestrator reconfigure --config /etc/hy2xs/hy2xs.env --dry-run - - hy2xs-orchestrator reconfigure --config /etc/hy2xs/hy2xs.env --apply -- Если reconfigure меняет port/listen/firewall/TLS, он должен: - - валидировать новый config; - - сделать backup текущих config/unit/firewall; - - применить staged; - - выполнить smoke-check; - - откатить изменения при провале. - -Файлы для правок: -- orchestrator/src/cli.ts -- orchestrator/src/types/context.ts -- orchestrator/src/commands/install.ts -- добавить orchestrator/src/commands/reconfigure.ts -- добавить orchestrator/src/config/env.ts или похожий модуль -- orchestrator/src/steps/env.ts -- package/templates/env/* -- package/examples/* -- docs/09-post-install-env.md -- docs/08-orchestrator-spec.md -- docs/11-testing-and-acceptance.md - -2. Зафиксировать IPv4-only модель - -Требование: -Проект работает только с IPv4. IPv6 не нужен и не должен случайно включаться. - -Нужно: -- В Hysteria config не использовать listen вида :443. -- Использовать только: - listen: 0.0.0.0: -- HY2XS admin должен слушать только IPv4 bind host: - 127.0.0.1: по умолчанию. -- Не использовать [::], ::, dual-stack listen. -- В docs явно указать: - - IPv6 unsupported/out of scope; - - все публичные входящие соединения идут через IPv4; - - домен должен иметь A-record; - - AAAA-record не используется и не требуется; - - если у домена есть AAAA, оператор должен понимать, что HY2XS его не обслуживает. -- В preflight добавить проверку: - - домен резолвится в IPv4 A-record; - - если есть AAAA, вывести warning, но не включать IPv6; - - public_host/client URL строится только по IPv4-домену/IPv4 endpoint. -- В firewall использовать IPv4-only nftables rules. Не использовать inet table как способ “случайно покрыть IPv6”, если проект IPv4-only. -- Если на сервере IPv6 включен, HY2XS всё равно не должен слушать IPv6. - -Файлы: -- package/templates/hysteria/config.yaml.tpl -- package/templates/nftables/hy2xs.nft.tpl -- orchestrator/src/steps/preflight.ts -- orchestrator/src/steps/config.ts -- orchestrator/src/steps/firewall.ts -- docs/03-server-hysteria2.md -- docs/05-client-and-access-scope.md -- docs/07-systemd-and-firewall.md -- docs/12-operations-and-troubleshooting.md - -3. Исправить Hysteria2 listen/public endpoint split - -Сейчас есть риск, что client URL строится из listen, что неверно. - -Нужно разделить: -- bind_host: 0.0.0.0 -- bind_port: 443 -- public_host: domain or IPv4 -- public_port: 443 - -Hysteria server config использует bind_host/bind_port. -Client URL/subscription использует public_host/public_port. - -Нельзя строить client URL из поля listen. -Нельзя использовать 0.0.0.0 в client URL. - -Проверь и исправь: -- apps/service/hysteria2_api.go -- apps/model/bo/hysteria2.go -- apps/model/bo/hysteria2_api.go -- apps/model/dto/hysteria2.go -- apps/model/vo/hysteria2.go -- все места, где public URL строится через Listen. -- package/templates/hysteria/config.yaml.tpl -- docs. - -Acceptance: -- При listen: 0.0.0.0:443 клиентский URL должен быть hysteria2://password@example.com:443/... -- В URL не должно быть 0.0.0.0. -- При public_port=443 порт можно явно оставить или нормализовать по принятому формату, но поведение должно быть стабильным и протестированным. - -4. Исправить TLS/ACME flow - -Сейчас self-signed сертификат фактически используется как default. Это не production-ready. - -Нужно: -- Добавить TLS modes: - - acme — production default - - file — production для собственного cert/key - - self_signed_dev — только dev/lab, запрещён для non-interactive production без явного флага -- В production default использовать ACME, если задан domain и acme_email. -- Для acme mode Hysteria config должен использовать acme block, а не tls cert/key. -- Для file mode использовать tls.cert/tls.key. -- Для self_signed_dev: - - явно генерировать self-signed cert; - - явно маркировать install как dev/lab; - - client config должен включать insecure только для этого режима. -- Не смешивать acme и tls file в одном config. -- Добавить в env: - - HY2XS_TLS_MODE - - HY2XS_ACME_EMAIL - - HY2XS_TLS_CERT_PATH - - HY2XS_TLS_KEY_PATH -- Проверить, что generated config соответствует официальной схеме Hysteria2. - -Файлы: -- orchestrator/src/steps/config.ts -- package/templates/hysteria/config.yaml.tpl -- package/templates/env/* -- docs/03-server-hysteria2.md -- docs/05-client-and-access-scope.md -- docs/11-testing-and-acceptance.md - -Acceptance: -- acme mode генерирует только acme block. -- file mode генерирует только tls cert/key block. -- self_signed_dev генерирует tls cert/key + client insecure. -- production install без domain/acme_email должен завершиться ошибкой или потребовать явный self_signed_dev. - -5. Исправить TrafficStats API secret - -Сейчас Hysteria config получает HYSTERIA_API_SECRET, но HY2XS admin использует JWT_SECRET для trafficStats API. Это неверно. - -Нужно: -- Ввести отдельную настройку: - HY2XS_HYSTERIA_TRAFFIC_STATS_SECRET -- Один и тот же secret должен использоваться: - - в Hysteria config: - trafficStats.secret - - в HY2XS admin при вызовах: - /traffic - /online - kick user / disconnect if exists -- Не использовать JWT_SECRET для Hysteria API. -- JWT_SECRET должен отвечать только за авторизацию HY2XS admin. -- Добавить smoke-check: - - запрос к trafficStats API с правильным secret проходит; - - запрос с неправильным secret не проходит. -- Обновить docs. - -Файлы: -- apps/service/hysteria2_api.go -- apps/proxy/hysteria2_api.go -- apps/model/constant/config.go -- apps/service/config.go -- orchestrator/src/steps/config.ts -- package/templates/hysteria/config.yaml.tpl -- package/templates/env/* -- docs/03-server-hysteria2.md -- docs/04-admin-panel-h-ui-fork.md -- docs/11-testing-and-acceptance.md - -6. Убрать default admin sysadmin/sysadmin - -Сейчас seed создаёт admin sysadmin/sysadmin. Это production blocker. - -Нужно: -- Убрать дефолтный predictable admin password. -- Во время install генерировать bootstrap admin password. -- Записывать его в root-only файл: - /etc/hy2xs/bootstrap-admin.secret - chmod 600 -- Или выводить один раз в конце установки + сохранять в защищённый файл. -- Admin username должен задаваться через env: - HY2XS_ADMIN_USER -- При первом логине требовать смену пароля: - HY2XS_FORCE_PASSWORD_CHANGE=true -- Не использовать con_pass = admin password. -- con_pass для Hysteria user должен быть отдельным случайным secret. -- Перейти с SHA224 на нормальный password hashing: - - bcrypt или argon2id. -- Сделать backward-compatible migration: - - старые SHA224 пароли распознавать; - - после успешного login перехешировать в новый формат; - - новые пароли сохранять только в новом формате. -- Обновить docs. - -Файлы: -- apps/dao/sqlite.go -- apps/util/encrypt.go -- apps/service/account.go -- apps/model/entity/account.go -- apps/model/dto/account.go -- apps/controller/account.go -- orchestrator/src/commands/install.ts -- orchestrator/src/steps/env.ts -- package/templates/env/* -- docs/04-admin-panel-h-ui-fork.md -- docs/09-post-install-env.md -- docs/11-testing-and-acceptance.md - -Acceptance: -- После fresh install нет sysadmin/sysadmin. -- Login невозможен старым дефолтным паролем. -- Bootstrap password уникален для каждой установки. -- Password hash не является быстрым SHA digest. -- force password change работает. - -7. Исправить UI bind host - -Сейчас CLI имеет --ui-bind-host, systemd передаёт HY2XS_UI_BIND_HOST, но Go server фактически слушает :port на всех интерфейсах. - -Нужно: -- Go server должен читать HY2XS_UI_BIND_HOST. -- Default: 127.0.0.1. -- Addr должен быть: - 127.0.0.1: - или другой явно заданный IPv4. -- Запретить пустой host как bind all. -- Запретить :: и IPv6 bind. -- Если оператор явно задаёт 0.0.0.0, требовать warning/explicit flag, либо запретить в production. -- systemd unit должен передавать HY2XS_UI_BIND_HOST. -- smoke-check должен проверять, что UI не слушает 0.0.0.0, если bind host 127.0.0.1. - -Файлы: -- apps/cmd/server.go -- apps/service/server.go -- package/systemd/hy2xs-admin.service -- orchestrator/src/steps/systemd.ts -- orchestrator/src/steps/smoke.ts -- docs/04-admin-panel-h-ui-fork.md -- docs/07-systemd-and-firewall.md - -Acceptance: -- ss -ltnp показывает 127.0.0.1:, а не 0.0.0.0:. -- UI недоступен с внешнего интерфейса без reverse proxy/tunnel. -- --ui-bind-host реально влияет на bind. - -8. Запускать HY2XS admin не от root - -Сейчас systemd unit не задаёт User/Group, значит admin работает от root. - -Нужно: -- Создать системного пользователя: - hy2xs-admin -- Запускать HY2XS admin от User=hy2xs-admin Group=hy2xs-admin. -- Настроить директории: - - /opt/hy2xs-admin read-only для binary/assets - - /var/lib/hy2xs-admin writable data - - /var/log/hy2xs writable logs -- В systemd добавить hardening: - - NoNewPrivileges=true - - PrivateTmp=true - - ProtectHome=true - - ProtectSystem=strict - - ReadWritePaths=/var/lib/hy2xs-admin /var/log/hy2xs - - RestrictAddressFamilies=AF_INET AF_UNIX - - CapabilityBoundingSet= empty where possible - - AmbientCapabilities= empty where possible -- Если UI должен перезапускать Hysteria или читать privileged files, не запускать весь UI от root. - Вместо этого: - - либо убрать такие операции из UI; - - либо сделать отдельный узкий root helper; - - либо использовать строго ограниченный sudoers/polkit rule. -- Не оставлять широкие root-права. - -Файлы: -- package/systemd/hy2xs-admin.service -- orchestrator/src/steps/filesystem.ts -- orchestrator/src/steps/systemd.ts -- apps/proxy/process.go -- apps/service/hysteria2.go -- apps/service/config.go -- docs/04-admin-panel-h-ui-fork.md -- docs/07-systemd-and-firewall.md - -Acceptance: -- systemctl show hy2xs-admin показывает User=hy2xs-admin. -- Процесс не root. -- UI продолжает работать. -- Нет записи в /etc/hysteria/config.yaml от имени неподходящего процесса без контролируемого helper/reconfigure. - -9. Исправить права /etc/hysteria/config.yaml - -Сейчас orchestrator пишет config chmod 0600, но UI может перезаписать его chmod 0644. - -Нужно: -- Всегда писать /etc/hysteria/config.yaml с правами 0600. -- owner должен быть корректным для Hysteria service. -- Если UI больше не должен напрямую писать config, убрать такую возможность или перенести в orchestrator reconfigure. -- Писать config atomic: - - temporary file - - fsync if needed - - chmod/chown - - rename - - validate - - restart/reload -- Не допускать world-readable secrets. - -Файлы: -- orchestrator/src/steps/config.ts -- apps/service/hysteria2.go -- apps/service/config.go -- docs/03-server-hysteria2.md -- docs/07-systemd-and-firewall.md - -Acceptance: -- stat -c "%a %U %G" /etc/hysteria/config.yaml показывает 600 и ожидаемого owner/group. -- В config есть secrets, но файл не world-readable. -- UI не ослабляет права после сохранения. - -10. Переделать firewall apply на безопасный staged mode - -Сейчас firewall может резко применить policy drop и отрезать SSH. - -Нужно: -- Не перезаписывать слепо весь /etc/nftables.conf без staged rollback. -- Использовать include-файл, например: - /etc/nftables.d/hy2xs.nft -- Перед apply выполнять: - nft -c -f -- Сделать staged apply: - - backup current rules/config - - install rollback timer через systemd-run или эквивалент - - apply candidate - - проверить SSH port rule - - проверить Hysteria UDP port - - проверить UI local bind - - если checks passed — cancel rollback - - если failed — rollback -- IPv4-only: - - table ip hy2xs - - не использовать IPv6 rules как supported path. -- Allow: - - lo - - established/related - - SSH TCP port from IPv4 - - Hysteria UDP port from IPv4 - - optionally ICMP - - UI TCP только с 127.0.0.1 -- Default drop только после staged safety. -- Если --skip-firewall, не открывать UI публично. - -Файлы: -- orchestrator/src/steps/firewall.ts -- package/templates/nftables/hy2xs.nft.tpl -- docs/07-systemd-and-firewall.md -- docs/11-testing-and-acceptance.md - -Acceptance: -- nft -c проходит. -- Неправильный SSH port не применяет irreversible lockout. -- UI не доступен с внешнего интерфейса. -- Hysteria UDP port открыт. -- IPv6 не считается поддерживаемым. - -11. Удалить port hopping legacy - -Docs говорят no port hopping, но code всё ещё инициализирует: -- service.InitTableAndChain() -- service.InitPortHopping() - -Нужно: -- Убрать port hopping из production path. -- Удалить или отключить: - - apps/service/forward.go - - связанные nft/iptables вызовы - - связанные routes/UI элементы - - связанные config fields -- Если удалить полностью нельзя за один pass, закрыть build tag’ом или runtime flag default false, но production binary не должен инициализировать port hopping. -- Не создавать nft table/chain при старте HY2XS admin. -- Обновить docs. - -Файлы: -- apps/cmd/server.go -- apps/service/forward.go -- apps/router/* -- apps/frontend/src/views/* -- docs/04-admin-panel-h-ui-fork.md -- docs/10-access-layer-out-of-scope.md - -Acceptance: -- grep по InitPortHopping не показывает production вызов. -- При старте UI не создаёт nft/iptables rules. -- В UI нет port hopping управления. - -12. Убрать legacy updater/GitHub logic из UI - -HY2XS admin не должен быть updater’ом h-ui/original repo. - -Нужно: -- Найти и удалить legacy code, связанный с: - - original h-ui repo - - GitHub releases - - self-update UI - - update checker - - install/update Hysteria из UI, если это зона orchestrator -- В Go dependency audit: - - github.com/google/go-github/v39 сейчас используется только apps/util/github.go. - - Если self-update/GitHub release logic удаляется, удалить util/github.go и go-github из go.mod/go.sum. -- Не оставлять неиспользуемые функции “на потом”. - -Файлы: -- apps/util/github.go -- apps/go.mod -- apps/go.sum -- apps/controller/config.go -- apps/service/config.go -- frontend config/settings views -- docs/04-admin-panel-h-ui-fork.md -- docs/10-access-layer-out-of-scope.md - -Acceptance: -- go mod tidy удаляет google/go-github, если больше не нужен. -- UI не показывает updater legacy. -- Docs говорят, что update/upgrade — зона orchestrator/package, не admin panel. - -13. Проверить и почистить frontend dependencies - -В apps/frontend/package.json есть вероятные рудименты. - -Проверь фактическое использование и удали неиспользуемое: -- echarts — в текущем коде не найдено использование. -- screenfull — в текущем коде не найдено использование. -- path-to-regexp — в текущем коде не найдено использование. -- fast-glob — в vite.config.ts не используется. -- @types/path-browserify — нужен только если path-browserify остаётся. -- vite-plugin-dynamic-base — используется в vite.config.ts, но проверить, нужен ли HY2XS dynamic base. Если UI всегда от root path, убрать. -- unocss — используется в vite config, но проверить, реально ли есть UnoCSS classes. Если нет — убрать. -- unplugin-icons / @iconify-json/ep — оставить только если реально нужны auto icons. -- vuedraggable — используется в ImputMultiple, оставить если компонент нужен. -- path-browserify — используется в Sidebar/TagsView, оставить или заменить на простую path join utility без browser polyfill. -- @vueuse/core — используется, оставить или заменить точечно, если хочется уменьшить bundle. -- nprogress — используется, оставить. -- copy-to-clipboard — используется, оставить или заменить navigator.clipboard, если поддержка позволяет. - -После удаления: -- обновить pnpm-lock.yaml; -- убедиться, что frontend build проходит; -- удалить сгенерированные auto-import/component d.ts, если они не должны быть в repo, либо обновить их корректно; -- не оставлять импортов на удалённые пакеты. - -Файлы: -- apps/frontend/package.json -- apps/frontend/pnpm-lock.yaml -- apps/frontend/vite.config.ts -- apps/frontend/src/** -- docs/04-admin-panel-h-ui-fork.md - -Acceptance: -- pnpm install --frozen-lockfile проходит. -- pnpm build:prod проходит. -- grep не находит удалённые пакеты в src/vite config. -- UI работает без legacy dependencies. - -14. Исправить Hysteria install flow - -Сейчас installer использует official script через curl/sh и не pin’ит версию. - -Нужно: -- Добавить возможность pin версии: - HY2XS_HYSTERIA_VERSION=vX.Y.Z или latest. -- Если latest — явно записать фактически установленную версию в post-install snapshot. -- Использовать official installer корректно. -- Если используется curl | bash/script, сделать безопаснее: - - скачать script в temp file; - - проверить download success; - - по возможности checksum/signature/version; - - запускать bash, если official docs требуют bash. -- После установки проверить: - - binary exists; - - hysteria version; - - expected service conflict отсутствует или осознанно заменён. -- Если official installer создаёт свой service, HY2XS должен явно документировать и контролировать replacement. - -Файлы: -- orchestrator/src/steps/hysteria.ts -- orchestrator/src/steps/smoke.ts -- docs/02-build-layer-and-package.md -- docs/03-server-hysteria2.md -- docs/08-orchestrator-spec.md - -15. Улучшить smoke/acceptance checks - -Текущий smoke слишком слабый. - -Добавить проверки: -- systemd units active: - - hysteria-server - - hy2xs-admin -- Hysteria UDP port слушает IPv4. -- UI слушает только expected IPv4 bind host. -- UI не слушает 0.0.0.0 при bind 127.0.0.1. -- Auth endpoint отвечает корректно: - - /hui/hysteria2/auth для тестового/существующего пользователя. -- TrafficStats API: - - correct secret works; - - wrong secret denied. -- Hysteria config syntactically valid. -- TLS mode соответствует env: - - acme mode содержит acme и не содержит tls cert/key. - - file mode содержит tls cert/key и не содержит acme. - - self_signed_dev clearly marked. -- Firewall rules installed and nft -c passes. -- File permissions: - - /etc/hy2xs/hy2xs.env 0600 - - /etc/hysteria/post-install.env 0600 - - /etc/hysteria/config.yaml 0600 - - bootstrap-admin.secret 0600 -- No default sysadmin/sysadmin. -- No IPv6 listen: - - ss output must not show [::] for HY2XS/Hysteria. -- No port hopping init. -- Reboot persistence documented or testable. - -Файлы: -- orchestrator/src/steps/smoke.ts -- docs/11-testing-and-acceptance.md -- package/install.sh - -16. Обновить docs и убрать рассинхрон - -Обновить: -- README.md -- docs/01-architecture-baseline.md -- docs/02-build-layer-and-package.md -- docs/03-server-hysteria2.md -- docs/04-admin-panel-h-ui-fork.md -- docs/05-client-and-access-scope.md -- docs/06-speed-limits-and-congestion.md -- docs/07-systemd-and-firewall.md -- docs/08-orchestrator-spec.md -- docs/09-post-install-env.md -- docs/10-access-layer-out-of-scope.md -- docs/11-testing-and-acceptance.md -- docs/12-operations-and-troubleshooting.md -- hy2xs_implementation_plan-no_git/*.txt если они остаются как актуальные документы. - -Docs должны фиксировать: -- HY2XS = Bun/TypeScript orchestrator + bundled HY2XS admin + upstream Hysteria2. -- No Telegram bot. -- No port hopping. -- No target-side build. -- No IPv6 support. -- IPv4-only bind/listen. -- Production TLS default = ACME. -- self-signed only dev/lab. -- env/config layer and reconfigure flow. -- admin panel не updater и не generic server manager. -- admin panel не работает от root. -- firewall staged apply. -- secret/file permission policy. -- acceptance checks. - -Также исправить README: -- Убедиться, что build command указывает реальный путь. -- Если фактический build script tools/build/build.sh, README не должен ссылаться на builder/build.sh. -- Все команды должны соответствовать текущей структуре. - -17. Общие требования к качеству - -После правок выполнить: -- gofmt по Go-коду. -- go mod tidy. -- frontend lockfile update. -- TypeScript check для orchestrator. -- Build orchestrator. -- Build frontend. -- Build Go admin. -- Smoke если возможно в среде. -- grep-проверки: - - нет sysadmin/sysadmin как production seed. - - нет InitPortHopping production вызова. - - нет listen: :{{HYSTERIA_PORT}}. - - нет UI bind ":8080" без host. - - нет JWT_SECRET как Hysteria trafficStats secret. - - нет chmod 0644 для /etc/hysteria/config.yaml. - - нет IPv6 listen [::] / "::" в runtime defaults. - - нет h-ui legacy updater/original repo references, если они вне scope. - -Не делай: -- Не оставляй TODO вместо исправления P0. -- Не добавляй reverse proxy как обязательную часть. -- Не добавляй Docker requirement. -- Не добавляй Telegram/bot features. -- Не добавляй IPv6. -- Не оставляй root admin panel. -- Не делай “если не получилось, chmod 777”. -- Не ослабляй firewall ради прохождения smoke. -- Не используй JWT_SECRET для Hysteria API. -- Не используй 0.0.0.0 в client URL. -- Не делай self-signed production default. - -Ожидаемый результат: -1. Полный diff с исправлением production blockers. -2. Обновлённые docs. -3. Обновлённые templates/examples. -4. Удалённые legacy dependencies/code. -5. Понятный reconfigure/env flow. -6. IPv4-only модель зафиксирована в коде и docs. -7. Расширенные smoke/acceptance checks. -8. Краткий отчёт: - - что исправлено; - - какие файлы изменены; - - какие legacy части удалены; - - какие команды проверки запускались; - - что осталось как tech debt, если что-то невозможно закрыть за один pass. \ No newline at end of file