优化项目逻辑
This commit is contained in:
1 parent
97e4b3a5f1
commit
ceda386010
29 files changed
+3306
-1253
No files matched your search
@@ -2,8 +2,11 @@
|
||||
set -eu
|
||||
|
||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||
root_dir=$(CDPATH= cd -- "$script_dir/.." && pwd)
|
||||
NODEFLARE_VERSION=$(sh "$script_dir/resolve-version.sh")
|
||||
NODEFLARE_NATIVE_RUST_ONLY=1
|
||||
export NODEFLARE_NATIVE_RUST_ONLY
|
||||
export NODEFLARE_NATIVE_RUST_ONLY NODEFLARE_VERSION
|
||||
cd "$root_dir"
|
||||
. "$script_dir/ensure-rust.sh"
|
||||
|
||||
agent_target_dir=${CARGO_TARGET_DIR:-target/agent}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||
root_dir=$(CDPATH= cd -- "$script_dir/.." && pwd)
|
||||
NODEFLARE_VERSION=$(sh "$script_dir/resolve-version.sh")
|
||||
VITE_NODEFLARE_VERSION=$NODEFLARE_VERSION
|
||||
export NODEFLARE_VERSION VITE_NODEFLARE_VERSION
|
||||
cd "$root_dir"
|
||||
|
||||
bun run --cwd frontend build
|
||||
|
||||
if build_key=$(sh scripts/build-key.sh frontend 2>/dev/null); then
|
||||
|
||||
@@ -3,10 +3,10 @@ set -eu
|
||||
|
||||
case "${1:-}" in
|
||||
frontend)
|
||||
paths="frontend package.json bun.lock scripts/build-frontend.sh scripts/build-key.sh"
|
||||
paths="frontend package.json bun.lock scripts/build-frontend.sh scripts/build-key.sh scripts/resolve-version.sh"
|
||||
;;
|
||||
worker)
|
||||
paths="src frontend Cargo.toml Cargo.lock build.rs scripts/build-worker.sh scripts/build-key.sh scripts/worker-shim.js"
|
||||
paths="src frontend Cargo.toml Cargo.lock build.rs scripts/build-worker.sh scripts/build-key.sh scripts/resolve-version.sh scripts/worker-shim.js"
|
||||
;;
|
||||
*)
|
||||
echo "usage: $0 frontend|worker" >&2
|
||||
@@ -15,6 +15,7 @@ case "${1:-}" in
|
||||
esac
|
||||
|
||||
{
|
||||
sh scripts/resolve-version.sh
|
||||
git rev-parse HEAD
|
||||
git diff --binary -- $paths
|
||||
git ls-files --others --exclude-standard -- $paths | while IFS= read -r file; do
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||
root_dir=$(CDPATH= cd -- "$script_dir/.." && pwd)
|
||||
NODEFLARE_VERSION=$(sh "$script_dir/resolve-version.sh")
|
||||
VITE_NODEFLARE_VERSION=$NODEFLARE_VERSION
|
||||
export NODEFLARE_VERSION VITE_NODEFLARE_VERSION
|
||||
cd "$root_dir"
|
||||
|
||||
current_build_key=$(sh scripts/build-key.sh worker 2>/dev/null || true)
|
||||
if [ "${NODEFLARE_WORKER_READY:-0}" = "1" ] && [ -n "$current_build_key" ]; then
|
||||
built_build_key=$(sed -n '1p' build/.nodeflare-revision 2>/dev/null || true)
|
||||
@@ -12,7 +19,6 @@ if [ "${NODEFLARE_WORKER_READY:-0}" = "1" ] && [ -n "$current_build_key" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||
. "$script_dir/ensure-rust.sh"
|
||||
|
||||
if [ "${NODEFLARE_ADMIN_READY:-0}" != "1" ]; then
|
||||
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||
root_dir=$(CDPATH= cd -- "$script_dir/.." && pwd)
|
||||
|
||||
raw=${NODEFLARE_VERSION:-}
|
||||
if [ -z "$raw" ]; then
|
||||
raw=$(git -C "$root_dir" describe --tags --exact-match --match 'v[0-9]*.[0-9]*.[0-9]*' 2>/dev/null || true)
|
||||
fi
|
||||
if [ -z "$raw" ]; then
|
||||
raw=$(git -C "$root_dir" describe --tags --abbrev=0 --match 'v[0-9]*.[0-9]*.[0-9]*' 2>/dev/null || true)
|
||||
fi
|
||||
if [ -z "$raw" ]; then
|
||||
raw=$(sed -n 's/^[[:space:]]*"version": "\([^"]*\)",*$/\1/p' "$root_dir/package.json" | sed -n '1p')
|
||||
fi
|
||||
|
||||
version=${raw#v}
|
||||
if ! printf '%s\n' "$version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||||
echo "invalid NodeFlare version: $raw" >&2
|
||||
exit 1
|
||||
fi
|
||||
printf '%s\n' "$version"
|
||||
+58
-15
@@ -17,7 +17,9 @@ request() {
|
||||
monitor_curl --fail --location --silent --show-error "$@"
|
||||
}
|
||||
|
||||
config_json=$(request "$MONITOR_BASE_URL/api/config")
|
||||
bootstrap_json=$(request "$MONITOR_BASE_URL/api/bootstrap")
|
||||
printf '%s' "$bootstrap_json" | jq -e '.access == "ok" and (.servers | type == "array")' >/dev/null
|
||||
config_json=$(printf '%s' "$bootstrap_json" | jq -c '.config')
|
||||
printf '%s' "$config_json" | jq -e '.site_name | length > 0' >/dev/null
|
||||
password_client_salt=$(printf '%s' "$config_json" | jq -er '.password_client_salt | select(length > 0)')
|
||||
password_derived=$(NODEFLARE_PASSWORD="$MONITOR_ADMIN_PASSWORD" NODEFLARE_SALT="$password_client_salt" bun -e '
|
||||
@@ -27,7 +29,7 @@ const bits = await crypto.subtle.deriveBits({ name: "PBKDF2", hash: "SHA-256", i
|
||||
console.log(Array.from(new Uint8Array(bits), byte => byte.toString(16).padStart(2, "0")).join(""));
|
||||
')
|
||||
cross_origin_status=$(monitor_curl --silent --output /dev/null --write-out '%{http_code}' \
|
||||
-H 'Origin: https://not-nodeflare.invalid' "$MONITOR_BASE_URL/api/config")
|
||||
-H 'Origin: https://not-nodeflare.invalid' "$MONITOR_BASE_URL/api/bootstrap")
|
||||
[ "$cross_origin_status" = "403" ]
|
||||
|
||||
admin_html=$(request "$MONITOR_BASE_URL/admin")
|
||||
@@ -45,8 +47,8 @@ case "$admin_html" in
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
request "$MONITOR_BASE_URL/admin-assets/admin.js" >/dev/null
|
||||
request "$MONITOR_BASE_URL/admin-assets/admin.css" >/dev/null
|
||||
request "$MONITOR_BASE_URL/admin-assets/admin.js" | grep -q '管理面板'
|
||||
request "$MONITOR_BASE_URL/admin-assets/admin.css" | grep -q 'admin-shell'
|
||||
|
||||
login_json=$(request -H 'Content-Type: application/json' \
|
||||
--data "$(jq -nc --arg username "$MONITOR_ADMIN_USERNAME" --arg password "$MONITOR_ADMIN_PASSWORD" --arg password_derived "$password_derived" --arg turnstile_token "$MONITOR_TURNSTILE_TOKEN" '{username:$username,password:$password,password_derived:$password_derived,turnstile_token:$turnstile_token}')" \
|
||||
@@ -55,13 +57,16 @@ admin_token=$(printf '%s' "$login_json" | jq -er '.token')
|
||||
|
||||
# Login protection defaults to enabled, but without a complete Turnstile pair it
|
||||
# remains inactive so the first admin settings save must still work.
|
||||
settings_payload=$(request -H "Authorization: Bearer $admin_token" \
|
||||
"$MONITOR_BASE_URL/api/admin/settings" | \
|
||||
jq -c '.site_description = "Smoke settings" | del(.admin_password_configured)')
|
||||
request -H "Authorization: Bearer $admin_token" -H 'Content-Type: application/json' -X PATCH \
|
||||
--data '{"site_description":"Smoke settings"}' \
|
||||
--data "$settings_payload" \
|
||||
"$MONITOR_BASE_URL/api/admin/settings" | jq -e '.settings.site_description == "Smoke settings"' >/dev/null
|
||||
|
||||
request -H "Authorization: Bearer $admin_token" \
|
||||
"$MONITOR_BASE_URL/api/exchange-rates" | \
|
||||
jq -e '.base == "CNY" and .rates.CNY == 1 and .rates.USD > 0 and .rates.CAD > 0 and (has("cny") | not)' >/dev/null
|
||||
"$MONITOR_BASE_URL/api/bootstrap" | \
|
||||
jq -e '.config.site_description == "Smoke settings" and .exchange_rates.base == "CNY" and .exchange_rates.rates.CNY == 1 and .exchange_rates.rates.USD > 0 and .exchange_rates.rates.CAD > 0 and (.exchange_rates | has("cny") | not)' >/dev/null
|
||||
|
||||
request -H "Authorization: Bearer $admin_token" \
|
||||
"$MONITOR_BASE_URL/api/admin/themes" | \
|
||||
@@ -72,7 +77,11 @@ server_input='{"name":"Smoke Test Node","region":"JP","group_name":"Test","tags"
|
||||
server_id=
|
||||
latency_task_id=
|
||||
alert_rule_id=
|
||||
stress_report_file=
|
||||
cleanup() {
|
||||
if [ -n "$stress_report_file" ]; then
|
||||
rm -f "$stress_report_file"
|
||||
fi
|
||||
if [ -n "$alert_rule_id" ]; then
|
||||
monitor_curl --silent --show-error -H "Authorization: Bearer $admin_token" \
|
||||
-X DELETE "$MONITOR_BASE_URL/api/admin/alert-rules/$alert_rule_id" >/dev/null || true
|
||||
@@ -106,7 +115,7 @@ token_without_admin_status=$(monitor_curl --silent --output /dev/null --write-ou
|
||||
request -H "Authorization: Bearer $admin_token" \
|
||||
"$MONITOR_BASE_URL/api/admin/servers/$server_id/token" | \
|
||||
jq -e --arg token "$agent_token" '.agent_token == $token' >/dev/null
|
||||
agent_version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' agent/Cargo.toml | head -1)
|
||||
agent_version=$(sh scripts/resolve-version.sh)
|
||||
|
||||
sample=$(jq -nc --arg agent_version "$agent_version" '{
|
||||
timestamp:(now|floor),cpu:18.5,load1:0.42,load5:0.36,load15:0.31,
|
||||
@@ -131,6 +140,10 @@ report_response=$(request -H "Authorization: Bearer $agent_token" -H 'Content-Ty
|
||||
printf '%s' "$report_response" | jq -e \
|
||||
--arg task_id "$latency_task_id" \
|
||||
'.collect_interval == 5 and .agent_mirror == "https://mirror.example.com" and .auto_update == true and (.latency_tasks | any(.id == $task_id and .task_type == "tcp" and .target == "example.com" and .port == 443))' >/dev/null
|
||||
request -H "Authorization: Bearer $agent_token" \
|
||||
"$MONITOR_BASE_URL/api/agent/config" | jq -e \
|
||||
--arg task_id "$latency_task_id" \
|
||||
'.collect_interval == 5 and .agent_mirror == "https://mirror.example.com" and (.latency_tasks | any(.id == $task_id))' >/dev/null
|
||||
request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/admin/servers" | \
|
||||
jq -e --arg id "$server_id" '.servers | any(.id == $id and .last_ip == "8.8.8.8")' >/dev/null
|
||||
|
||||
@@ -138,16 +151,46 @@ latency_report=$(printf '%s' "$report" | jq --arg task_id "$latency_task_id" '.s
|
||||
request -H "Authorization: Bearer $agent_token" -H 'Content-Type: application/json' \
|
||||
--data "$latency_report" "$MONITOR_BASE_URL/api/agent/report" | jq -e '.collect_interval == 5' >/dev/null
|
||||
|
||||
# Traffic counters may reset when a host reboots. Cycle usage must retain the
|
||||
# bytes already observed before the reset and continue from the new counter.
|
||||
traffic_report=$(printf '%s' "$report" | jq '.samples[0].timestamp += 2 | .samples[0].net_rx_total=2147483648 | .samples[0].net_tx_total=1073741824')
|
||||
# A whole Agent batch must collapse into one traffic-cycle write while preserving
|
||||
# counter resets. Replaying the same batch must not count any bytes twice.
|
||||
traffic_report=$(printf '%s' "$report" | jq '.samples = [
|
||||
(.samples[0] | .timestamp += 2 | .net_rx_total=2147483648 | .net_tx_total=1073741824),
|
||||
(.samples[0] | .timestamp += 3 | .net_rx_total=268435456 | .net_tx_total=134217728),
|
||||
(.samples[0] | .timestamp += 4 | .net_rx_total=536870912 | .net_tx_total=268435456)
|
||||
]')
|
||||
request -H "Authorization: Bearer $agent_token" -H 'Content-Type: application/json' \
|
||||
--data "$traffic_report" "$MONITOR_BASE_URL/api/agent/report" | jq -e '.collect_interval == 5' >/dev/null
|
||||
reset_report=$(printf '%s' "$report" | jq '.samples[0].timestamp += 3 | .samples[0].net_rx_total=268435456 | .samples[0].net_tx_total=134217728')
|
||||
request -H "Authorization: Bearer $agent_token" -H 'Content-Type: application/json' \
|
||||
--data "$reset_report" "$MONITOR_BASE_URL/api/agent/report" | jq -e '.collect_interval == 5' >/dev/null
|
||||
--data "$traffic_report" "$MONITOR_BASE_URL/api/agent/report" | jq -e '.collect_interval == 5' >/dev/null
|
||||
|
||||
request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/servers" | jq -e --arg id "$server_id" --arg task_id "$latency_task_id" '.servers | any(.id == $id and .cpu == 18.5 and .gpu_usage == 32.5 and .disk_await_ms == 1.4 and (.gpus | length) == 1 and (.disks | length) == 1 and .disk_used == 21474836480 and .traffic_limit == 107374182400 and .net_rx_total == 2415919104 and .net_tx_total == 1207959552 and .price == 9.9 and (has("last_ip") | not) and (.latency | any(.task_id == $task_id and .latency_ms == 28.4 and .packet_loss == 25)))' >/dev/null
|
||||
request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/bootstrap" | jq -e --arg id "$server_id" --arg task_id "$latency_task_id" '.servers | any(.id == $id and .cpu == 18.5 and .gpu_usage == 32.5 and .disk_await_ms == 1.4 and (.gpus | length) == 1 and (.disks | length) == 1 and .disk_used == 21474836480 and .traffic_limit == 107374182400 and .net_rx_total == 2684354560 and .net_tx_total == 1342177280 and .price == 9.9 and (has("last_ip") | not) and (.latency | any(.task_id == $task_id and .latency_ms == 28.4 and .packet_loss == 25)))' >/dev/null
|
||||
|
||||
# Changing the reset day starts a new traffic cycle. Only growth after the first
|
||||
# sample in that cycle counts toward usage.
|
||||
request -H "Authorization: Bearer $admin_token" -H 'Content-Type: application/json' -X PATCH \
|
||||
--data "$(printf '%s' "$server_input" | jq '.reset_day=2')" \
|
||||
"$MONITOR_BASE_URL/api/admin/servers/$server_id" >/dev/null
|
||||
cycle_report=$(printf '%s' "$report" | jq '.samples = [
|
||||
(.samples[0] | .timestamp += 5 | .net_rx_total=805306368 | .net_tx_total=536870912),
|
||||
(.samples[0] | .timestamp += 6 | .net_rx_total=1073741824 | .net_tx_total=805306368)
|
||||
]')
|
||||
request -H "Authorization: Bearer $agent_token" -H 'Content-Type: application/json' \
|
||||
--data "$cycle_report" "$MONITOR_BASE_URL/api/agent/report" | jq -e '.collect_interval == 5' >/dev/null
|
||||
request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/bootstrap" | \
|
||||
jq -e --arg id "$server_id" '.servers | any(.id == $id and .net_rx_total == 268435456 and .net_tx_total == 268435456)' >/dev/null
|
||||
|
||||
# Exercise the protocol maximum so batch aggregation and request-size limits
|
||||
# stay covered when an Agent flushes a full pending queue.
|
||||
stress_report_file=$(mktemp "${TMPDIR:-/tmp}/nodeflare-stress.XXXXXX")
|
||||
printf '%s' "$report" | jq '(now | floor) as $start | .samples = [
|
||||
range(0; 720) as $index |
|
||||
(.samples[0] |
|
||||
.timestamp=($start + $index + 10) |
|
||||
.net_rx_total=(1073741824 + (($index + 1) * 4096)) |
|
||||
.net_tx_total=(805306368 + (($index + 1) * 2048)))
|
||||
]' >"$stress_report_file"
|
||||
request -H "Authorization: Bearer $agent_token" -H 'Content-Type: application/json' \
|
||||
--data-binary "@$stress_report_file" "$MONITOR_BASE_URL/api/agent/report" | jq -e '.collect_interval == 5' >/dev/null
|
||||
request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/history/$server_id?hours=1" | jq -e '.points | length >= 1 and any(.gpu_usage == 32.5)' >/dev/null
|
||||
history_cache_header=$(monitor_curl --silent --dump-header - --output /dev/null \
|
||||
-H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/history/$server_id?hours=1" | \
|
||||
@@ -174,7 +217,7 @@ request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/admin/ale
|
||||
request -H "Authorization: Bearer $admin_token" -H 'Content-Type: application/json' -X PATCH \
|
||||
--data "$(printf '%s' "$server_input" | jq '.hidden=true')" \
|
||||
"$MONITOR_BASE_URL/api/admin/servers/$server_id" >/dev/null
|
||||
request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/servers" | \
|
||||
request -H "Authorization: Bearer $admin_token" "$MONITOR_BASE_URL/api/bootstrap" | \
|
||||
jq -e --arg id "$server_id" '.servers | all(.id != $id)' >/dev/null
|
||||
hidden_history_status=$(monitor_curl --silent --output /dev/null --write-out '%{http_code}' \
|
||||
-H "Authorization: Bearer $admin_token" \
|
||||
|
||||
Reference in new issue
Block a user