#!/usr/bin/env bash # 一键更新/部署:仅 git pull,禁止 scp 传代码。 # 用法: # bash /opt/eth_hedge_sim/deploy/pull_and_restart.sh # 或通过 manage.sh 选 1/3 set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" # 有 root 时:检测 Python / Node / PM2,缺则装、有则跳过(pull 前用当前脚本) if [[ -f "$ROOT/deploy/lib/common.sh" ]] && [[ "$(id -u)" -eq 0 ]]; then # shellcheck source=lib/common.sh source "$ROOT/deploy/lib/common.sh" ensure_system_deps fi echo "[比特骆驼] pull @ $ROOT" if [[ -d "$ROOT/.git" ]]; then git fetch --all --prune git pull --ff-only fi # pull 后再检测一次,确保用上仓库里最新的 python3-venv / ensurepip 逻辑 if [[ -f "$ROOT/deploy/lib/common.sh" ]] && [[ "$(id -u)" -eq 0 ]]; then # shellcheck source=lib/common.sh source "$ROOT/deploy/lib/common.sh" ensure_system_deps fi if [[ ! -f "$ROOT/.env" ]]; then echo "[比特骆驼] missing .env — copy from example" cp "$ROOT/.env.example" "$ROOT/.env" # 云上测试机默认直连 OKX sed -i 's/^OKX_HTTP_PROXY=.*/OKX_HTTP_PROXY=/' "$ROOT/.env" || true sed -i 's/^API_PORT=.*/API_PORT=5155/' "$ROOT/.env" || true sed -i 's/^ENV_NAME=.*/ENV_NAME=test/' "$ROOT/.env" || true sed -i 's/^EXCHANGE=.*/EXCHANGE=okx/' "$ROOT/.env" || true echo "[比特骆驼] wrote .env — please review AUTH_* secrets" fi if ! command -v python3 >/dev/null 2>&1; then echo "ERROR: python3 not found. 请用 manage.sh 一键部署自动安装。" exit 1 fi # 缺 ensurepip 时会留下半截 .venv:常有 bin/python3 却没有 activate,不能只看目录是否存在 project_venv_ok() { [[ -f "$ROOT/.venv/bin/activate" ]] \ && [[ -x "$ROOT/.venv/bin/python3" ]] \ && "$ROOT/.venv/bin/python3" -c "import sys" >/dev/null 2>&1 } if ! project_venv_ok; then if [[ -e "$ROOT/.venv" ]]; then echo "[比特骆驼] .venv 不可用(半截/损坏),删除后重建" rm -rf "$ROOT/.venv" fi echo "[比特骆驼] create venv" if ! python3 -m venv "$ROOT/.venv"; then pyver="$(python3 -c 'import sys; print("%d.%d" % sys.version_info[:2])' 2>/dev/null || echo "3")" echo "ERROR: 创建 venv 失败(多为缺 python3-venv / ensurepip)。" >&2 echo " 可执行: apt install -y python3-venv python${pyver}-venv" >&2 rm -rf "$ROOT/.venv" exit 1 fi if ! project_venv_ok; then echo "ERROR: venv 创建后仍不可用(缺 activate 或 python)。" >&2 rm -rf "$ROOT/.venv" exit 1 fi fi # shellcheck disable=SC1091 source "$ROOT/.venv/bin/activate" pip install -U pip pip install -r "$ROOT/requirements.txt" if ! command -v npm >/dev/null 2>&1; then echo "ERROR: npm not found. Install Node.js 18+ first (manage.sh 一键部署会自动装)." exit 1 fi ( cd "$ROOT/frontend" if [[ -f package-lock.json ]]; then npm ci; else npm install; fi npm run build ) if ! command -v pm2 >/dev/null 2>&1; then echo "[比特骆驼] install pm2" npm install -g pm2 else echo "[比特骆驼] pm2 already present, skip install" fi # 仅 reload 本项目进程,禁止 pm2 restart all pm2 startOrReload "$ROOT/deploy/ecosystem.config.cjs" --update-env pm2 save echo "[比特骆驼] done. health: http://127.0.0.1:5155/health"