diff --git a/docs/09-post-install-env.md b/docs/09-post-install-env.md index 06c4cc1..c04b0b1 100644 --- a/docs/09-post-install-env.md +++ b/docs/09-post-install-env.md @@ -118,7 +118,8 @@ - `/etc/hy2xs/bootstrap-admin.secret` создаётся оркестратором только при первичной установке. - На `reconfigure --apply` bootstrap secret не пересоздаётся и не ротируется автоматически. - Изменения `HY2XS_ADMIN_INITIAL_PASSWORD` в runtime env после первичной установки не должны менять фактический пароль admin. -- Изменения `HY2XS_ADMIN_CON_PASS` применяются только через runtime-конфигурацию Hysteria/auth-контур и не переписывают bootstrap snapshot. +- `HY2XS_ADMIN_CON_PASS` используется как bootstrap-значение при первичной установке; после создания admin account изменение этого значения в `/etc/hy2xs/hy2xs.env` не пересоздаёт и не обновляет существующий `con_pass` в SQLite. +- Ротация `con_pass` выполняется через account-management слой UI/БД, а bootstrap snapshot остаётся неизменным. ## Что нельзя делать diff --git a/orchestrator/src/steps/firewall.ts b/orchestrator/src/steps/firewall.ts index 9112b16..e228451 100644 --- a/orchestrator/src/steps/firewall.ts +++ b/orchestrator/src/steps/firewall.ts @@ -54,11 +54,25 @@ export async function applyFirewall(context: RuntimeContext): Promise { await runVisible`cp -a /etc/nftables.conf /etc/nftables.conf.hy2xs.bak 2>/dev/null || true`; await runVisible`cp -a /etc/nftables.d/hy2xs.nft /etc/nftables.d/hy2xs.nft.bak 2>/dev/null || true`; + await runVisible`test -f /etc/nftables.conf && echo 1 > /etc/nftables.d/nftables.conf.existed || rm -f /etc/nftables.d/nftables.conf.existed`; await runVisible`test -f /etc/nftables.d/hy2xs.nft && echo 1 > /etc/nftables.d/hy2xs.nft.existed || rm -f /etc/nftables.d/hy2xs.nft.existed`; await runVisible`grep -q 'include "/etc/nftables.d/hy2xs.nft"' /etc/nftables.conf && echo 1 > /etc/nftables.d/hy2xs.nft.include.existed || rm -f /etc/nftables.d/hy2xs.nft.include.existed`; await writeText("/etc/nftables.d/hy2xs.nft.candidate", rendered, 0o600); await runVisible`nft -c -f /etc/nftables.d/hy2xs.nft.candidate`; + const nftablesConfCandidate = `#!/usr/sbin/nft -f +# HY2XS-MANAGED: root nftables entrypoint +# Generated by hy2xs-orchestrator. Do not edit manually; edit /etc/hy2xs/hy2xs.env and run reconfigure. + +flush ruleset + +include "/etc/nftables.d/hy2xs.nft.candidate" +`; + await writeText("/etc/nftables.conf.candidate", nftablesConfCandidate, 0o644); + await runVisible`nft -c -f /etc/nftables.conf.candidate`; + + await runVisible`mv /etc/nftables.d/hy2xs.nft.candidate /etc/nftables.d/hy2xs.nft`; + const nftablesConf = `#!/usr/sbin/nft -f # HY2XS-MANAGED: root nftables entrypoint # Generated by hy2xs-orchestrator. Do not edit manually; edit /etc/hy2xs/hy2xs.env and run reconfigure. @@ -71,10 +85,9 @@ include "/etc/nftables.d/hy2xs.nft" await runVisible`nft -c -f /etc/nftables.conf`; if (context.config.firewallStagedApply) { - await runVisible`systemd-run --unit hy2xs-fw-rollback --on-active=45s /bin/sh -c 'if [ -f /etc/nftables.conf.hy2xs.bak ]; then cp -a /etc/nftables.conf.hy2xs.bak /etc/nftables.conf 2>/dev/null || true; fi; if [ -f /etc/nftables.d/hy2xs.nft.existed ]; then cp -a /etc/nftables.d/hy2xs.nft.bak /etc/nftables.d/hy2xs.nft 2>/dev/null || true; else rm -f /etc/nftables.d/hy2xs.nft; fi; nft -f /etc/nftables.conf >/dev/null 2>&1 || true'`; + await runVisible`systemd-run --unit hy2xs-fw-rollback --on-active=45s /bin/sh -c 'if [ -f /etc/nftables.d/nftables.conf.existed ]; then cp -a /etc/nftables.conf.hy2xs.bak /etc/nftables.conf 2>/dev/null || true; else rm -f /etc/nftables.conf; fi; if [ -f /etc/nftables.d/hy2xs.nft.existed ]; then cp -a /etc/nftables.d/hy2xs.nft.bak /etc/nftables.d/hy2xs.nft 2>/dev/null || true; else rm -f /etc/nftables.d/hy2xs.nft; fi; nft -f /etc/nftables.conf >/dev/null 2>&1 || true'`; } - await runVisible`mv /etc/nftables.d/hy2xs.nft.candidate /etc/nftables.d/hy2xs.nft`; await runVisible`nft -f /etc/nftables.conf`; await runVisible`systemctl enable --now nftables`; @@ -85,5 +98,5 @@ include "/etc/nftables.d/hy2xs.nft" await runVisible`systemctl reset-failed hy2xs-fw-rollback || true`; } - await runVisible`rm -f /etc/nftables.conf.hy2xs.bak /etc/nftables.d/hy2xs.nft.bak /etc/nftables.d/hy2xs.nft.existed /etc/nftables.d/hy2xs.nft.include.existed`; + await runVisible`rm -f /etc/nftables.conf.hy2xs.bak /etc/nftables.conf.candidate /etc/nftables.d/hy2xs.nft.bak /etc/nftables.d/hy2xs.nft.candidate /etc/nftables.d/hy2xs.nft.existed /etc/nftables.d/hy2xs.nft.include.existed /etc/nftables.d/nftables.conf.existed`; }