Files
HY2XS_flamy/fix1.txt
T

705 lines
32 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Ты работаешь с проектом 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:<ui_port>/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:<port>
- HY2XS admin должен слушать только IPv4 bind host:
127.0.0.1:<ui_port> по умолчанию.
- Не использовать [::], ::, 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:<port>
или другой явно заданный 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:<ui_port>, а не 0.0.0.0:<ui_port>.
- 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 <candidate>
- Сделать 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.