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)
|
INSTALL_NONCE=$(date +%s)
|
||||||
SCRIPT_DIR=$(cd -- "$(dirname -- "$0")" && pwd -P)
|
SCRIPT_DIR=$(cd -- "$(dirname -- "$0")" && pwd -P)
|
||||||
INSTALL_DIR=${XYMEDIA_INSTALL_DIR:-$PWD}
|
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_PORT=${XYMEDIA_POSTGRES_PUBLIC_PORT:-5432}
|
||||||
PG_DB=xymedia
|
PG_DB=xymedia
|
||||||
PG_USER=${XYMEDIA_POSTGRES_USER:-xymedia_app}
|
PG_USER=${XYMEDIA_POSTGRES_USER:-xymedia_app}
|
||||||
PG_PASSWORD_FILE=
|
PG_PASSWORD_FILE=
|
||||||
INSTALL_EXISTING=0
|
INSTALL_EXISTING=0
|
||||||
XYMEDIA_POSTGRES_PUBLIC_PORT=${XYMEDIA_POSTGRES_PUBLIC_PORT:-}
|
XYMEDIA_POSTGRES_PUBLIC_PORT=${XYMEDIA_POSTGRES_PUBLIC_PORT:-}
|
||||||
|
PG_HOST_ENV_EXPLICIT=${XYMEDIA_POSTGRES_HOST:+1}
|
||||||
SKIP_COMPONENTS=0
|
SKIP_COMPONENTS=0
|
||||||
EXISTING_DB=0
|
EXISTING_DB=0
|
||||||
LOCAL_DB=0
|
LOCAL_DB=0
|
||||||
@@ -440,12 +441,15 @@ if (( ! CONTROLLER_ONLY )) && (( INSTALL_EXISTING )); then
|
|||||||
old_port=$(read_install_env XYMEDIA_POSTGRES_PORT)
|
old_port=$(read_install_env XYMEDIA_POSTGRES_PORT)
|
||||||
old_db=$(read_install_env XYMEDIA_POSTGRES_DATABASE)
|
old_db=$(read_install_env XYMEDIA_POSTGRES_DATABASE)
|
||||||
old_user=$(read_install_env XYMEDIA_POSTGRES_USER)
|
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_port ]] && PG_PORT=$old_port
|
||||||
[[ -n $old_db ]] && PG_DB=$old_db
|
[[ -n $old_db ]] && PG_DB=$old_db
|
||||||
[[ -n $old_user ]] && PG_USER=$old_user
|
[[ -n $old_user ]] && PG_USER=$old_user
|
||||||
old_local=$(read_install_env XYMEDIA_POSTGRES_LOCAL_DB)
|
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
|
fi
|
||||||
if [[ -n $MAINTENANCE_ACTION ]]; then
|
if [[ -n $MAINTENANCE_ACTION ]]; then
|
||||||
require_public_app_installation || die '维护操作仅支持已有完整 app 安装'
|
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 (( ! 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 ! [[ $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 )) && ! [[ $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
|
import ipaddress, sys
|
||||||
try:
|
try:
|
||||||
ipaddress.ip_address(sys.argv[1])
|
ipaddress.ip_address(sys.argv[1])
|
||||||
@@ -655,6 +659,21 @@ for value in values:
|
|||||||
PY
|
PY
|
||||||
}
|
}
|
||||||
HOST_ADDRESSES_INITIAL="$(discover_host_addresses || true)"
|
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() {
|
select_random_postgres_port() {
|
||||||
local requested=${XYMEDIA_POSTGRES_PUBLIC_PORT:-}
|
local requested=${XYMEDIA_POSTGRES_PUBLIC_PORT:-}
|
||||||
if [[ -n $requested ]]; then
|
if [[ -n $requested ]]; then
|
||||||
@@ -702,7 +721,7 @@ print('x' + ''.join(secrets.choice(string.ascii_lowercase + string.digits + '_')
|
|||||||
PY
|
PY
|
||||||
}
|
}
|
||||||
if (( ! CONTROLLER_ONLY )) && (( ! INSTALL_EXISTING )) && (( ! PG_HOST_CLI )); then
|
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 后重试'
|
[[ -n $HOST_ADDRESSES_INITIAL ]] || die '未检测到可用宿主机 IP,请设置 XYMEDIA_POSTGRES_HOST 后重试'
|
||||||
PG_HOST=$(printf '%s\n' "$HOST_ADDRESSES_INITIAL" | head -n 1)
|
PG_HOST=$(printf '%s\n' "$HOST_ADDRESSES_INITIAL" | head -n 1)
|
||||||
fi
|
fi
|
||||||
@@ -713,12 +732,22 @@ if (( ! CONTROLLER_ONLY )) && (( ! INSTALL_EXISTING )) && (( ! PG_HOST_CLI )); t
|
|||||||
fi
|
fi
|
||||||
if (( ! CONTROLLER_ONLY )) && (( LOCAL_DB )) && (( ! PG_HOST_CLI )); then
|
if (( ! CONTROLLER_ONLY )) && (( LOCAL_DB )) && (( ! PG_HOST_CLI )); then
|
||||||
[[ -n ${XYMEDIA_POSTGRES_PUBLIC_PORT:-} ]] && PG_PORT=$XYMEDIA_POSTGRES_PUBLIC_PORT
|
[[ -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 对外端口,请稍后重试'
|
PG_PORT=$(select_random_postgres_port) || die '无法选择 PostgreSQL 对外端口,请稍后重试'
|
||||||
XYMEDIA_POSTGRES_PUBLIC_PORT=$PG_PORT
|
XYMEDIA_POSTGRES_PUBLIC_PORT=$PG_PORT
|
||||||
printf '检测到 PostgreSQL 端口被其他服务占用,已改用随机端口:%s\n' "$PG_PORT" >>$TTY_OUT
|
printf '检测到 PostgreSQL 端口被其他服务占用,已改用随机端口:%s\n' "$PG_PORT" >>$TTY_OUT
|
||||||
fi
|
fi
|
||||||
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 (( CONTROLLER_ONLY )) || [[ $MENU_PROFILES == *xiaoya-control* ]]; then
|
||||||
if [[ ! -e "$INSTALL_DIR/config/XYMEDIA_HOST_ADDRESSES" ]]; then
|
if [[ ! -e "$INSTALL_DIR/config/XYMEDIA_HOST_ADDRESSES" ]]; then
|
||||||
umask 077
|
umask 077
|
||||||
|
|||||||
Reference in New Issue
Block a user