Skip to content

Commit b637647

Browse files
authored
Merge pull request #63 from pacoyang/feat-proxy-timeout
feat: add configurable proxy timeout settings
2 parents 117ba6e + a73b41d commit b637647

File tree

4 files changed

+69
-0
lines changed

4 files changed

+69
-0
lines changed

custom-domain/dstack-ingress/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ configs:
177177
- `TARGET_ENDPOINT`: The plain HTTP endpoint of your dstack application (for single domain mode)
178178
- `SET_CAA`: Set to `true` to enable CAA record setup
179179
- `CLIENT_MAX_BODY_SIZE`: Optional value for nginx `client_max_body_size` (numeric with optional `k|m|g` suffix, e.g. `50m`) in single-domain mode
180+
- `PROXY_READ_TIMEOUT`: Optional value for nginx `proxy_read_timeout` (numeric with optional `s|m|h` suffix, e.g. `30s`) in single-domain mode
181+
- `PROXY_SEND_TIMEOUT`: Optional value for nginx `proxy_send_timeout` (numeric with optional `s|m|h` suffix, e.g. `30s`) in single-domain mode
182+
- `PROXY_CONNECT_TIMEOUT`: Optional value for nginx `proxy_connect_timeout` (numeric with optional `s|m|h` suffix, e.g. `10s`) in single-domain mode
180183

181184
**Backward Compatibility:**
182185

custom-domain/dstack-ingress/scripts/entrypoint.sh

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ fi
1919
if ! CLIENT_MAX_BODY_SIZE=$(sanitize_client_max_body_size "$CLIENT_MAX_BODY_SIZE"); then
2020
exit 1
2121
fi
22+
if ! PROXY_READ_TIMEOUT=$(sanitize_proxy_timeout "$PROXY_READ_TIMEOUT"); then
23+
exit 1
24+
fi
25+
if ! PROXY_SEND_TIMEOUT=$(sanitize_proxy_timeout "$PROXY_SEND_TIMEOUT"); then
26+
exit 1
27+
fi
28+
if ! PROXY_CONNECT_TIMEOUT=$(sanitize_proxy_timeout "$PROXY_CONNECT_TIMEOUT"); then
29+
exit 1
30+
fi
2231
if ! TXT_PREFIX=$(sanitize_dns_label "$TXT_PREFIX"); then
2332
exit 1
2433
fi
@@ -73,6 +82,21 @@ setup_nginx_conf() {
7382
client_max_body_size_conf=" client_max_body_size ${CLIENT_MAX_BODY_SIZE};"
7483
fi
7584

85+
local proxy_read_timeout_conf=""
86+
if [ -n "$PROXY_READ_TIMEOUT" ]; then
87+
proxy_read_timeout_conf=" ${PROXY_CMD}_read_timeout ${PROXY_READ_TIMEOUT};"
88+
fi
89+
90+
local proxy_send_timeout_conf=""
91+
if [ -n "$PROXY_SEND_TIMEOUT" ]; then
92+
proxy_send_timeout_conf=" ${PROXY_CMD}_send_timeout ${PROXY_SEND_TIMEOUT};"
93+
fi
94+
95+
local proxy_connect_timeout_conf=""
96+
if [ -n "$PROXY_CONNECT_TIMEOUT" ]; then
97+
proxy_connect_timeout_conf=" ${PROXY_CMD}_connect_timeout ${PROXY_CONNECT_TIMEOUT};"
98+
fi
99+
76100
cat <<EOF >/etc/nginx/conf.d/default.conf
77101
server {
78102
listen ${PORT} ssl;
@@ -120,6 +144,9 @@ ${client_max_body_size_conf}
120144
${PROXY_CMD}_set_header X-Real-IP \$remote_addr;
121145
${PROXY_CMD}_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
122146
${PROXY_CMD}_set_header X-Forwarded-Proto \$scheme;
147+
${proxy_read_timeout_conf}
148+
${proxy_send_timeout_conf}
149+
${proxy_connect_timeout_conf}
123150
}
124151
125152
location /evidences/ {

custom-domain/dstack-ingress/scripts/functions.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,17 @@ sanitize_dns_label() {
6868
return 1
6969
fi
7070
}
71+
72+
sanitize_proxy_timeout() {
73+
local candidate="$1"
74+
if [ -z "$candidate" ]; then
75+
echo ""
76+
return 0
77+
fi
78+
if [[ "$candidate" =~ ^[0-9]+[smh]?$ ]]; then
79+
echo "$candidate"
80+
else
81+
echo "Warning: Ignoring invalid proxy timeout value: $candidate" >&2
82+
echo ""
83+
fi
84+
}

custom-domain/dstack-ingress/scripts/tests/test_sanitizers.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ assert_equal "$(sanitize_target_endpoint grpc://svc:50051)" "grpc://svc:50051" "
4747
assert_equal "$(sanitize_client_max_body_size 50m)" "50m" "sanitize_client_max_body_size accepts suffix"
4848
assert_equal "$(sanitize_dns_label test_label)" "test_label" "sanitize_dns_label accepts lowercase"
4949
assert_equal "$(sanitize_dns_label test-label)" "test-label" "sanitize_dns_label accepts hyphen"
50+
assert_equal "$(sanitize_proxy_timeout 30)" "30" "sanitize_proxy_timeout accepts numeric value"
51+
assert_equal "$(sanitize_proxy_timeout 30s)" "30s" "sanitize_proxy_timeout accepts seconds suffix"
52+
assert_equal "$(sanitize_proxy_timeout 5m)" "5m" "sanitize_proxy_timeout accepts minutes suffix"
53+
assert_equal "$(sanitize_proxy_timeout 1h)" "1h" "sanitize_proxy_timeout accepts hours suffix"
54+
assert_equal "$(sanitize_proxy_timeout '')" "" "sanitize_proxy_timeout accepts empty value"
5055

5156
# Failing cases
5257
assert_fails "sanitize_port rejects non-numeric" sanitize_port abc
@@ -60,6 +65,26 @@ else
6065
printf '%s\n' "$warning_output"
6166
failures=$((failures + 1))
6267
fi
68+
69+
# Test invalid timeout values
70+
timeout_warning="$(sanitize_proxy_timeout "30ms" 2>&1 || true)"
71+
if [[ "$timeout_warning" == "Warning: Ignoring invalid proxy timeout value: 30ms" ]]; then
72+
echo "PASS: sanitize_proxy_timeout warns on invalid suffix (ms)"
73+
else
74+
echo "FAIL: sanitize_proxy_timeout warning unexpected"
75+
printf '%s\n' "$timeout_warning"
76+
failures=$((failures + 1))
77+
fi
78+
79+
timeout_warning="$(sanitize_proxy_timeout "abc" 2>&1 || true)"
80+
if [[ "$timeout_warning" == "Warning: Ignoring invalid proxy timeout value: abc" ]]; then
81+
echo "PASS: sanitize_proxy_timeout warns on non-numeric value"
82+
else
83+
echo "FAIL: sanitize_proxy_timeout warning unexpected"
84+
printf '%s\n' "$timeout_warning"
85+
failures=$((failures + 1))
86+
fi
87+
6388
assert_fails "sanitize_dns_label rejects invalid characters" sanitize_dns_label "bad*label"
6489

6590
if [[ $failures -eq 0 ]]; then

0 commit comments

Comments
 (0)