优化部署脚本非交互变量支持
This commit is contained in:
@@ -23,11 +23,57 @@ init_project_dir() {
|
||||
}
|
||||
|
||||
# ==================== 配置变量(支持环境变量非交互模式) ====================
|
||||
DEPLOY_MODE="" # ip | domain
|
||||
DEPLOY_IP=""
|
||||
DEPLOY_DOMAIN=""
|
||||
DEPLOY_ACCESS="${DEPLOY_ACCESS:-}" # ip | domain
|
||||
DEPLOY_MODE="" # ip | domain | skip
|
||||
DEPLOY_IP="${DEPLOY_IP:-}"
|
||||
DEPLOY_DOMAIN="${DEPLOY_DOMAIN:-}"
|
||||
DEPLOY_HTTPS_ENV="${DEPLOY_HTTPS_INPUT:-${DEPLOY_HTTPS:-}}"
|
||||
DEPLOY_HTTPS=false
|
||||
|
||||
is_non_interactive() {
|
||||
[ "${DEPLOY_NON_INTERACTIVE:-0}" = "1" ] || [ "${CI:-}" = "true" ] || [ ! -t 0 ]
|
||||
}
|
||||
|
||||
require_interactive() {
|
||||
local missing_hint=$1
|
||||
if is_non_interactive; then
|
||||
echo "❌ 当前为非交互环境,无法继续问答配置"
|
||||
echo " 请通过环境变量传入: ${missing_hint}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
normalize_bool() {
|
||||
local value
|
||||
value="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')"
|
||||
case "$value" in
|
||||
1|true|yes|y|on) echo "true" ;;
|
||||
0|false|no|n|off|"") echo "false" ;;
|
||||
*)
|
||||
echo "❌ 布尔变量值不合法: $1(支持 true/false/1/0/yes/no/y/n/on/off)" >&2
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
set_deploy_https_from_env_or_default() {
|
||||
local normalized
|
||||
if ! normalized="$(normalize_bool "${DEPLOY_HTTPS_ENV:-false}")"; then
|
||||
exit 1
|
||||
fi
|
||||
DEPLOY_HTTPS="$normalized"
|
||||
}
|
||||
|
||||
infer_deploy_access_from_env() {
|
||||
if [ -z "$DEPLOY_ACCESS" ]; then
|
||||
if [ -n "$DEPLOY_DOMAIN" ]; then
|
||||
DEPLOY_ACCESS="domain"
|
||||
elif [ -n "$DEPLOY_IP" ]; then
|
||||
DEPLOY_ACCESS="ip"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
sanitize_domain() {
|
||||
local domain="$1"
|
||||
domain="${domain#http://}"
|
||||
@@ -66,6 +112,8 @@ prompt_or_env() {
|
||||
return
|
||||
fi
|
||||
|
||||
require_interactive "$env_name"
|
||||
|
||||
if [ -n "$default" ]; then
|
||||
read -r -p "${prompt_text} [$default]: " input
|
||||
eval "$var_name=\"${input:-$default}\""
|
||||
@@ -82,6 +130,8 @@ run_deploy_questions() {
|
||||
echo "================================"
|
||||
echo ""
|
||||
|
||||
infer_deploy_access_from_env
|
||||
|
||||
# 非交互模式:环境变量已完整设置则直接使用(CI/自动化部署)
|
||||
if [ -n "$DEPLOY_ACCESS" ]; then
|
||||
if [ "$DEPLOY_ACCESS" = "ip" ] && [ -n "$DEPLOY_IP" ]; then
|
||||
@@ -96,14 +146,19 @@ run_deploy_questions() {
|
||||
exit 1
|
||||
fi
|
||||
DEPLOY_MODE="domain"
|
||||
DEPLOY_HTTPS="${DEPLOY_HTTPS_INPUT:-false}"
|
||||
set_deploy_https_from_env_or_default
|
||||
echo "使用环境变量: 域名模式, 域名=$DEPLOY_DOMAIN"
|
||||
return
|
||||
fi
|
||||
if [ "$DEPLOY_ACCESS" != "ip" ] && [ "$DEPLOY_ACCESS" != "domain" ]; then
|
||||
echo "❌ DEPLOY_ACCESS 只能是 ip 或 domain,当前为: $DEPLOY_ACCESS"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 1. IP 或域名访问
|
||||
if [ -z "$DEPLOY_ACCESS" ]; then
|
||||
require_interactive "DEPLOY_ACCESS=ip DEPLOY_IP=<服务器IP> 或 DEPLOY_ACCESS=domain DEPLOY_DOMAIN=<域名>"
|
||||
echo "1. 通过 IP 地址还是域名访问?"
|
||||
echo " [1] IP 地址(需开放 3001、3002、3003 端口)"
|
||||
echo " [2] 域名"
|
||||
@@ -140,9 +195,10 @@ run_deploy_questions() {
|
||||
fi
|
||||
|
||||
# 3.1 是否启用 HTTPS
|
||||
if [ -n "$DEPLOY_HTTPS_INPUT" ]; then
|
||||
DEPLOY_HTTPS=$DEPLOY_HTTPS_INPUT
|
||||
if [ -n "$DEPLOY_HTTPS_ENV" ]; then
|
||||
set_deploy_https_from_env_or_default
|
||||
else
|
||||
require_interactive "DEPLOY_HTTPS=true 或 DEPLOY_HTTPS=false"
|
||||
read -r -p "3.1 是否签名 HTTPS 证书?原来已经有 HTTPS 证书这里选择 N,第一次部署或者原来没有证书选 Y [y/N]: " https_choice
|
||||
DEPLOY_HTTPS=false
|
||||
if [[ "$https_choice" =~ ^[yY] ]]; then
|
||||
@@ -308,17 +364,22 @@ install_docker() {
|
||||
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
elif [[ "$OS_FAMILY" == "macOS" ]]; then
|
||||
echo "⚠️ 检测到 macOS,未找到 Docker。"
|
||||
echo "请选择安装方式:"
|
||||
echo " [1] 自动安装 Docker Desktop(需要 Homebrew)"
|
||||
echo " [2] 手动安装(默认)"
|
||||
read -r -p "请选择 [1/2]: " mac_install_choice
|
||||
mac_install_choice="${DEPLOY_MAC_DOCKER_INSTALL:-${DEPLOY_DOCKER_INSTALL:-}}"
|
||||
if [ -z "$mac_install_choice" ]; then
|
||||
require_interactive "DEPLOY_MAC_DOCKER_INSTALL=auto 或 DEPLOY_MAC_DOCKER_INSTALL=manual"
|
||||
echo "请选择安装方式:"
|
||||
echo " [1] 自动安装 Docker Desktop(需要 Homebrew)"
|
||||
echo " [2] 手动安装(默认)"
|
||||
read -r -p "请选择 [1/2]: " mac_install_choice
|
||||
fi
|
||||
mac_install_choice="$(printf '%s' "$mac_install_choice" | tr '[:upper:]' '[:lower:]')"
|
||||
case "${mac_install_choice:-2}" in
|
||||
1)
|
||||
1|auto)
|
||||
if ! install_docker_macos; then
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
2|manual)
|
||||
echo " 请手动安装 Docker Desktop: https://www.docker.com/products/docker-desktop/"
|
||||
echo " 安装并启动 Docker Desktop 后,重新运行 ./start.sh"
|
||||
exit 1
|
||||
@@ -379,14 +440,20 @@ run_https_setup() {
|
||||
# ==================== 主流程 ====================
|
||||
main() {
|
||||
init_project_dir
|
||||
infer_deploy_access_from_env
|
||||
|
||||
# 检查是否已有 .env 且非强制重新配置
|
||||
if [ -f .env ] && [ -z "$DEPLOY_FORCE_RECONFIG" ] && [ -z "$DEPLOY_ACCESS" ]; then
|
||||
echo "📁 检测到已有 .env 配置"
|
||||
read -r -p "是否重新配置部署方式?[y/N]: " reconfigure
|
||||
if [[ ! "$reconfigure" =~ ^[yY] ]]; then
|
||||
if is_non_interactive; then
|
||||
echo "⏭️ 使用现有配置继续..."
|
||||
DEPLOY_MODE="skip"
|
||||
else
|
||||
read -r -p "是否重新配置部署方式?[y/N]: " reconfigure
|
||||
if [[ ! "$reconfigure" =~ ^[yY] ]]; then
|
||||
echo "⏭️ 使用现有配置继续..."
|
||||
DEPLOY_MODE="skip"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -415,6 +482,7 @@ main() {
|
||||
else
|
||||
install_docker
|
||||
start_services
|
||||
export DEPLOY_DOMAIN
|
||||
run_https_setup
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user