Files
cloud 99ed321d24 功能: 服务端生成完整报告并保护单任务
- 使用 libxlsxwriter 常量内存导出 Excel\n- 增加全局任务占用提示与原始数据持久化\n- 保留运行时任务数据并更新接口文档
2026-08-05 16:47:31 +08:00

133 lines
4.3 KiB
Bash
Executable File
Raw Permalink 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 >/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}'"