* feat(openresty): add proxy timeout settings to performance tuning
Expose proxy_connect_timeout, proxy_send_timeout and proxy_read_timeout
at http level, so a slow backend no longer hits the 60s 504 without a
way to raise it from the panel.
The stock nginx.conf does not set them, so an absent directive is shown
with nginx's built-in 60s and only written once changed. Writing it
unconditionally would clash with the same directive set at http level
by an included file and fail the config test.
Time directives now keep their unit suffix like the size directives do.
keepalive_timeout previously dropped it, saving 5m back as 5 seconds,
and its helper text no longer reads as a generic connection timeout.
Refs #13824
* fix(openresty): keep performance settings from overwriting http-level values
Reading the http scope used FindDirectives, which descends into server
and location blocks, while saving writes the http block. A site-level
proxy_read_timeout 2s was shown as the global value and written back
over the global 5m when only gzip was changed. Read only the http
block's own directives.
A directive nginx.conf leaves unset may still be set at the top level
of an included file. Report that value with its file, show it
read-only, and leave it out of the save, instead of showing nginx's
default and writing a duplicate that fails the config test.
Durations are now edited as written and only sent when changed, so
1m30s and keepalive_timeout's second value round-trip intact. Input is
validated against nginx's duration syntax.
Saving is disabled until the current values have loaded, so the form
defaults cannot be written over the real configuration.
renderUpgradeEnv still wrote the .env with godotenv.Marshal, which turns
any value that parses as an integer into its canonical form. A password
such as 0123 was rewritten as 123 on upgrade, the same bug #14180 fixed
for install. Use the env package marshaller, and escape $ inside double
quotes there so values containing both $ and a quote still read back
unchanged.
When several projects use the same compose file, pick the project whose
name matches the request name, exactly or after normalization. If none
matches, return an error instead of the first project in the container
list, so log cleaning never stops and truncates another project.