#!/usr/bin/env bash # 比特骆驼行情采集分析 部署管理器(工程 market_intel) # 部署环境: Ubuntu 22.04 LTS · Docker Compose # # 新服务器(免克隆): # curl -fsSL https://git.bz121.com/dekun/market_intel/raw/branch/main/deploy/manage.sh | bash # # 已安装: # bash /opt/market_intel/deploy/manage.sh # set -e if [ -n "${BASH_VERSION:-}" ]; then set -o pipefail fi INSTALL_ROOT="${INSTALL_ROOT:-/opt/market_intel}" GIT_URL="${GIT_URL:-https://git.bz121.com/dekun/market_intel.git}" GIT_BRANCH="${GIT_BRANCH:-main}" _script_src="${BASH_SOURCE[0]:-}" if [[ -n "${_script_src}" && -f "${_script_src}" ]]; then DEPLOY_DIR="$(cd "$(dirname "${_script_src}")" && pwd)" REPO_ROOT="$(cd "${DEPLOY_DIR}/.." && pwd)" LIB_DIR="${DEPLOY_DIR}/lib" else DEPLOY_DIR="" REPO_ROOT="" LIB_DIR="" fi unset _script_src set -u repo_ready() { [[ -f "${1}/deploy/manage.sh" && -f "${1}/docker-compose.yml" && -d "${1}/deploy/lib" ]] } ensure_git_cli() { if command -v git >/dev/null 2>&1; then return 0 fi if command -v apt-get >/dev/null 2>&1; then export DEBIAN_FRONTEND=noninteractive local waited=0 while pgrep -x unattended-upgr >/dev/null 2>&1 \ || pgrep -x apt-get >/dev/null 2>&1 \ || pgrep -x apt >/dev/null 2>&1 \ || pgrep -x dpkg >/dev/null 2>&1 \ || { command -v fuser >/dev/null 2>&1 && fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; }; do if [[ "${waited}" -eq 0 ]]; then echo "等待 apt 锁释放(unattended-upgrades)…" fi if [[ "${waited}" -ge 600 ]]; then echo "错误: 等待 apt 锁超时,请稍后再试" >&2 exit 1 fi sleep 5 waited=$((waited + 5)) done apt-get update -qq apt-get install -y git ca-certificates curl else echo "错误: 未找到 git" >&2 exit 1 fi } sync_repo_if_present() { local root="$1" if [[ -d "${root}/.git" ]] && command -v git >/dev/null 2>&1; then git -C "${root}" fetch --all --prune 2>/dev/null || true git -C "${root}" checkout "${GIT_BRANCH}" 2>/dev/null || true git -C "${root}" pull --ff-only origin "${GIT_BRANCH}" 2>/dev/null \ || git -C "${root}" pull --ff-only 2>/dev/null \ || true fi } heal_existing_install() { local root="$1" echo "检测到已有目录但缺少管理脚本: ${root}" echo "尝试同步最新代码…" ensure_git_cli if [[ -d "${root}/.git" ]]; then sync_repo_if_present "${root}" if repo_ready "${root}"; then echo "同步成功,切换到仓库内 manage.sh" exec bash "${root}/deploy/manage.sh" "$@" &2 exit 1 fi heal_existing_install "${INSTALL_ROOT}" "$@" fi echo "比特骆驼行情采集分析 部署管理器 — 首次自举" echo "将克隆到: ${INSTALL_ROOT}" if [[ "$(id -u)" -ne 0 ]]; then echo "错误: 请使用 root 执行" >&2 exit 1 fi ensure_git_cli mkdir -p "$(dirname "${INSTALL_ROOT}")" git clone -b "${GIT_BRANCH}" "${GIT_URL}" "${INSTALL_ROOT}" exec bash "${INSTALL_ROOT}/deploy/manage.sh" "$@" /dev/tty 2>/dev/null || printf '%s' "${__prompt}" fi if [[ -r /dev/tty ]]; then IFS= read -r __line