Files
MorphDoc/deploy/README.md
T

148 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AIO 容器部署
本目录提供单容器部署:Nginx 在 `8080` 端口提供前端,并将
`/api/` 代理到同容器内的 Fastify;Fastify 复用固定版本
Playwright Chromium 生成 PDF,并使用固定 Pandoc `3.9.0.2` 生成
可编辑 DOCX。可选字体包只从宿主机只读挂载,不进入应用镜像。
## 启动
要求已经安装并启动 Docker Desktop。
```powershell
docker compose -f deploy\compose.yaml up --build -d
docker compose -f deploy\compose.yaml ps
```
打开:
```text
http://localhost:8080
```
健康检查:
```powershell
Invoke-RestMethod -Uri 'http://localhost:8080/api/health'
```
查看日志和停止:
```powershell
docker compose -f deploy\compose.yaml logs -f
docker compose -f deploy\compose.yaml down
```
## 构建发布标签
可以直接指定版本化镜像名称构建:
```powershell
$env:MD_TO_PDF_IMAGE = 'yixiong/md-to-pdf:v0.6.0'
docker compose -f deploy\compose.yaml build
```
该命令只生成本地镜像,不会自动推送到镜像仓库。
默认构建会安装项目锁定版本的 Playwright Chromium 及系统依赖。如果本机
已经保留同版本系列的已验证镜像,可在内网或软件源较慢时复用其运行层:
```powershell
$env:MD_TO_PDF_IMAGE = 'yixiong/md-to-pdf:v0.6.0'
$env:MD_TO_PDF_RUNTIME_BASE_IMAGE = 'yixiong/md-to-pdf:v0.4.5'
$env:MD_TO_PDF_REUSE_PLAYWRIGHT_RUNTIME = '1'
docker compose -f deploy\compose.yaml build
```
复用模式会校验基础镜像中存在 Chromium,再覆盖 v0.6.0 应用代码和生产
依赖。正式跨机器构建仍建议使用默认完整路径。
## 主题挂载
Compose 默认将项目的 `.local/themes` 只读挂载到容器中的
`/app/.local/themes`。可以通过环境变量指定其他目录:
```powershell
$env:MD_TO_PDF_THEME_DIR = 'D:\md-to-pdf-themes'
docker compose -f deploy\compose.yaml up -d
```
目录下每套主题都应包含 `theme.json`。主题规范详见
[`docs/THEMES.md`](../docs/THEMES.md)。
当前内置 4 套 Typora 风格主题、4 套红头主题、3 套正式文档主题和
3 套标书主题;挂载目录只用于额外的本机扩展主题,无需重复
放置内置主题。内置主题与挂载主题 ID 重复时以内置版本为准。
## 可选字体包挂载
Compose 默认将项目的 `.local/font-packs` 只读挂载到容器中的
`/app/.local/font-packs`。目录为空或不存在字体包时,应用仍可正常启动,
Preview、PDF 和 DOCX 会使用主题原有字体安全降级。
字体包使用固定目录结构:
```text
<字体包根目录>/
└── mdtp-serif-sc/
└── 1.0.0/
├── font-pack.json
├── LICENSE.txt
└── fonts/
```
从仓库外准备好冻结字体源后,可以构建并挂载项目字体包:
```powershell
npm run build:font-pack
$env:MD_TO_PDF_FONT_PACK_DIR = (Resolve-Path 'output\font-packs\root').Path
docker compose -f deploy\compose.yaml up -d
```
也可以将完整字体包根目录复制到 `.local/font-packs`,直接使用默认配置。
字体包目录以 `:ro` 挂载,容器内非 root 用户不能修改宿主机资产;清单、
许可、文件类型、路径边界、容量和 SHA-256 仍会由运行时注册器再次校验。
字体包缺失、版本不兼容或资源损坏不会阻断 PDF/DOCX 主链,只会产生诊断
并回退到主题字体。
可选字体包二进制位于被 Git 和 Docker 构建上下文忽略的目录,既不提交到
仓库,也不打入应用镜像。更换字体包版本后重启容器即可重新发现;不要在
同一个 `<pack-id>/<semver>` 目录中覆盖不同内容。
发布前可以对已经构建好的镜像执行真实字体包矩阵:
```powershell
$env:MD_TO_PDF_IMAGE = 'yixiong/md-to-pdf:v0.6.0'
$env:MD_TO_PDF_FONT_PACK_DIR = (Resolve-Path 'output\font-packs\root').Path
npm run verify:docker-font-pack
```
该命令要求本机 Docker 引擎已经启动,镜像已经存在,并且字体包已通过
`npm run build:font-pack` 生成。验收会依次挂载空目录、有效字体包和篡改
字体包,检查只读挂载、健康状态、Pandoc capability、WOFF2 资源、DOCX
字体部件和损坏后的安全降级;所有临时容器、网络和目录会在结束时清理。
## 运行参数
| 环境变量 | 默认值 | 说明 |
| --- | ---: | --- |
| `MD_TO_PDF_IMAGE` | `md-to-pdf:local` | 构建和运行的镜像标签 |
| `MD_TO_PDF_RUNTIME_BASE_IMAGE` | `node:22-bookworm-slim` | 可选运行时基础镜像 |
| `MD_TO_PDF_REUSE_PLAYWRIGHT_RUNTIME` | `0` | 是否复用基础镜像中的 Chromium |
| `MD_TO_PDF_PORT` | `8080` | 宿主机监听端口 |
| `MD_TO_PDF_THEME_DIR` | `../.local/themes` | 宿主机主题目录 |
| `MD_TO_PDF_FONT_PACK_DIR` | `../.local/font-packs` | 宿主机可选字体包根目录 |
| `MD_TO_PDF_APP_VERSION` | `0.6.0` | 字体包兼容性判断使用的应用版本 |
| `PDF_CONCURRENCY` | `1` | 同时执行的 PDF 任务数 |
| `PDF_MAX_QUEUE` | `4` | 等待队列上限 |
| `PDF_TIMEOUT_MS` | `120000` | 单次 PDF 生成超时 |
增加 PDF 并发会显著增加 Chromium 内存占用。单机部署建议先保持默认值,
再根据文档复杂度和可用内存调整。
容器为 Chromium 提供 1 GiB 共享内存,并以非 root `pwuser` 运行。
构建阶段使用项目锁定的 Playwright `1.62.0` 安装精确匹配的 Chromium
及系统依赖,不依赖版本可能滞后的预制浏览器镜像标签。DOCX 运行时仅
支持 Linux amd64Pandoc 二进制、许可证和版权文件均在构建阶段执行
固定版本与 SHA-256 校验。