feat: 新增整体部署脚本与部署指南(组件独立/整体/持久化三模式)

- deploy.sh:整体部署,构建 zMainPage + rsync 到 /var/www/html + 配置
  Apache 反代(/api /pdf /pdf-admin /static 等到 zTools2)+ 重启后端
- docs/deployment.md:三种部署模式文档(组件独立开发 / 整体生产 / systemd 持久化)
- README:补部署指南链接
This commit is contained in:
2026-07-27 13:52:40 +08:00
parent 04f11b5432
commit 66f93c67f5
3 changed files with 256 additions and 0 deletions

148
docs/deployment.md Normal file
View File

@@ -0,0 +1,148 @@
# 部署指南
zPDF_package 功能涉及三个项目协同:**zMainPage**父站Vue3 静态站)、**zTools2**(后端 API + PDF 页面)、**zPDF_package**PDF 转换前端源码zMainPage 子模块)。提供三种部署模式,按需选用。
## 拓扑
```
浏览器 -> Apache(:80)
├── 静态文件 /var/www/html zMainPage 构建产物:主页 + 页签)
└── 反代 -> zTools2(127.0.0.1:6867)
├── /api/pdf/* PDF 转换 APIcookie 用户)
├── /pdf PDF 转换页面iframe 嵌入源)
├── /pdf-admin PDF 管理页Basic Auth
├── /static/pdf* 前端静态资源
└── MySQL(3306) + uploads/
```
PDF 页签 = zMainPage 用 iframe 嵌入 zTools2 的 `/pdf` 页面同源cookie 第一方生效)。
---
## 模式一:组件独立部署(开发/调试)
各组件独立运行,互不依赖部署,适合开发调试。
### 1. zTools2 后端独立运行
```bash
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/pdfPDF 页面、http://127.0.0.1:6867/docsAPI 文档)。
### 2. zPDF_package 前端独立运行
```bash
cd zPDF_package
npm install
npm run dev # http://localhost:5175
```
`vite.config.js` 已配代理:`/api/pdf/*``/api/admin/pdf/*` 转发到 `127.0.0.1:6867`(需 zTools2 在跑)。
### 3. zMainPage 独立运行
```bash
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 页签的 iframe 指向 `https://f.zikai.wang/pdf`(线上),如需指向本地 zTools2改 `src/config/app.config.js` 的 `pdf.baseUrl` 为 `http://127.0.0.1:6867` 后重新 `npm run dev`。
---
## 模式二:整体部署(生产,一次性)
一条命令构建并部署全部组件到生产。**前提**zMainPage 与 zTools2 在同一主机的同级目录。
```bash
cd zMainPage
./deploy.sh # 构建 + 部署 + 配置 Apache 反代 + 重启 zTools2
./deploy.sh --no-restart # 仅更新文件,不重启 zTools2如 zTools2 由 systemd 管理)
```
`deploy.sh` 做的事:
1. 构建 zMainPage含子模块rsync 到 `/var/www/html`
2. 写入 `.htaccess`SPA history 回退)
3. 配置 Apache vhost`/etc/apache2/sites-available/zmainpage.conf`)反代 `/api` `/pdf` `/pdf-admin` `/static` 等到 `127.0.0.1:6867`
4. 重启 zTools2除非 `--no-restart`
部署后访问 http://localhost/ 即主页PDF 页签 iframe 同源加载 `/pdf`
> 已有 HTTPS vhost 时:`deploy.sh` 不会覆盖(仅首次写入)。手动在现有 vhost 加 `ProxyPass /pdf http://127.0.0.1:6867/pdf` 等规则即可。
---
## 模式三持久化部署systemd开机自启 + 崩溃重启)
zTools2 后端需长期运行PDF 转换是异步后台任务)。用 systemd 管理实现开机自启与崩溃自动重启。
### 安装 systemd 服务
```bash
cd zTools2
./deploy/install-systemd.sh
```
脚本自动:
- 用实际路径填充 `deploy/ztools2.service` 模板(自动检测 `.venv/bin/uvicorn` 或系统 `uvicorn`
- 写入 `/etc/systemd/system/ztools2.service`
- `systemctl enable --now ztools2`(开机自启 + 立即启动)
### 运维命令
```bash
systemctl status ztools2 # 状态
systemctl restart ztools2 # 重启(更新代码后)
systemctl stop ztools2 # 停止
journalctl -u ztools2 -f # 实时日志
```
### 卸载
```bash
sudo systemctl disable --now ztools2
sudo rm /etc/systemd/system/ztools2.service
sudo systemctl daemon-reload
```
### 与整体部署配合
生产推荐:**systemd 管理 zTools2 + deploy.sh 部署前端**。
```bash
# 首次
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 / rewrite / headers |
| weasyprint 系统库 | libpango-1.0-0 / libpangoft2-1.0-0 / libcairo2 / libgdk-pixbuf-2.0-0 |
## 防火墙
- 80HTTP/ 443HTTPS对外
- 6867仅 loopback经 Apache 反代,不对外)
- 2022SFTP按需对外