Развертывание в Netlify
Netlify предлагает отличный хостинг статических сайтов с щедрым бесплатным тарифом.
Развертывание в один клик
Ручное развертывание
Шаг 1: Подключите репозиторий
- Войдите в Netlify
- Нажмите «Add new site» → «Import an existing project»
- Подключите свой аккаунт GitHub
- Выберите свой форк BentoPDF
Шаг 2: Настройте параметры сборки
| Параметр | Значение |
|---|---|
| Build command | npm run build |
| Publish directory | dist |
| Node version | 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Важно
Заголовки Cross-Origin-Embedder-Policy и Cross-Origin-Opener-Policy необходимы для конвертации Word/ODT/Excel/PowerPoint в PDF. Без них SharedArrayBuffer недоступен, и движок LibreOffice WASM не сможет запуститься.
Заголовки Content-Encoding: gzip для файлов .wasm.gz и .data.gz указывают браузеру распаковывать их автоматически. Без них браузер получает необработанные байты 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) |
Собственный домен
- Перейдите в Site settings → Domain management
- Нажмите «Add custom domain»
- Следуйте инструкциям по настройке DNS
Большие медиафайлы
Для больших файлов WASM рассмотрите включение Netlify Large Media:
bash
netlify lm:setup
git lfs track "*.wasm"Устранение неполадок
Конвертация Word/ODT/Excel в PDF зависает на 55%
Если конвертация документов зависает на 55%, откройте консоль DevTools и проверьте:
js
console.log(window.crossOriginIsolated); // should be true
console.log(typeof SharedArrayBuffer); // should be "function"Если crossOriginIsolated равно false, заголовки COEP/COOP из вашего netlify.toml не применяются. Убедитесь, что файл лежит в корне проекта, и разверните сайт заново.
Если в консоли появляется expected magic word 00 61 73 6d, found 1f 8b 08 08, у файлов .wasm.gz нет заголовков Content-Encoding: gzip. Убедитесь, что блоки [[headers]] для soffice.wasm.gz и soffice.data.gz есть в вашем netlify.toml.
Сборка завершается ошибкой
Проверьте совместимость версии Node:
toml
[build.environment]
NODE_VERSION = "20"Медленная первая загрузка
Включите оптимизацию ресурсов в Site settings → Build & deploy → Asset optimization.