fix(installer): assign group_id to hosts so panel can edit/delete them

Hosts inserted without group_id cannot be edited or deleted from the
panel UI. Generate a random 16-char lowercase alphanumeric id per host,
matching the format the panel assigns on manual add.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Ivan Razin
2026-07-16 09:25:42 +03:00
co-authored by Claude Fable 5
parent 6d0876fd19
commit 882ad252b4
+17 -5
View File
@@ -84,6 +84,12 @@ gen_random_string() {
echo echo
} }
# Matches the panel's host group_id format (16 lowercase alphanumerics)
gen_group_id() {
head -c 4096 /dev/urandom | tr -dc 'a-z0-9' | head -c 16
echo
}
check_free() { check_free() {
nc -z 127.0.0.1 "$1" &>/dev/null nc -z 127.0.0.1 "$1" &>/dev/null
return $? return $?
@@ -799,6 +805,12 @@ configure_xui_db() {
private_key=$(echo "$output" | grep "^PrivateKey:" | awk '{print $2}') private_key=$(echo "$output" | grep "^PrivateKey:" | awk '{print $2}')
public_key=$(echo "$output" | grep "^Password" | awk '{print $3}') public_key=$(echo "$output" | grep "^Password" | awk '{print $3}')
trojan_pass=$(gen_random_string 10) trojan_pass=$(gen_random_string 10)
# Per-host group_id: without it the panel cannot edit or delete the host
local gid_reality gid_ws gid_xhttp gid_trojan
gid_reality=$(gen_group_id)
gid_ws=$(gen_group_id)
gid_xhttp=$(gen_group_id)
gid_trojan=$(gen_group_id)
emoji_flag=$(LC_ALL=en_US.UTF-8 curl -s --max-time 10 https://ipwho.is/ | jq -r '.flag.emoji' 2>/dev/null) emoji_flag=$(LC_ALL=en_US.UTF-8 curl -s --max-time 10 https://ipwho.is/ | jq -r '.flag.emoji' 2>/dev/null)
[[ -z "$emoji_flag" || "$emoji_flag" == "null" ]] && emoji_flag="🌐" [[ -z "$emoji_flag" || "$emoji_flag" == "null" ]] && emoji_flag="🌐"
@@ -988,12 +1000,12 @@ VALUES (
-- rendered as the share-link endpoint at subscription time. -- rendered as the share-link endpoint at subscription time.
-- REALITY keeps its own TLS params (security=same); the rest front through -- REALITY keeps its own TLS params (security=same); the rest front through
-- nginx at :443 with TLS. -- nginx at :443 with TLS.
INSERT INTO "hosts" ("inbound_id","sort_order","remark","address","port","security","fingerprint","alpn") INSERT INTO "hosts" ("inbound_id","group_id","sort_order","remark","address","port","security","fingerprint","alpn")
VALUES VALUES
((SELECT id FROM inbounds WHERE tag='inbound-8443'), 0, 'reality', '${domain}', 443, 'same', '', '[]'), ((SELECT id FROM inbounds WHERE tag='inbound-8443'), '${gid_reality}', 0, 'reality', '${domain}', 443, 'same', '', '[]'),
((SELECT id FROM inbounds WHERE tag='inbound-${ws_port}'), 0, 'ws', '${domain}', 443, 'tls', 'firefox', '["h2","http/1.1"]'), ((SELECT id FROM inbounds WHERE tag='inbound-${ws_port}'), '${gid_ws}', 0, 'ws', '${domain}', 443, 'tls', 'firefox', '["h2","http/1.1"]'),
((SELECT id FROM inbounds WHERE tag='inbound-/dev/shm/uds2023.sock,0666:0|'), 0, 'xhttp', '${domain}', 443, 'tls', 'firefox', '["h2","http/1.1"]'), ((SELECT id FROM inbounds WHERE tag='inbound-/dev/shm/uds2023.sock,0666:0|'), '${gid_xhttp}', 0, 'xhttp', '${domain}', 443, 'tls', 'firefox', '["h2","http/1.1"]'),
((SELECT id FROM inbounds WHERE tag='inbound-${trojan_port}'), 0, 'trojan', '${domain}', 443, 'tls', 'firefox', '["h2","http/1.1"]'); ((SELECT id FROM inbounds WHERE tag='inbound-${trojan_port}'), '${gid_trojan}', 0, 'trojan', '${domain}', 443, 'tls', 'firefox', '["h2","http/1.1"]');
EOF EOF
/usr/local/x-ui/x-ui setting \ /usr/local/x-ui/x-ui setting \