Files
bentopdf/docs/zh/self-hosting/netlify.md
T

140 lines
4.3 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.
# 部署到 Netlify
[Netlify](https://netlify.com) 提供出色的静态站点托管,并有慷慨的免费额度。
## 一键部署
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/alam00000/bentopdf)
## 手动部署
### 步骤 1:连接仓库
1. 登录 [Netlify](https://app.netlify.com)
2. 点击 "Add new site" → "Import an existing project"
3. 连接您的 GitHub 账户
4. 选择您的 BentoPDF 分支
### 步骤 2:配置构建设置
| 设置 | 值 |
| --------- | --------------- |
| 构建命令 | `npm run build` |
| 发布目录 | `dist` |
| Node 版本 | 18+ |
### 步骤 3:部署
点击 "Deploy site" 并等待构建完成。
## 配置文件
在项目根目录创建 `netlify.toml`:
```toml
[build]
command = "npm run build"
publish = "dist"
[build.environment]
NODE_VERSION = "18"
# Required security headers for SharedArrayBuffer (used by LibreOffice WASM)
[[headers]]
for = "/*"
[headers.values]
Cross-Origin-Embedder-Policy = "require-corp"
Cross-Origin-Opener-Policy = "same-origin"
Cross-Origin-Resource-Policy = "cross-origin"
# Pre-compressed LibreOffice WASM binary - must be served with Content-Encoding
[[headers]]
for = "/libreoffice-wasm/soffice.wasm.gz"
[headers.values]
Content-Type = "application/wasm"
Content-Encoding = "gzip"
Cache-Control = "public, max-age=31536000, immutable"
# Pre-compressed LibreOffice WASM data - must be served with Content-Encoding
[[headers]]
for = "/libreoffice-wasm/soffice.data.gz"
[headers.values]
Content-Type = "application/octet-stream"
Content-Encoding = "gzip"
Cache-Control = "public, max-age=31536000, immutable"
# Cache other WASM files
[[headers]]
for = "*.wasm"
[headers.values]
Cache-Control = "public, max-age=31536000, immutable"
Content-Type = "application/wasm"
# SPA routing
[[redirects]]
from = "/*"
to = "/index.html"
status = 200
```
::: warning 重要
Word/ODT/Excel/PowerPoint 转 PDF 需要 `Cross-Origin-Embedder-Policy` 和 `Cross-Origin-Opener-Policy` 标头。缺少它们时,`SharedArrayBuffer` 不可用,LibreOffice WASM 引擎将无法初始化。
`.wasm.gz` 和 `.data.gz` 文件上的 `Content-Encoding: gzip` 标头会告诉浏览器自动解压。缺少这些标头时,浏览器收到的是原始 gzip 字节,WASM 编译会失败。
:::
## 环境变量
在 Site settings → Environment variables 中设置:
| 变量 | 说明 |
| ----------------------- | -------------------------------------------------------- |
| `SIMPLE_MODE` | 设为 `true` 以使用精简构建 |
| `VITE_BRAND_NAME` | 自定义品牌名称(替换 "BentoPDF") |
| `VITE_BRAND_LOGO` | 相对于 `public/` 的标志路径(例如 `images/my-logo.svg`) |
| `VITE_FOOTER_TEXT` | 自定义页脚/版权文字 |
| `VITE_DEFAULT_LANGUAGE` | 默认界面语言(例如 `fr`、`de`、`es`) |
## 自定义域名
1. 前往 Site settings → Domain management
2. 点击 "Add custom domain"
3. 按照说明配置 DNS
## 大型媒体文件
对于较大的 WASM 文件,可以考虑启用 [Netlify Large Media](https://docs.netlify.com/large-media/overview/):
```bash
netlify lm:setup
git lfs track "*.wasm"
```
## 故障排除
### Word/ODT/Excel 转 PDF 卡在 55%
如果文档转换卡在 55%,请打开开发者工具控制台并检查:
```js
console.log(window.crossOriginIsolated); // should be true
console.log(typeof SharedArrayBuffer); // should be "function"
```
如果 `crossOriginIsolated` 为 `false`,说明 `netlify.toml` 中的 COEP/COOP 标头没有生效。请确认该文件位于项目根目录,然后重新部署。
如果您在控制台看到 `expected magic word 00 61 73 6d, found 1f 8b 08 08`,说明 `.wasm.gz` 文件缺少 `Content-Encoding: gzip` 标头。请确保 `netlify.toml` 中包含 `soffice.wasm.gz` 和 `soffice.data.gz` 的 `[[headers]]` 块。
### 构建失败
检查 Node 版本兼容性:
```toml
[build.environment]
NODE_VERSION = "20"
```
### 首次加载缓慢
在 Site settings → Build & deploy → Asset optimization 中启用资源优化。