死代码清理: - 删除未使用的 UI 组件 Card.vue / Tag.vue - 移除 app.config.js 死字段 healthTimeoutMs(×2)与 isDev() - 移除 PageShell.vue 死 prop padded(恒为默认值) - 移除 useLocale.js 死导出 isZh/pick/locale - 移除 router/index.js 不可达 try/catch,简化为直接 .map() - 移除 package.json 重复依赖 ical.js(子模块自带) - 移除 i18n 死键 common.notAvailable / common.serviceUnavailable - 移除 vite.config.js 陈旧的 /448 /449 dev proxy(z449 为构建期组件,不走该 URL) 提前失败/日志: - useI18nLazy.js switchLocale 加载语言包失败时 console.error 记录(原静默吞错) - modules/index.js 字段不全的模块跳过时 console.warn 告警(原与文档承诺不符、静默跳过) - deploy.sh 补齐 zWhiteBoard / zPDF_package 的 npm install 与子模块初始化 (均为构建期组件 import,全新检出时缺少依赖会构建失败) 文档对齐现状(无 iframe、无外部域名): - README 改写为简洁版,修正 iframe/ical.js/子模块数量过时描述 - architecture.md 修正 requiresAlive 示例(同源 /api/health,非外部域名) 与「仅白板使用」断言(PDF 也用);移除已删 padded prop - add-module.md 同步移除 padded、修正 requiresAlive 示例 - submodule-timeTableFix.md 修正 ical.js 归属(子模块自带,非父项目共享) - submodule-zPDF_package.md 子项目数量 3 -> 4 - 新增 submodule-zWhiteBoard.md - readme-fixes.md 记录本次勘误
96 lines
4.0 KiB
Bash
Executable File
96 lines
4.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 整体部署:构建并部署 zMainPage(含子模块)+ zTools2(后端)到生产环境。
|
||
#
|
||
# 生产拓扑:
|
||
# Apache(:80) -> 静态文件 /var/www/html(zMainPage 构建产物)
|
||
# -> 反代 /api/ 到 zTools2(127.0.0.1:6867)(页面/静态/探针/WS/API 全在 /api/ 下)
|
||
# zTools2(127.0.0.1:6867) -> MySQL(3306) + uploads/ 磁盘
|
||
#
|
||
# 前提:zMainPage 与 zTools2 在同一主机(zMainPage 父项目,zTools2 同级目录)。
|
||
# 用法:./deploy.sh [--no-restart] (--no-restart 仅更新文件不重启 zTools2)
|
||
set -euo pipefail
|
||
|
||
cd "$(dirname "$0")"
|
||
ROOT="$(pwd)"
|
||
RESTART=1
|
||
[[ "${1:-}" == "--no-restart" ]] && RESTART=0
|
||
|
||
# 兄弟项目路径:zTools2 与 zMainPage 同级
|
||
ZTOOLS2="../zTools2"
|
||
ZTOOLS2_DIR="$(cd "$ZTOOLS2" 2>/dev/null && pwd)" || {
|
||
echo "未找到 zTools2(期望在 $ZTOOLS2);请确保与 zMainPage 同级目录" >&2
|
||
exit 1
|
||
}
|
||
|
||
WEB_ROOT="${WEB_ROOT:-/var/www/html}"
|
||
|
||
echo "==> [1/4] 构建 zMainPage(含子模块)"
|
||
# 子模块依赖需各自安装(构建期编译其 .vue)
|
||
[[ -d third_party/timeTableFix/node_modules ]] || (cd third_party/timeTableFix && npm install)
|
||
[[ -d third_party/z449/node_modules ]] || (cd third_party/z449 && npm install)
|
||
[[ -d third_party/zPDF_package/node_modules ]] || (cd third_party/zPDF_package && npm install)
|
||
[[ -d third_party/zWhiteBoard/node_modules ]] || (cd third_party/zWhiteBoard && npm install)
|
||
# 确保子模块源码存在(全新检出时)
|
||
[[ -d third_party/zPDF_package/src ]] || git submodule update --init third_party/zPDF_package
|
||
[[ -d third_party/zWhiteBoard/src ]] || git submodule update --init third_party/zWhiteBoard
|
||
npm run build
|
||
|
||
echo "==> [2/4] 部署 zMainPage 构建产物到 $WEB_ROOT"
|
||
sudo mkdir -p "$WEB_ROOT/js/mainPage" "$WEB_ROOT/css/mainPage"
|
||
sudo rsync -a --delete dist/js/mainPage/ "$WEB_ROOT/js/mainPage/"
|
||
sudo rsync -a --delete dist/css/mainPage/ "$WEB_ROOT/css/mainPage/"
|
||
sudo rsync -a dist/index.html "$WEB_ROOT/index.html"
|
||
[[ -f dist/favicon.svg ]] && sudo rsync -a dist/favicon.svg "$WEB_ROOT/favicon.svg"
|
||
# SPA 回退 .htaccess(history 模式)
|
||
cat > /tmp/zmainpage_htaccess <<'HT'
|
||
RewriteEngine On
|
||
RewriteCond %{REQUEST_FILENAME} -f [OR]
|
||
RewriteCond %{REQUEST_FILENAME} -d
|
||
RewriteRule ^ - [L]
|
||
RewriteRule ^ index.html [L]
|
||
HT
|
||
sudo cp /tmp/zmainpage_htaccess "$WEB_ROOT/.htaccess"
|
||
|
||
echo "==> [3/4] 配置 Apache 反代(zMainPage -> zTools2)"
|
||
# 确保 proxy / rewrite / headers / proxy_wstunnel(WebSocket)模块启用
|
||
sudo a2enmod proxy proxy_http proxy_wstunnel rewrite headers >/dev/null 2>&1 || true
|
||
# 写入 vhost 配置(仅当不存在时,避免覆盖已有 HTTPS 配置)
|
||
VHOST="/etc/apache2/sites-available/zmainpage.conf"
|
||
if [[ ! -f "$VHOST" ]]; then
|
||
sudo tee "$VHOST" >/dev/null <<'VH'
|
||
<VirtualHost *:80>
|
||
DocumentRoot /var/www/html
|
||
# zTools2 反代:所有入口(页面/静态/探针/WS/API)统一在 /api/ 下,一条规则即可;
|
||
# WebSocket 走 /api/ws/wb/{id},由 proxy_wstunnel 透传 Upgrade 头
|
||
ProxyPreserveHost On
|
||
ProxyPass /api/ http://127.0.0.1:6867/api/
|
||
ProxyPassReverse /api/ http://127.0.0.1:6867/api/
|
||
# SPA 回退:非文件非目录的请求回退到 index.html
|
||
<Directory /var/www/html>
|
||
AllowOverride All
|
||
Require all granted
|
||
</Directory>
|
||
</VirtualHost>
|
||
VH
|
||
sudo a2dissite 000-default >/dev/null 2>&1 || true
|
||
sudo a2ensite zmainpage >/dev/null
|
||
echo " 已写入 $VHOST 并启用"
|
||
else
|
||
echo " $VHOST 已存在,跳过(如需更新请手动编辑)"
|
||
fi
|
||
sudo systemctl reload apache2
|
||
|
||
echo "==> [4/4] 重启 zTools2 后端"
|
||
if [[ $RESTART -eq 1 ]]; then
|
||
(cd "$ZTOOLS2_DIR" && ./stop.sh >/dev/null 2>&1 || true)
|
||
(cd "$ZTOOLS2_DIR" && ./start.sh)
|
||
else
|
||
echo " --no-restart:跳过 zTools2 重启"
|
||
fi
|
||
|
||
echo
|
||
echo "部署完成。"
|
||
echo " - zMainPage: http://localhost(Apache :80,静态文件 + SPA)"
|
||
echo " - zTools2: http://127.0.0.1:6867(经 Apache 反代 /api/)"
|
||
echo " - PDF 页签: http://localhost -> 构建期组件嵌入,同源调用 zTools2 /api/pdf/*"
|