前后端分离:UI/交互在 zPDF_package,能力由 zTools2 的 /api/pdf/* REST API 提供。
组件经同源 fetch 调用,httpOnly cookie(zk_pdf)经反代第一方自动携带,无需 CORS。
与 timeTableFix 集成范式完全一致。
- src/modules/pdf/Pdf.vue:iframe 包装器重写为组件挂载包装器,套 PageShell +
透传 :locale;删除 pageSrc/getLiveness/scheduleFailCheck/openExternal 等 iframe 逻辑
- src/modules/pdf/index.js:注释从 iframe 改为构建期组件 import(requiresAlive 探针保留)
- src/config/app.config.js:移除 pdf.pagePath(iframe src),保留探针配置
- src/i18n/{zh-CN,en}.js:移除 pdf.openExternal(iframe 降级按钮文案,已无用)
- docs/submodule-zPDF_package.md:集成方式改为构建期组件 import,补 cookie 认证说明
- docs/deployment.md:拓扑去 /api/pdf 页面行,措辞改为组件 fetch
- third_party/zPDF_package:子模块指针升级到 4d12b61(去 iframe 表述)
5.9 KiB
部署指南
zPDF_package 功能涉及三个项目协同:zMainPage(父站,Vue3 静态站)、zTools2(后端 API + PDF 页面)、zPDF_package(PDF 转换前端源码,zMainPage 子模块)。提供三种部署模式,按需选用。
拓扑
浏览器 -> Apache(:80)
├── 静态文件 /var/www/html (zMainPage 构建产物:主页 + 页签)
└── 反代 /api/ -> zTools2(127.0.0.1:6867)
├── /api/pdf/* PDF 转换 API(cookie 用户)
├── /api/pdf-admin PDF 管理页(Basic Auth)
├── /api/static/pdf* 前端静态资源
└── MySQL(3306) + uploads/
PDF 页签 = zMainPage 构建期 import zPDF_package 的 App.vue 作为组件(非 iframe),经同源 fetch 调用 zTools2 的 /api/pdf/* REST API(同源相对路径,cookie 第一方生效,与环境无关)。
路由约定:zTools2 所有入口(页面 / 静态 / 探针 / WS / API)统一挂在
/api/下,反代与 vite proxy 只需一条/api/规则。前端(无论是 iframe 嵌入页还是组件 fetch API)一律用同源相对路径(/api/pdf/jobs、/api/health等),自动指向当前环境的 zTools2,无需区分 dev/prod,也不会误打到其它环境域名。详见 zTools2 README「路由约定」。
模式一:组件独立部署(开发/调试)
各组件独立运行,互不依赖部署,适合开发调试。
1. zTools2 后端独立运行
cd zTools2
./setup.sh # 首次:venv + 依赖 + 建库 + SFTP 密钥
./start.sh # 启动 HTTP(127.0.0.1:6867) + SFTP(2022)
# 或:python -m uvicorn app.main:app --host 127.0.0.1 --port 6867
访问:http://127.0.0.1:6867/api/pdf-admin(PDF 管理页)、http://127.0.0.1:6867/docs(API 文档)。
用户侧 PDF 页面由 zMainPage 的 zPDF_package 组件提供(构建期 import),zTools2 仅提供
/api/pdf/*REST API 与/api/pdf-admin管理页。
2. zPDF_package 前端独立运行
cd zPDF_package
npm install
npm run dev # http://localhost:5175
vite.config.js 已配代理:/api 转发到 127.0.0.1:6867(需 zTools2 在跑),覆盖 /api/pdf/* 与 /api/admin/pdf/*。
3. zMainPage 独立运行
cd zMainPage
git submodule update --init --recursive # 含 timeTableFix / z449 / zPDF_package
npm install
(cd third_party/timeTableFix && npm install)
(cd third_party/z449 && npm install)
npm run dev # http://localhost:5173
独立模式下 PDF 页签的 zPDF_package 组件经同源相对路径
/api/pdf/*调用 zTools2,经 vite proxy 转发到本地 zTools2(127.0.0.1:6867)。如需指向其它环境的 zTools2,改src/config/app.config.js的pdf.baseUrl为该环境地址(含协议与域名)后重新npm run dev,或设VITE_API_BASE环境变量。
模式二:整体部署(生产,一次性)
一条命令构建并部署全部组件到生产。前提:zMainPage 与 zTools2 在同一主机的同级目录。
cd zMainPage
./deploy.sh # 构建 + 部署 + 配置 Apache 反代 + 重启 zTools2
./deploy.sh --no-restart # 仅更新文件,不重启 zTools2(如 zTools2 由 systemd 管理)
deploy.sh 做的事:
- 构建 zMainPage(含子模块),rsync 到
/var/www/html - 写入
.htaccess(SPA history 回退) - 配置 Apache vhost(
/etc/apache2/sites-available/zmainpage.conf)反代/api/到127.0.0.1:6867(含 WebSocket,靠 proxy_wstunnel 透传/api/ws) - 重启 zTools2(除非
--no-restart)
部署后访问 http://localhost/ 即主页,PDF 页签渲染 zPDF_package 组件并经同源 fetch 调用 /api/pdf/*。
已有 HTTPS vhost 时:
deploy.sh不会覆盖(仅首次写入)。手动在现有 vhost 加ProxyPass /api/ http://127.0.0.1:6867/api/一条规则即可(需a2enmod proxy_wstunnel以支持 WebSocket)。
模式三:持久化部署(systemd,开机自启 + 崩溃重启)
zTools2 后端需长期运行(PDF 转换是异步后台任务)。用 systemd 管理实现开机自启与崩溃自动重启。
安装 systemd 服务
cd zTools2
./deploy/install-systemd.sh
脚本自动:
- 用实际路径填充
deploy/ztools2.service模板(自动检测.venv/bin/uvicorn或系统uvicorn) - 写入
/etc/systemd/system/ztools2.service systemctl enable --now ztools2(开机自启 + 立即启动)
运维命令
systemctl status ztools2 # 状态
systemctl restart ztools2 # 重启(更新代码后)
systemctl stop ztools2 # 停止
journalctl -u ztools2 -f # 实时日志
卸载
sudo systemctl disable --now ztools2
sudo rm /etc/systemd/system/ztools2.service
sudo systemctl daemon-reload
与整体部署配合
生产推荐:systemd 管理 zTools2 + deploy.sh 部署前端。
# 首次
cd zTools2 && ./setup.sh && ./deploy/install-systemd.sh # 后端持久化
cd ../zMainPage && ./deploy.sh --no-restart # 前端部署(不重启后端,systemd 管)
# 后续更新前端
cd zMainPage && ./deploy.sh --no-restart
# 后续更新后端代码
cd zTools2 && sudo systemctl restart ztools2
环境要求
| 项 | 要求 |
|---|---|
| OS | Ubuntu 22.04+(systemd + apache2) |
| Python | ≥ 3.10(本仓开发用 3.14,需 SQLAlchemy ≥ 2.0.37) |
| Node.js | ≥ 18 |
| MySQL | 8.x |
| Apache | 2.4(启用 proxy / proxy_http / proxy_wstunnel / rewrite / headers) |
| weasyprint 系统库 | libpango-1.0-0 / libpangoft2-1.0-0 / libcairo2 / libgdk-pixbuf-2.0-0 |
防火墙
- 80(HTTP)/ 443(HTTPS):对外
- 6867:仅 loopback(经 Apache 反代,不对外)
- 2022(SFTP):按需对外