This commit is contained in:
eric
2026-05-19 06:47:07 +00:00
parent e1d7251545
commit 78e1308063
63 changed files with 2527 additions and 186 deletions

157
d2ypp2/scripts/linux/lib/common.sh Normal file → Executable file
View File

@@ -487,10 +487,15 @@ redroid_container_matches_host_support() {
resolve_neko_instance_count() {
local requested="${NEKO_INSTANCE_COUNT:-2}"
local cpu count
local cpu count max_count
max_count="${NEKO_MAX_INSTANCE_COUNT:-64}"
case "$max_count" in
''|*[!0-9]*) max_count=64 ;;
esac
[ "$max_count" -lt 2 ] && max_count=2
[ "$max_count" -gt 64 ] && max_count=64
cpu="$(nproc 2>/dev/null || echo 4)"
case "$requested" in
1|2|3) count="$requested" ;;
auto|"")
if [ "$cpu" -le 4 ]; then
count=2
@@ -498,15 +503,16 @@ resolve_neko_instance_count() {
count=3
fi
;;
*[!0-9]*) count=2 ;;
*)
count=2
count="$requested"
;;
esac
if [ "$count" -lt 1 ]; then
count=1
if [ "$count" -lt 2 ]; then
count=2
fi
if [ "$count" -gt 3 ]; then
count=3
if [ "$count" -gt "$max_count" ]; then
count="$max_count"
fi
printf '%s' "$count"
}
@@ -514,7 +520,7 @@ resolve_neko_instance_count() {
resolve_neko_service_names() {
local count name
count="$(resolve_neko_instance_count)"
for name in 1 2 3; do
for name in $(seq 1 "$count"); do
[ "$name" -le "$count" ] || break
printf 'neko%s\n' "$name"
done
@@ -524,13 +530,85 @@ resolve_neko_instances_csv() {
resolve_neko_service_names | paste -sd, -
}
seed_neko_tampermonkey_profile() {
local target="${1:-}" donor="${2:-}" rel src dst
[ -n "$target" ] || return 0
[ -n "$donor" ] || donor="$(resolve_neko_profile_dir_for_instance 1)"
[ "$target" = "$donor" ] && return 0
[ -d "$donor/Default" ] || return 0
mkdir -p "$target/Default"
for rel in \
"Extensions/dhdgffkkebhmkfjojejmpbldmpobfkfo" \
"Local Extension Settings/dhdgffkkebhmkfjojejmpbldmpobfkfo" \
"Managed Extension Settings/dhdgffkkebhmkfjojejmpbldmpobfkfo"; do
src="$donor/Default/$rel"
dst="$target/Default/$rel"
[ -e "$src" ] || continue
[ ! -e "$dst" ] || continue
mkdir -p "$(dirname "$dst")"
cp -a "$src" "$dst" 2>/dev/null || true
done
}
resolve_neko_http_port_for_instance() {
case "${1:-1}" in
1) printf '%s' "${NEKO_HTTP_PORT_1:-${NEKO_HTTP_PORT:-9200}}" ;;
2) printf '%s' "${NEKO_HTTP_PORT_2:-9201}" ;;
3) printf '%s' "${NEKO_HTTP_PORT_3:-9202}" ;;
*) printf '%s' "${NEKO_HTTP_PORT_1:-${NEKO_HTTP_PORT:-9200}}" ;;
local idx="${1:-1}" value base
eval "value=\"\${NEKO_HTTP_PORT_${idx}:-}\""
if [ -n "$value" ]; then
printf '%s' "$value"
return 0
fi
base="${NEKO_HTTP_PORT:-9200}"
printf '%s' $((base + idx - 1))
}
resolve_neko_tcpmux_for_instance() {
local idx="${1:-1}" value base
eval "value=\"\${NEKO_WEBRTC_TCPMUX_${idx}:-}\""
if [ -n "$value" ]; then
printf '%s' "$value"
return 0
fi
base="${NEKO_WEBRTC_TCPMUX:-52300}"
printf '%s' $((base + idx - 1))
}
resolve_neko_udpmux_for_instance() {
local idx="${1:-1}" value base
eval "value=\"\${NEKO_WEBRTC_UDPMUX_${idx}:-}\""
if [ -n "$value" ]; then
printf '%s' "$value"
return 0
fi
base="${NEKO_WEBRTC_UDPMUX:-52300}"
printf '%s' $((base + idx - 1))
}
resolve_neko_udp_range_for_instance() {
local idx="${1:-1}" value start
eval "value=\"\${NEKO_WEBRTC_UDP_RANGE_${idx}:-}\""
if [ -n "$value" ]; then
printf '%s' "$value"
return 0
fi
if [ "$idx" -eq 1 ] && [ -n "${NEKO_WEBRTC_UDP_RANGE:-}" ]; then
printf '%s' "$NEKO_WEBRTC_UDP_RANGE"
return 0
fi
case "$idx" in
2) start=52101 ;;
3) start=52201 ;;
*) start=$((52400 + ((idx - 4) * 100))) ;;
esac
[ "$idx" -eq 1 ] && start=52000
printf '%s-%s' "$start" "$((start + 99))"
}
render_neko_compose_file() {
local count out
count="$(resolve_neko_instance_count)"
out="$ROOT_DIR/services/neko/docker-compose.generated.yml"
python3 "$ROOT_DIR/tools/render_neko_compose.py" --count "$count" --output "$out"
printf '%s' "$out"
}
remove_legacy_neko_container() {
@@ -1137,16 +1215,12 @@ install_neko_browser() {
log "Neko skipped: docker compose unavailable"
return 0
fi
log "Installing Neko browser desktops (Docker, 3 instances)"
log "Installing Neko browser desktops (Docker, dynamic instances)"
set -a
[ -f "$STACK_ENV" ] && . "$STACK_ENV"
set +a
local neko_dir="$ROOT_DIR/services/neko"
local idx neko_prof
for idx in 1 2 3; do
neko_prof="$(resolve_neko_profile_dir_for_instance "$idx")"
prune_neko_profile "$neko_prof"
done
local idx neko_prof instance_count port mux udp range compose_file
instance_count="$(resolve_neko_instance_count)"
export NEKO_HTTP_PORT="${NEKO_HTTP_PORT:-9200}"
export NEKO_HTTP_PORT_1="${NEKO_HTTP_PORT_1:-$NEKO_HTTP_PORT}"
export NEKO_HTTP_PORT_2="${NEKO_HTTP_PORT_2:-9201}"
@@ -1190,17 +1264,22 @@ install_neko_browser() {
export NEKO_WEBRTC_NAT1TO1
fi
export NEKO_PLUGINS_ENABLED="${NEKO_PLUGINS_ENABLED:-true}"
for port in "$NEKO_HTTP_PORT_1" "$NEKO_HTTP_PORT_2" "$NEKO_HTTP_PORT_3" "$NEKO_WEBRTC_TCPMUX_1" "$NEKO_WEBRTC_TCPMUX_2" "$NEKO_WEBRTC_TCPMUX_3"; do
for idx in $(seq 1 "$instance_count"); do
neko_prof="$(resolve_neko_profile_dir_for_instance "$idx")"
seed_neko_tampermonkey_profile "$neko_prof" "$(resolve_neko_profile_dir_for_instance 1)"
prune_neko_profile "$neko_prof"
port="$(resolve_neko_http_port_for_instance "$idx")"
mux="$(resolve_neko_tcpmux_for_instance "$idx")"
udp="$(resolve_neko_udpmux_for_instance "$idx")"
range="$(resolve_neko_udp_range_for_instance "$idx")"
allow_tcp_port_if_firewall_active "$port"
done
for port in "$NEKO_WEBRTC_UDPMUX_1" "$NEKO_WEBRTC_UDPMUX_2" "$NEKO_WEBRTC_UDPMUX_3"; do
allow_udp_port_if_firewall_active "$port"
done
for port_range in "$NEKO_WEBRTC_UDP_RANGE_1" "$NEKO_WEBRTC_UDP_RANGE_2" "$NEKO_WEBRTC_UDP_RANGE_3"; do
allow_udp_range_if_firewall_active "$port_range"
allow_tcp_port_if_firewall_active "$mux"
allow_udp_port_if_firewall_active "$udp"
allow_udp_range_if_firewall_active "$range"
done
remove_legacy_neko_container
compose_in_service_dir "$neko_dir/docker-compose.yml" up -d
compose_file="$(render_neko_compose_file)"
compose_in_service_dir "$compose_file" up -d
}
install_redroid() {
@@ -1945,11 +2024,33 @@ ExecStart=$caddy_bin run --config /opt/live/generated/Caddyfile --adapter caddyf
Restart=on-failure
RestartSec=4
[Install]
WantedBy=multi-user.target
UNIT
chmod +x "$ROOT_DIR/scripts/linux/live_edge_watch.sh" 2>/dev/null || true
cat >/etc/systemd/system/live-edge-watch.service <<UNIT
[Unit]
Description=Live edge proxy watchdog
After=network-online.target live-console.service live-edge.service
Wants=network-online.target live-edge.service
Requires=live-console.service
[Service]
Type=simple
Environment=LIVE_STACK_ROOT=$ROOT_DIR
Environment=LIVE_STACK_ENV=$STACK_ENV
ExecStart=/bin/bash $ROOT_DIR/scripts/linux/live_edge_watch.sh
Restart=always
RestartSec=5
StartLimitIntervalSec=0
[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload
systemctl enable --now live-edge.service
systemctl enable --now live-edge-watch.service
log "Edge proxy live-edge.service enabled (http://${HOSTNAME_ALIAS}.local)"
}