From ab3530a18927f2925b8ceadba5db6c7834f7d7d1 Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 2 Sep 2026 06:16:33 +0000 Subject: [PATCH] release: sync public installer asset install.sh --- install.sh | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/install.sh b/install.sh index f49e657..24fb31d 100644 --- a/install.sh +++ b/install.sh @@ -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