XuqmGroup-PrivateDeploy/scripts/install.sh
2026-05-18 19:49:31 +08:00

110 行
2.8 KiB
Bash
可执行文件

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
. "$ROOT_DIR/scripts/lib.sh"
load_env
if [ ! -f "$ROOT_DIR/.env" ]; then
cp "$ROOT_DIR/.env.example" "$ROOT_DIR/.env"
fi
ensure_secret_file
load_env
PROFILE="${COMPOSE_PROFILES:-base}"
OFFLINE_BUNDLE=""
usage() {
cat <<'EOF'
Usage: ./scripts/install.sh [options]
Options:
--profile <profiles> Docker Compose profiles, for example: base,im,push,update,license
--mysql-mode <mode> external or managed
--redis-mode <mode> external or managed
--offline-bundle <path> Load images from an offline bundle before deployment
-h, --help Show help
EOF
}
while [ "$#" -gt 0 ]; do
case "$1" in
--profile)
PROFILE="${2:-}"
shift 2
;;
--profile=*)
PROFILE="${1#--profile=}"
shift
;;
--mysql-mode)
MYSQL_MODE="${2:-}"
set_env_value "$ROOT_DIR/.env" "MYSQL_MODE" "$MYSQL_MODE"
set_env_value "$ROOT_DIR/config/infra.env" "MYSQL_MODE" "$MYSQL_MODE"
shift 2
;;
--mysql-mode=*)
MYSQL_MODE="${1#--mysql-mode=}"
set_env_value "$ROOT_DIR/.env" "MYSQL_MODE" "$MYSQL_MODE"
set_env_value "$ROOT_DIR/config/infra.env" "MYSQL_MODE" "$MYSQL_MODE"
shift
;;
--redis-mode)
REDIS_MODE="${2:-}"
set_env_value "$ROOT_DIR/.env" "REDIS_MODE" "$REDIS_MODE"
set_env_value "$ROOT_DIR/config/infra.env" "REDIS_MODE" "$REDIS_MODE"
shift 2
;;
--redis-mode=*)
REDIS_MODE="${1#--redis-mode=}"
set_env_value "$ROOT_DIR/.env" "REDIS_MODE" "$REDIS_MODE"
set_env_value "$ROOT_DIR/config/infra.env" "REDIS_MODE" "$REDIS_MODE"
shift
;;
--offline-bundle)
OFFLINE_BUNDLE="${2:-}"
shift 2
;;
--offline-bundle=*)
OFFLINE_BUNDLE="${1#--offline-bundle=}"
shift
;;
-h|--help)
usage
exit 0
;;
*)
fail_json "XUQM_PRIVATE_4002" "unknown install option: $1" "install"
;;
esac
done
[ -n "$PROFILE" ] || fail_json "XUQM_PRIVATE_4003" "profile cannot be empty" "install"
set_env_value "$ROOT_DIR/.env" "COMPOSE_PROFILES" "$PROFILE"
audit "install" "STARTED" "profile=$PROFILE"
progress "install" "STARTED" "profile=$PROFILE"
require_cmd docker
if [ -n "$OFFLINE_BUNDLE" ]; then
[ -f "$OFFLINE_BUNDLE" ] || fail_json "XUQM_PRIVATE_4004" "offline bundle not found: $OFFLINE_BUNDLE" "install"
docker load -i "$OFFLINE_BUNDLE"
fi
if [ "${MYSQL_MODE:-external}" = "managed" ]; then
"$ROOT_DIR/scripts/install-mysql.sh"
fi
if [ "${REDIS_MODE:-external}" = "managed" ]; then
"$ROOT_DIR/scripts/install-redis.sh"
fi
"$ROOT_DIR/scripts/render-config.sh"
COMPOSE_PROFILES="$PROFILE" compose up -d
"$ROOT_DIR/scripts/healthcheck.sh"
audit "install" "DONE" "profile=$PROFILE"
progress "install" "DONE" "profile=$PROFILE"