release: sync public installer asset install.sh

This commit is contained in:
2026-09-02 06:16:33 +00:00
parent 51ff2a3573
commit ab3530a189
+35 -6
View File
@@ -6,13 +6,14 @@ RELEASE_BASE=${XYMEDIA_RELEASE_BASE:-https://git.keeper.work/admin/xymediavault-
INSTALL_NONCE=$(date +%s)
SCRIPT_DIR=$(cd -- "$(dirname -- "$0")" && pwd -P)
INSTALL_DIR=${XYMEDIA_INSTALL_DIR:-$PWD}
PG_HOST=${XYMEDIA_POSTGRES_HOST:-postgres}
PG_HOST=${XYMEDIA_POSTGRES_HOST:-}
PG_PORT=${XYMEDIA_POSTGRES_PUBLIC_PORT:-5432}
PG_DB=xymedia
PG_USER=${XYMEDIA_POSTGRES_USER:-xymedia_app}
PG_PASSWORD_FILE=
INSTALL_EXISTING=0
XYMEDIA_POSTGRES_PUBLIC_PORT=${XYMEDIA_POSTGRES_PUBLIC_PORT:-}
PG_HOST_ENV_EXPLICIT=${XYMEDIA_POSTGRES_HOST:+1}
SKIP_COMPONENTS=0
EXISTING_DB=0
LOCAL_DB=0
@@ -440,12 +441,15 @@ if (( ! CONTROLLER_ONLY )) && (( INSTALL_EXISTING )); then
old_port=$(read_install_env XYMEDIA_POSTGRES_PORT)
old_db=$(read_install_env XYMEDIA_POSTGRES_DATABASE)
old_user=$(read_install_env XYMEDIA_POSTGRES_USER)
[[ -n $old_host ]] && PG_HOST=$old_host
[[ -n $old_host && -z $PG_HOST_ENV_EXPLICIT && $PG_HOST_CLI -eq 0 ]] && PG_HOST=$old_host
[[ -n $old_port ]] && PG_PORT=$old_port
[[ -n $old_db ]] && PG_DB=$old_db
[[ -n $old_user ]] && PG_USER=$old_user
old_local=$(read_install_env XYMEDIA_POSTGRES_LOCAL_DB)
if [[ $old_local == 1 || ( $old_host == postgres && $EXISTING_DB != 1 ) ]]; then LOCAL_DB=1; fi
if [[ $old_local == 1 || ( $old_host == postgres && $EXISTING_DB != 1 ) ]]; then
LOCAL_DB=1
[[ -n $PG_HOST_ENV_EXPLICIT || $PG_HOST_CLI -eq 1 ]] || PG_HOST=$old_host
fi
fi
if [[ -n $MAINTENANCE_ACTION ]]; then
require_public_app_installation || die '维护操作仅支持已有完整 app 安装'
@@ -585,7 +589,7 @@ if (( ! CONTROLLER_ONLY )) && (( PG_HOST_CLI )) && [[ $PG_HOST != postgres && $E
if (( ! CONTROLLER_ONLY )) && (( PG_HOST_CLI )) && [[ $PG_HOST != postgres && -z $PG_PASSWORD_FILE ]]; then die 'an external database requires --postgres-password-file'; fi
if ! [[ $API_PORT =~ ^[0-9]+$ && $WEBDAV_PORT =~ ^[0-9]+$ && $TVBOX_PORT =~ ^[0-9]+$ ]]; then die 'ports must be numeric'; fi
if (( ! CONTROLLER_ONLY )) && ! [[ $PG_PORT =~ ^[0-9]+$ && $PG_PORT -ge 1024 && $PG_PORT -le 65535 && $PG_DB =~ ^[A-Za-z0-9_]+$ && $PG_USER =~ ^[A-Za-z0-9._-]+$ ]]; then die 'invalid PostgreSQL connection values'; fi
if (( ! CONTROLLER_ONLY )) && ! python3 - "$PG_HOST" <<'PY'
if (( ! CONTROLLER_ONLY )) && [[ -n $PG_HOST ]] && ! python3 - "$PG_HOST" <<'PY'
import ipaddress, sys
try:
ipaddress.ip_address(sys.argv[1])
@@ -655,6 +659,21 @@ for value in values:
PY
}
HOST_ADDRESSES_INITIAL="$(discover_host_addresses || true)"
postgres_host_is_container_ip() {
local container_ips
[[ $1 == postgres ]] && return 0
container_ips=$(docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' xymedia-postgres 2>/dev/null || true)
[[ " $container_ips " == *" $1 "* ]]
}
if (( ! CONTROLLER_ONLY )) && (( LOCAL_DB )); then
if [[ -z $HOST_ADDRESSES_INITIAL && -z $PG_HOST_ENV_EXPLICIT ]]; then
die '未检测到可用宿主机 IP,请设置 XYMEDIA_POSTGRES_HOST 后重试'
fi
if [[ -z $PG_HOST_ENV_EXPLICIT && $PG_HOST_CLI -eq 0 ]]; then
PG_HOST=$(printf '%s\n' "$HOST_ADDRESSES_INITIAL" | head -n 1)
printf '本地数据库将使用宿主机地址:%s\n' "$PG_HOST" >>$TTY_OUT
fi
fi
select_random_postgres_port() {
local requested=${XYMEDIA_POSTGRES_PUBLIC_PORT:-}
if [[ -n $requested ]]; then
@@ -702,7 +721,7 @@ print('x' + ''.join(secrets.choice(string.ascii_lowercase + string.digits + '_')
PY
}
if (( ! CONTROLLER_ONLY )) && (( ! INSTALL_EXISTING )) && (( ! PG_HOST_CLI )); then
if [[ -z ${XYMEDIA_POSTGRES_HOST:-} ]]; then
if [[ -z ${XYMEDIA_POSTGRES_HOST:-} && -z $PG_HOST_ENV_EXPLICIT ]]; then
[[ -n $HOST_ADDRESSES_INITIAL ]] || die '未检测到可用宿主机 IP,请设置 XYMEDIA_POSTGRES_HOST 后重试'
PG_HOST=$(printf '%s\n' "$HOST_ADDRESSES_INITIAL" | head -n 1)
fi
@@ -713,12 +732,22 @@ if (( ! CONTROLLER_ONLY )) && (( ! INSTALL_EXISTING )) && (( ! PG_HOST_CLI )); t
fi
if (( ! CONTROLLER_ONLY )) && (( LOCAL_DB )) && (( ! PG_HOST_CLI )); then
[[ -n ${XYMEDIA_POSTGRES_PUBLIC_PORT:-} ]] && PG_PORT=$XYMEDIA_POSTGRES_PUBLIC_PORT
if ! postgres_port_is_owned && ! postgres_port_is_available "$PG_PORT"; then
if ! postgres_port_is_owned && { [[ $PG_PORT == 5432 ]] || ! postgres_port_is_available "$PG_PORT"; }; then
PG_PORT=$(select_random_postgres_port) || die '无法选择 PostgreSQL 对外端口,请稍后重试'
XYMEDIA_POSTGRES_PUBLIC_PORT=$PG_PORT
printf '检测到 PostgreSQL 端口被其他服务占用,已改用随机端口:%s\n' "$PG_PORT" >>$TTY_OUT
fi
fi
if (( ! CONTROLLER_ONLY )) && (( LOCAL_DB )); then
[[ -n $PG_HOST ]] || die '本机 bundled PostgreSQL 必须使用宿主机 IP,请设置 XYMEDIA_POSTGRES_HOST 后重试'
python3 - "$PG_HOST" <<'PY' || die 'PostgreSQL 主机必须是 IPv4、IPv6 或合法主机名'
import ipaddress, re, sys
try:
ipaddress.ip_address(sys.argv[1])
except ValueError:
if not re.fullmatch(r'[A-Za-z0-9.-]+', sys.argv[1]): raise SystemExit(1)
PY
fi
if (( CONTROLLER_ONLY )) || [[ $MENU_PROFILES == *xiaoya-control* ]]; then
if [[ ! -e "$INSTALL_DIR/config/XYMEDIA_HOST_ADDRESSES" ]]; then
umask 077