复现已有算法
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
#!/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,并验证 8848 直连接口
|
||||
#
|
||||
# 不安装、不配置 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)'
|
||||
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 校验 8848 直连服务..."
|
||||
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:8848/api/system/health)"
|
||||
echo "version: $(curl -s -m 5 localhost:8848/api/system/version)"
|
||||
echo "listen: $(ss -tlnp 2>/dev/null | grep ':8848' | head -1 | sed 's/.*users://')"
|
||||
REMOTE
|
||||
|
||||
echo ""
|
||||
info "✅ 部署完成"
|
||||
echo -e " wind_power: ${GREEN}http://${TARGET#*@}:8848/${NC}"
|
||||
echo " 查看服务: ssh ${TARGET} 'systemctl status ${SERVICE_NAME}'"
|
||||
Reference in New Issue
Block a user