v1.0.19
Added
- Edge reuses & updates an existing nginx SNI stream splitter. When both nginx
and Apache run and the host already declares amap $ssl_preread_server_name
splitter (located vianginx -T), Edge no longer writes a second, conflicting
stream {}block. It emits only the internal backend vhosts AND merges the
platform's public domains into the existingmapin place — inside a marked,
idempotent sub-block, leaving hand-written entries untouched and never
duplicating a domain. NewStreamConfigWriter;EDGE_REUSE_STREAM(default on),
EDGE_STREAM_BACKEND(defaultnginx_backend). - Force a single-server strategy with no fallback.
edge:apply --nginx-only/
--apache-only(andedge:statuspreview) bypass host auto-detection;
EDGE_FORCE_STRATEGYsets a deploy default. - Behind-SNI-router awareness. The nginx-only vhost now listens on the internal
backend port (e.g. 444) instead of:443when the host runs an SNI stream router
that already owns:443— auto-detected, or forced viaEDGE_BEHIND_SNI_ROUTER
/ pinned withEDGE_NGINX_SSL_PORT. Prevents nginx failing to start with
"Address already in use". The:80→HTTPSredirect still targets the public port. - Configurable CORS, TLS pinning, method guard and deny lists for generated
vhosts:EDGE_CORS(off/allowlist/wildcard — wildcard opt-in, allowlist echoed
via a$http_originmap),EDGE_SSL_PROTOCOLS/EDGE_SSL_CIPHERS/
EDGE_SSL_STAPLING,EDGE_ALLOWED_METHODS,EDGE_DENY_DIRS. plugins/Edge/USAGE.md— full command + environment reference.
Fixed
- CLI parser rejects unknown/misspelled options instead of silently ignoring
them (e.g. a typo'd--tsl=bothno longer produces the wrong config with a zero
exit). In a script/CI it exits non-zero with a Damerau-Levenshtein "did you
mean?" suggestion; on an interactive terminal it auto-applies the obvious
correction with a visible notice. Launcher-injected globals stay tolerated. --tls=bothemits the port-80 redirect block (with ACME/Let's-Encrypt
HTTP-01 passthrough before the redirect) alongside the:443block.- Security/CORS headers are no longer dropped inside location blocks. Header
emission is centralised so every location that declares anadd_headerre-emits
the full set — headers now land on real app/API responses, not just static
paths. - DEVELOPMENT profile emits short-lived HSTS (
max-age=300, no
includeSubDomains, neverpreload); production keeps long-form HSTS with
preloadopt-in. /nginx-statusis dev-only — removed from production, where the SNI stream
proxy makesallow 127.0.0.1world-open.- Production denies source maps.
.mapis added to the deny list (not merely
dropped from the static-asset rule, whichlocation /would still serve via
try_files); development keeps serving maps for debugging. - Deny rules are ordered before the static-asset regex and directories use
^~prefix locations, so a denied path (e.g.vendor/composer/installed.json)
can no longer be served through a whitelisted extension. - Per-site access/error logs are emitted in production (previously dev-only,
silently falling back to the global log). - IPv4/IPv6 listeners are consistent —
listen [::]:443 sslnow mirrors the
:80block. - Production static-asset regex drops
map/json, and explicit TLS
protocol/cipher pinning + session settings are emitted for every TLS listener;
error_log … debugis opt-in (EDGE_NGINX_DEBUG_LOG), defaultwarn.
What's Changed
🔄 Other Changes
- Release v1.0.19 — Edge stream reuse & security hardening by @hakeemRash in #29
Full Changelog: v1.0.18...v1.0.19