99ed321d24
- 使用 libxlsxwriter 常量内存导出 Excel\n- 增加全局任务占用提示与原始数据持久化\n- 保留运行时任务数据并更新接口文档
133 lines
4.3 KiB
Bash
Executable File
133 lines
4.3 KiB
Bash
Executable File
#!/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" <<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}'"
|