release: sync public installer asset install.sh
This commit is contained in:
+35
-6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user