diff --git a/README.md b/README.md index b5bba6b..17dc410 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,9 @@ apt-get update apt-get install -y sudo ca-certificates curl iproute2 tar openssl nftables systemd ``` -`sudo` является обязательной зависимостью target-хоста. Он используется не для интерактивной установки, а для smoke-проверок прав доступа от имени runtime-пользователей. +`sudo` используется для smoke-проверок прав доступа от имени runtime-пользователей и автоматически устанавливается на шаге deps в install-flow. -`sudo` должен быть установлен до запуска `./install.sh`: preflight проверяет его до шага `installDeps`, поэтому deps-стадия не является bootstrap-слоем для `sudo`. +Предварительная ручная установка `sudo` перед `./install.sh` не требуется: preflight допускает его отсутствие на clean-host и install deps bootstrap'ит его до smoke-проверок. ```sh ./install.sh --non-interactive diff --git a/docs/12-operations-and-troubleshooting.md b/docs/12-operations-and-troubleshooting.md index 66e4ecf..d704a13 100644 --- a/docs/12-operations-and-troubleshooting.md +++ b/docs/12-operations-and-troubleshooting.md @@ -8,14 +8,14 @@ ### 0. Target prerequisites обязательны -На target-хосте до запуска install должны быть доступны системные зависимости: +На target-хосте install-flow сам обеспечивает системные зависимости (deps stage): ```bash apt-get update apt-get install -y sudo ca-certificates curl iproute2 tar openssl nftables systemd ``` -`sudo` обязателен: используется smoke-проверками прав от имени runtime-пользователей (`hysteria`, `hy2xs-admin`). +`sudo` обязателен для smoke-проверок прав от имени runtime-пользователей (`hysteria`, `hy2xs-admin`), но его не нужно ставить вручную заранее: на clean-host он устанавливается на deps-стадии до smoke. ### 1. Builder и target — разные миры Если нужно изменить состав install package, это делается в локальном builder layer, а не на target server. diff --git a/docs/13-production-runbook.md b/docs/13-production-runbook.md index feb4a9d..ee36f7a 100644 --- a/docs/13-production-runbook.md +++ b/docs/13-production-runbook.md @@ -15,7 +15,7 @@ apt-get install -y sudo ca-certificates curl iproute2 tar openssl nftables syste `sudo` обязателен для permission smoke-checks от имени runtime-пользователей. -`sudo` должен быть установлен до запуска `./install.sh`: preflight проверяет его до шага установки зависимостей. +Предварительная ручная установка `sudo` до запуска `./install.sh` не требуется: на clean-host install-flow ставит его на стадии deps до выполнения smoke-checks. ## 3. Required open ports diff --git a/orchestrator/src/config/env.ts b/orchestrator/src/config/env.ts index 2392753..34e45ab 100644 --- a/orchestrator/src/config/env.ts +++ b/orchestrator/src/config/env.ts @@ -208,7 +208,7 @@ export function parseRuntimeEnv(content: string): RuntimeConfig { adminUser: requireValue("HY2XS_ADMIN_USER", env.HY2XS_ADMIN_USER || "admin"), adminInitialPassword: valueOrGenerate(env.HY2XS_ADMIN_INITIAL_PASSWORD), adminConPass: requireValue("HY2XS_ADMIN_CON_PASS", valueOrGenerate(env.HY2XS_ADMIN_CON_PASS)), - forcePasswordChange: parseBool("HY2XS_FORCE_PASSWORD_CHANGE", env.HY2XS_FORCE_PASSWORD_CHANGE, true), + forcePasswordChange: parseBool("HY2XS_FORCE_PASSWORD_CHANGE", env.HY2XS_FORCE_PASSWORD_CHANGE, false), allowSelfSignedDev: parseBool("HY2XS_ALLOW_SELF_SIGNED_DEV", env.HY2XS_ALLOW_SELF_SIGNED_DEV, false), tlsMode, acmeType, diff --git a/orchestrator/src/lib/fs.ts b/orchestrator/src/lib/fs.ts index d0b7a56..b6b2515 100644 --- a/orchestrator/src/lib/fs.ts +++ b/orchestrator/src/lib/fs.ts @@ -87,5 +87,12 @@ export function renderTemplate(template: string, values: Record 0) { + const unique = [...new Set(unresolved.map((item) => item.replace(/\s+/g, "")))].sort(); + throw new Error(`template render failed: unresolved placeholders: ${unique.join(", ")}`); + } + return rendered; } diff --git a/orchestrator/src/steps/env.ts b/orchestrator/src/steps/env.ts index 9e0aeb6..d01be54 100644 --- a/orchestrator/src/steps/env.ts +++ b/orchestrator/src/steps/env.ts @@ -26,6 +26,7 @@ export async function writePostInstallEnv(context: RuntimeContext): Promise` +- `NODE_ARCHIVE_SHA256=` +- `BUN_ARCHIVE_SHA256=` + ## Frontend memory policy Builder applies a safe default Node.js heap limit for frontend build inside [`bundle_ui()`](lib/package.sh): diff --git a/tools/build/lib/acceptance.sh b/tools/build/lib/acceptance.sh index 51b2079..61b5de7 100644 --- a/tools/build/lib/acceptance.sh +++ b/tools/build/lib/acceptance.sh @@ -15,6 +15,9 @@ run_fix20_acceptance_subset() { log_step "Acceptance: firewall mode defaults in config" grep -q '^HY2XS_FIREWALL_MODE=' "$package_dir/config/hy2xs.env" || fail "acceptance: HY2XS_FIREWALL_MODE missing in runtime config" + log_step "Acceptance: force password change production default" + grep -q '^HY2XS_FORCE_PASSWORD_CHANGE=false$' "$package_dir/config/hy2xs.env" || fail "acceptance: HY2XS_FORCE_PASSWORD_CHANGE must default to false" + log_step "Acceptance: systemd unit production env" grep -q '^Environment=GIN_MODE=release$' "$package_dir/systemd/hy2xs-admin.service" || fail "acceptance: GIN_MODE=release missing" @@ -28,4 +31,8 @@ run_fix20_acceptance_subset() { log_step "Acceptance: smoke auth checks are tokenized" grep -q 'unexpected auth status without machine token' orchestrator/src/steps/smoke.ts || fail "acceptance: missing 403 negative smoke for auth without machine token" grep -q 'hysteria2/auth?access_token=\${context.config.hysteriaTrafficStatsSecret}' orchestrator/src/steps/smoke.ts || fail "acceptance: smoke auth URL is not tokenized" + + log_step "Acceptance: env rendering maps machine token and fails on unresolved placeholders" + grep -q 'HYSTERIA_API_SECRET: context.config.hysteriaTrafficStatsSecret' orchestrator/src/steps/env.ts || fail "acceptance: writePostInstallEnv must pass HYSTERIA_API_SECRET" + grep -q 'template render failed: unresolved placeholders' orchestrator/src/lib/fs.ts || fail "acceptance: renderTemplate must fail on unresolved placeholders" } diff --git a/tools/build/lib/deps.sh b/tools/build/lib/deps.sh index 0f35cfb..59ec613 100644 --- a/tools/build/lib/deps.sh +++ b/tools/build/lib/deps.sh @@ -6,7 +6,7 @@ BUN_REQUIRED="${BUN_REQUIRED:-1.3.13}" NODE_REQUIRED="${NODE_REQUIRED:-20.19.0}" PNPM_REQUIRED="${PNPM_REQUIRED:-9.15.9}" TOOLCHAIN_DIR="${TOOLCHAIN_DIR:-$ROOT_DIR/.toolchain}" -VERIFY_TOOLCHAIN_CHECKSUMS="${VERIFY_TOOLCHAIN_CHECKSUMS:-false}" +VERIFY_TOOLCHAIN_CHECKSUMS="${VERIFY_TOOLCHAIN_CHECKSUMS:-true}" GO_ARCHIVE_SHA256="${GO_ARCHIVE_SHA256:-}" NODE_ARCHIVE_SHA256="${NODE_ARCHIVE_SHA256:-}" BUN_ARCHIVE_SHA256="${BUN_ARCHIVE_SHA256:-}"