#!/usr/bin/env bash # ===================================================== # deploy.sh — 打包并部署 wind_power 到远端主机 # # 远端变更: # 1. 本地执行 package.sh 生成 runtime/wind_power/ # 2. rsync runtime/wind_power/ → ~/wind_power/ # 3. 安装/更新 systemd 服务 wind_power.service # 4. 重启 wind_power,并验证 8080 直连接口 # # 不安装、不配置 nginx;不修改 gitea。 # # 用法: # ./deploy.sh # ./deploy.sh ubuntu@1.2.3.4 # ./deploy.sh --dry-run # ===================================================== set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DEFAULT_TARGET="ubuntu@82.157.83.226" SERVICE_NAME="wind_power" LOCAL_APP_DIR="${ROOT_DIR}/runtime/wind_power" DEPLOY_STAGE="${ROOT_DIR}/runtime/deploy" SSH_PASSWORD="i7568737i~" TARGET="${DEFAULT_TARGET}" DRY_RUN=false for arg in "$@"; do case "${arg}" in --dry-run) DRY_RUN=true ;; -*) echo "[deploy] 未知选项: ${arg}" >&2; exit 1 ;; *) TARGET="${arg}" ;; esac done REMOTE_USER="${TARGET%%@*}" GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' CYAN='\033[0;36m' NC='\033[0m' info(){ echo -e "${GREEN}[INFO]${NC} $*"; } step(){ echo -e "${CYAN}[STEP]${NC} $*"; } warn(){ echo -e "${YELLOW}[WARN]${NC} $*"; } err(){ echo -e "${RED}[ERROR]${NC} $*" >&2; exit 1; } command -v sshpass >/dev/null 2>&1 || err "缺少 sshpass:sudo apt install -y sshpass" SSH_OPTS=(-o StrictHostKeyChecking=accept-new -o ConnectTimeout=15) ssh_cmd() { sshpass -p "${SSH_PASSWORD}" ssh "${SSH_OPTS[@]}" "${TARGET}" "$@" } step "1/5 本地打包..." bash "${ROOT_DIR}/package.sh" --build-type Release [ -f "${LOCAL_APP_DIR}/wind_server" ] || err "打包产物缺失: ${LOCAL_APP_DIR}/wind_server" step "2/5 准备远端配置..." REMOTE_HOME="$(ssh_cmd 'echo $HOME')" REMOTE_APP_PATH="${REMOTE_HOME}/wind_power" info "远端应用目录: ${REMOTE_APP_PATH}" mkdir -p "${DEPLOY_STAGE}" cat > "${DEPLOY_STAGE}/${SERVICE_NAME}.service" </dev/null || (sudo apt-get update -qq && sudo apt-get install -y -qq rsync >/dev/null)' sshpass -p "${SSH_PASSWORD}" rsync -az --delete -e "ssh ${SSH_OPTS[*]}" \ "${LOCAL_APP_DIR}/" "${TARGET}:${REMOTE_APP_PATH}/" sshpass -p "${SSH_PASSWORD}" scp "${SSH_OPTS[@]}" \ "${DEPLOY_STAGE}/${SERVICE_NAME}.service" \ "${TARGET}:/tmp/${SERVICE_NAME}.service" info "✅ 已上传" step "4/5 安装并重启 systemd 服务..." ssh_cmd "SERVICE_NAME='${SERVICE_NAME}'" 'bash -s' <<'REMOTE' set -euo pipefail SERVICE_NAME="${SERVICE_NAME}" mkdir -p "$HOME/wind_power/logs" sudo cp "/tmp/${SERVICE_NAME}.service" "/etc/systemd/system/${SERVICE_NAME}.service" sudo apt-get update -qq 2>/dev/null || true sudo apt-get install -y -qq libjsoncpp25 libc-ares2 >/dev/null 2>&1 || true sudo systemctl daemon-reload sudo systemctl enable "${SERVICE_NAME}" >/dev/null 2>&1 || true sudo systemctl restart "${SERVICE_NAME}" echo "[remote] systemd ${SERVICE_NAME} 已安装并启动" REMOTE step "5/5 校验 8080 直连服务..." sleep 2 ssh_cmd "SERVICE_NAME='${SERVICE_NAME}'" 'bash -s' <<'REMOTE' | sed 's/^/[remote] /' set +e echo "service: $(systemctl is-active ${SERVICE_NAME})" echo "health: $(curl -s -m 5 localhost:8080/api/system/health)" echo "version: $(curl -s -m 5 localhost:8080/api/system/version)" echo "listen: $(ss -tlnp 2>/dev/null | grep ':8080' | head -1 | sed 's/.*users://')" REMOTE echo "" info "✅ 部署完成" echo -e " wind_power: ${GREEN}http://${TARGET#*@}:8080/${NC}" echo " 查看服务: ssh ${TARGET} 'systemctl status ${SERVICE_NAME}'"