Добавил policy HY2XS_DNS_AAAA_POLICY и управляемое AAAA-поведение в preflight
This commit is contained in:
@@ -120,6 +120,14 @@ curl -sS \
|
|||||||
- auth material
|
- auth material
|
||||||
- что используется совместимый клиентский конфиг
|
- что используется совместимый клиентский конфиг
|
||||||
|
|
||||||
|
### Install/reconfigure падает на DNS AAAA
|
||||||
|
Проверить значение `HY2XS_DNS_AAAA_POLICY` в `/etc/hy2xs/hy2xs.env`:
|
||||||
|
- `strict` (default): AAAA приводит к fail в IPv4-only профиле;
|
||||||
|
- `warn`: warning + продолжение;
|
||||||
|
- `off`: AAAA-check отключён.
|
||||||
|
|
||||||
|
Для production baseline рекомендуется `strict`.
|
||||||
|
|
||||||
### Скорость не соответствует ожиданиям
|
### Скорость не соответствует ожиданиям
|
||||||
Проверить:
|
Проверить:
|
||||||
- `bandwidth.*` на сервере
|
- `bandwidth.*` на сервере
|
||||||
|
|||||||
@@ -82,6 +82,10 @@ hy2xs-orchestrator reconfigure --package-dir /usr/local/lib/hy2xs/package --conf
|
|||||||
|
|
||||||
- HY2XS работает в IPv4-only режиме.
|
- HY2XS работает в IPv4-only режиме.
|
||||||
- если IPv6 включён на хосте/провайдере — это вне baseline и должно быть отдельно управляемо оператором.
|
- если IPv6 включён на хосте/провайдере — это вне baseline и должно быть отдельно управляемо оператором.
|
||||||
|
- `HY2XS_DNS_AAAA_POLICY` управляет реакцией preflight на DNS AAAA:
|
||||||
|
- `strict` (default) — install/reconfigure прекращается при наличии AAAA;
|
||||||
|
- `warn` — выводится warning и выполнение продолжается;
|
||||||
|
- `off` — AAAA-проверка игнорируется.
|
||||||
|
|
||||||
## 12. Validation command
|
## 12. Validation command
|
||||||
|
|
||||||
|
|||||||
@@ -127,6 +127,14 @@ function normalizeAcmeType(value: string): "http" | "tls" | "dns" {
|
|||||||
throw new Error(`invalid HY2XS_ACME_TYPE: ${value}`);
|
throw new Error(`invalid HY2XS_ACME_TYPE: ${value}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeDnsAaaaPolicy(value: string | undefined): "strict" | "warn" | "off" {
|
||||||
|
const policy = value || "strict";
|
||||||
|
if (policy === "strict" || policy === "warn" || policy === "off") {
|
||||||
|
return policy;
|
||||||
|
}
|
||||||
|
throw new Error(`invalid HY2XS_DNS_AAAA_POLICY: ${value}`);
|
||||||
|
}
|
||||||
|
|
||||||
function normalizeFixedHysteriaAuthMode(value: string | undefined): "http" {
|
function normalizeFixedHysteriaAuthMode(value: string | undefined): "http" {
|
||||||
const mode = value || "http";
|
const mode = value || "http";
|
||||||
if (mode !== "http") {
|
if (mode !== "http") {
|
||||||
@@ -180,12 +188,14 @@ export function parseRuntimeEnv(content: string): RuntimeConfig {
|
|||||||
const trafficStatsPort = parsePort("HY2XS_HYSTERIA_TRAFFIC_STATS_PORT", env.HY2XS_HYSTERIA_TRAFFIC_STATS_PORT, 36712);
|
const trafficStatsPort = parsePort("HY2XS_HYSTERIA_TRAFFIC_STATS_PORT", env.HY2XS_HYSTERIA_TRAFFIC_STATS_PORT, 36712);
|
||||||
const tlsMode = normalizeTlsMode(env.HY2XS_TLS_MODE || "acme");
|
const tlsMode = normalizeTlsMode(env.HY2XS_TLS_MODE || "acme");
|
||||||
const acmeType = normalizeAcmeType(env.HY2XS_ACME_TYPE || "http");
|
const acmeType = normalizeAcmeType(env.HY2XS_ACME_TYPE || "http");
|
||||||
|
const dnsAaaaPolicy = normalizeDnsAaaaPolicy(env.HY2XS_DNS_AAAA_POLICY);
|
||||||
const firewallMode = normalizeFirewallMode(env);
|
const firewallMode = normalizeFirewallMode(env);
|
||||||
const hysteriaAuthMode = normalizeFixedHysteriaAuthMode(env.HY2XS_HYSTERIA_AUTH_MODE);
|
const hysteriaAuthMode = normalizeFixedHysteriaAuthMode(env.HY2XS_HYSTERIA_AUTH_MODE);
|
||||||
const hysteriaObfsType = normalizeFixedHysteriaObfsType(env.HY2XS_HYSTERIA_OBFS_TYPE);
|
const hysteriaObfsType = normalizeFixedHysteriaObfsType(env.HY2XS_HYSTERIA_OBFS_TYPE);
|
||||||
|
|
||||||
const config: RuntimeConfig = {
|
const config: RuntimeConfig = {
|
||||||
domain: env.HY2XS_DOMAIN || "",
|
domain: env.HY2XS_DOMAIN || "",
|
||||||
|
dnsAaaaPolicy,
|
||||||
publicHost: normalizePublicHost(env.HY2XS_PUBLIC_HOST || env.HY2XS_DOMAIN || ""),
|
publicHost: normalizePublicHost(env.HY2XS_PUBLIC_HOST || env.HY2XS_DOMAIN || ""),
|
||||||
publicPort: parsePort("HY2XS_PUBLIC_PORT", env.HY2XS_PUBLIC_PORT, hysteriaPort),
|
publicPort: parsePort("HY2XS_PUBLIC_PORT", env.HY2XS_PUBLIC_PORT, hysteriaPort),
|
||||||
ipv6Enabled: parseBool("HY2XS_IPV6_ENABLED", env.HY2XS_IPV6_ENABLED, false),
|
ipv6Enabled: parseBool("HY2XS_IPV6_ENABLED", env.HY2XS_IPV6_ENABLED, false),
|
||||||
@@ -289,6 +299,7 @@ export function renderRuntimeEnv(config: RuntimeConfig): string {
|
|||||||
"# HY2XS runtime config (editable)",
|
"# HY2XS runtime config (editable)",
|
||||||
"HY2XS_IPV6_ENABLED=false",
|
"HY2XS_IPV6_ENABLED=false",
|
||||||
`HY2XS_DOMAIN=${config.domain}`,
|
`HY2XS_DOMAIN=${config.domain}`,
|
||||||
|
`HY2XS_DNS_AAAA_POLICY=${config.dnsAaaaPolicy}`,
|
||||||
`HY2XS_PUBLIC_HOST=${config.publicHost}`,
|
`HY2XS_PUBLIC_HOST=${config.publicHost}`,
|
||||||
`HY2XS_PUBLIC_PORT=${config.publicPort}`,
|
`HY2XS_PUBLIC_PORT=${config.publicPort}`,
|
||||||
`HY2XS_SSH_PORT=${config.sshPort}`,
|
`HY2XS_SSH_PORT=${config.sshPort}`,
|
||||||
|
|||||||
@@ -143,9 +143,16 @@ export async function preflight(context: RuntimeContext): Promise<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (aaaa.length > 0) {
|
if (aaaa.length > 0) {
|
||||||
fail(
|
if (context.config.dnsAaaaPolicy === "strict") {
|
||||||
`domain ${context.config.domain} has DNS AAAA record while HY2XS profile is IPv4-only; remove AAAA record before install`
|
fail(
|
||||||
);
|
`domain ${context.config.domain} has DNS AAAA record while HY2XS profile is IPv4-only; remove AAAA record before install`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (context.config.dnsAaaaPolicy === "warn") {
|
||||||
|
info(
|
||||||
|
`warning: domain ${context.config.domain} has DNS AAAA record while HY2XS profile is IPv4-only; continuing due to HY2XS_DNS_AAAA_POLICY=warn`
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,8 +22,11 @@ export type RunMode = "install" | "reconfigure";
|
|||||||
|
|
||||||
export type TlsMode = "acme" | "file" | "self_signed_dev";
|
export type TlsMode = "acme" | "file" | "self_signed_dev";
|
||||||
|
|
||||||
|
export type DnsAaaaPolicy = "strict" | "warn" | "off";
|
||||||
|
|
||||||
export type RuntimeConfig = {
|
export type RuntimeConfig = {
|
||||||
domain: string;
|
domain: string;
|
||||||
|
dnsAaaaPolicy: DnsAaaaPolicy;
|
||||||
publicHost: string;
|
publicHost: string;
|
||||||
publicPort: number;
|
publicPort: number;
|
||||||
ipv6Enabled: boolean;
|
ipv6Enabled: boolean;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# HY2XS canonical production runtime config (packaged baseline)
|
# HY2XS canonical production runtime config (packaged baseline)
|
||||||
HY2XS_IPV6_ENABLED=false
|
HY2XS_IPV6_ENABLED=false
|
||||||
HY2XS_DOMAIN=uk.api.withen.pro
|
HY2XS_DOMAIN=uk.api.withen.pro
|
||||||
|
HY2XS_DNS_AAAA_POLICY=strict
|
||||||
HY2XS_PUBLIC_HOST=uk.api.withen.pro
|
HY2XS_PUBLIC_HOST=uk.api.withen.pro
|
||||||
HY2XS_PUBLIC_PORT=443
|
HY2XS_PUBLIC_PORT=443
|
||||||
HY2XS_SSH_PORT=22
|
HY2XS_SSH_PORT=22
|
||||||
|
|||||||
Reference in New Issue
Block a user