mirror of
https://github.com/whyour/qinglong.git
synced 2026-10-17 07:20:51 +08:00
Preserve literal paths and arguments, use portable command options, validate startup configuration, and retain scripts when downloads fail. Ensure task watchdogs and process groups are cleaned up across Bash versions, with compatibility and process lifecycle regression coverage.
79 lines
2.6 KiB
Bash
79 lines
2.6 KiB
Bash
#!/usr/bin/env bash
|
|
set -e
|
|
|
|
: "${QL_DIR:?Please set QL_DIR}"
|
|
: "${QL_DATA_DIR:?Please set QL_DATA_DIR}"
|
|
[[ "$QL_DIR" = /* && "$QL_DATA_DIR" = /*/data ]] || { echo "QL_DIR and QL_DATA_DIR must be absolute paths (data directory ends in /data)" >&2; exit 1; }
|
|
command="$1"
|
|
|
|
export PNPM_HOME="${PNPM_HOME:-${QL_DATA_DIR}/dep_cache/node}"
|
|
if [[ -n "${PYTHON_VENV_DIR:-}" ]]; then
|
|
[[ "$PYTHON_VENV_DIR" = /* ]] || PYTHON_VENV_DIR="${QL_DIR}/${PYTHON_VENV_DIR}"
|
|
export PYTHON_VENV_DIR
|
|
if [[ ! -x "$PYTHON_VENV_DIR/bin/python3" ]]; then
|
|
python3 -m venv "$PYTHON_VENV_DIR"
|
|
fi
|
|
[[ -x "$PYTHON_VENV_DIR/bin/python3" ]] || { echo "Invalid Python venv" >&2; exit 1; }
|
|
unset PYTHON_HOME PYTHONUSERBASE PYTHONPATH
|
|
export PATH="${PYTHON_VENV_DIR}/bin:${PATH}:${PNPM_HOME}"
|
|
export PIP_CACHE_DIR="${PYTHON_VENV_DIR}/pip"
|
|
else
|
|
export PYTHON_SHORT_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
|
|
export PYTHON_HOME="${PYTHON_HOME:-${QL_DATA_DIR}/dep_cache/python3}"
|
|
export PYTHONUSERBASE="$PYTHON_HOME"
|
|
export PATH="${PATH}:${PNPM_HOME}:${PYTHON_HOME}/bin"
|
|
export PIP_CACHE_DIR="${PYTHON_HOME}/pip"
|
|
export PYTHONPATH="${PYTHON_HOME}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}:${PYTHON_HOME}/lib/python${PYTHON_SHORT_VERSION}/site-packages"
|
|
fi
|
|
export NODE_PATH="${NODE_PATH:-/usr/local/bin:/usr/local/lib/node_modules:${PNPM_HOME}/global/5/node_modules}"
|
|
mkdir -p "$PIP_CACHE_DIR"
|
|
|
|
cd "${QL_DIR}"
|
|
if [[ ! -e .env ]]; then
|
|
# Preserve user configuration, including a file created concurrently.
|
|
(umask 077; set -C; cat .env.example > .env)
|
|
fi
|
|
chmod u+x "${QL_DIR}"/shell/*.sh
|
|
|
|
. "${QL_DIR}/shell/share.sh"
|
|
. "${QL_DIR}/shell/env.sh"
|
|
|
|
log_with_style() {
|
|
local level="$1"
|
|
local message="$2"
|
|
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
|
|
printf "\n[%s] [%7s] %s\n" "${timestamp}" "${level}" "${message}"
|
|
}
|
|
|
|
log_with_style "INFO" "🚀 1. 检测配置文件..."
|
|
import_config "$@"
|
|
make_dir /etc/nginx/conf.d
|
|
make_dir /run/nginx
|
|
fix_config
|
|
|
|
pm2 l &>/dev/null
|
|
|
|
log_with_style "INFO" "🔄 2. 启动 nginx..."
|
|
nginx -s reload 2>/dev/null || nginx -c /etc/nginx/nginx.conf
|
|
|
|
log_with_style "INFO" "⚙️ 3. 启动 pm2 服务..."
|
|
reload_pm2
|
|
|
|
if [[ $command != "reload" ]]; then
|
|
if [[ $AutoStartBot == true ]]; then
|
|
log_with_style "INFO" "🤖 4. 启动 bot..."
|
|
nohup ql bot >"$dir_log/bot.log" 2>&1 &
|
|
fi
|
|
|
|
if [[ $EnableExtraShell == true ]]; then
|
|
log_with_style "INFO" "🛠️ 5. 执行自定义脚本..."
|
|
nohup ql extra >"$dir_log/extra.log" 2>&1 &
|
|
fi
|
|
|
|
pm2 startup
|
|
pm2 save
|
|
fi
|
|
|
|
log_with_style "SUCCESS" "🎉 启动成功!"
|