Files
wind_power_cal/deploy.sh
T
cloud 58be5a34f6 功能: 完善账号、工作台与功率计算方案
- 新增账号管理、有效期、启停控制与登录工作台布局
- 新增方案三叶轮转速计算及字段映射和报告支持
- 修复功率曲线断线、图例越界及方案一散点绘制
- 优化计算进度、浅色主题和当前方案提示
- 补充前端测试与部署依赖配置
2026-09-16 15:14:45 +08:00

133 lines
4.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "缺少 sshpasssudo 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" <<SVCEOF
[Unit]
Description=Wind Power Calculation Server
After=network.target
[Service]
Type=simple
User=${REMOTE_USER}
WorkingDirectory=${REMOTE_APP_PATH}
Environment=LD_LIBRARY_PATH=${REMOTE_APP_PATH}/libs
ExecStart=${REMOTE_APP_PATH}/wind_server
Restart=on-failure
RestartSec=3
StandardOutput=append:${REMOTE_APP_PATH}/logs/server.log
StandardError=append:${REMOTE_APP_PATH}/logs/server.log
[Install]
WantedBy=multi-user.target
SVCEOF
if [ "${DRY_RUN}" = true ]; then
warn "DRY-RUN:跳过远端变更。systemd 配置已生成于 ${DEPLOY_STAGE}/"
exit 0
fi
step "3/5 上传应用与 systemd 配置..."
ssh_cmd 'command -v rsync >/dev/null || (sudo apt-get update -qq && sudo apt-get install -y -qq rsync >/dev/null)'
# data/、uploads/ 和 logs/ 由远端服务在运行时维护;发布代码时必须保留它们。
sshpass -p "${SSH_PASSWORD}" rsync -az --delete \
--exclude '/data/' --exclude '/uploads/' --exclude '/logs/' -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 libsqlite3-0 >/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}'"