#!/usr/bin/env bash # 比特骆驼自动化对冲系统 部署管理器(工程 eth_hedge_sim) # 部署环境: Ubuntu 22.04 LTS # # 新服务器(免克隆): # curl -fsSL https://git.bz121.com/dekun/eth_hedge_sim/raw/branch/main/deploy/manage.sh | bash # # 已安装: # bash /opt/eth_hedge_sim/deploy/manage.sh # set -e if [ -n "${BASH_VERSION:-}" ]; then set -o pipefail fi INSTALL_ROOT="${INSTALL_ROOT:-/opt/eth_hedge_sim}" GIT_URL="${GIT_URL:-https://git.bz121.com/dekun/eth_hedge_sim.git}" GIT_BRANCH="${GIT_BRANCH:-main}" # curl | bash 时脚本从 stdin 执行,BASH_SOURCE[0] 为空;须先安全探测再 set -u _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}/deploy/pull_and_restart.sh" && -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 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 } # 旧目录已存在但缺 manage.sh:尽量 git pull / 修复后切到仓库内脚本 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}" # clone 后用仓库内脚本 + 终端 stdin(管道已 EOF) 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