Replace ffprobe-static with ffmpeg-static for metadata extraction in migration scripts. This removes the requirement for ffprobe binaries across Docker, CI, and Vercel environments, simplifying the dependency graph.
3.7 KiB
| title |
|---|
| Vercel Deployment |
This guide covers deploying OpenReader WebUI to Vercel with external Postgres and S3-compatible object storage.
What works on Vercel
- Documents (PDF/EPUB/TXT/MD) work with
POSTGRES_URL+ external S3 storage. - Audiobook routes work on Node.js serverless functions using
ffmpeg-static.
:::warning DOCX Conversion Limitation
docx conversion requires soffice (LibreOffice), which is not available in a standard Vercel runtime.
:::
1. Environment Variables
Recommended production setup (auth enabled):
POSTGRES_URL=postgres://...
USE_EMBEDDED_WEED_MINI=false
S3_ACCESS_KEY_ID=...
S3_SECRET_ACCESS_KEY=...
S3_BUCKET=...
S3_REGION=us-east-1
S3_PREFIX=openreader
BASE_URL=https://your-app.vercel.app
AUTH_SECRET=...
NEXT_PUBLIC_NODE_ENV=production
# Optional client/runtime feature overrides:
# NEXT_PUBLIC_ENABLE_AUDIOBOOK_EXPORT=false
# NEXT_PUBLIC_ENABLE_WORD_HIGHLIGHT=true
# Optional (non-AWS S3-compatible providers):
# S3_ENDPOINT=https://...
# S3_FORCE_PATH_STYLE=true
:::info NEXT_PUBLIC_* feature flags
NEXT_PUBLIC_ENABLE_AUDIOBOOK_EXPORT=false: hides audiobook export UI entry points.NEXT_PUBLIC_ENABLE_WORD_HIGHLIGHT=true: enables word-highlight UI and timestamp alignment requests. :::
:::warning NEXT_PUBLIC_NODE_ENV behavior
Use NEXT_PUBLIC_NODE_ENV=production on Vercel unless you explicitly want dev-oriented client behavior.
With production:
- Footer is shown in the app shell
- DOCX upload/conversion option is hidden
- Default provider/model behavior is production-oriented
- DeepInfra model picker is restricted without an API key
- Privacy modal shows hosted-service/operator wording
- Dev-only destructive document actions are hidden
With unset/non-production, the inverse dev behavior applies.
Full details: Environment Variables. :::
:::warning Auth recommendation
For internet-exposed Vercel deployments, set both BASE_URL and AUTH_SECRET. Running without auth is possible, but not recommended for public environments.
:::
:::tip For all variables and defaults, see Environment Variables. :::
2. FFmpeg packaging in Vercel functions
ffmpeg-static binaries must be included in function traces. This repo already does that in next.config.ts via outputFileTracingIncludes for:
/api/audiobook/api/audiobook/chapter/api/audiobook/status/api/whisper
:::info
serverExternalPackages should include ffmpeg-static so package paths resolve at runtime instead of being bundled into route output.
:::
If you change route paths or split handlers, update outputFileTracingIncludes accordingly.
3. Function memory sizing
FFmpeg workloads benefit from more memory/CPU. This repo includes:
{
"$schema": "https://openapi.vercel.sh/vercel.json",
"functions": {
"app/api/audiobook/route.ts": { "memory": 3009 },
"app/api/whisper/route.ts": { "memory": 3009 }
}
}
Adjust memory per route if your files are larger or your plan differs.
4. Runtime expectations and caveats
- Audiobook APIs require S3 configuration; otherwise they return
503. - For production Vercel deploys, use
POSTGRES_URLinstead of SQLite. - Filesystem-to-object-store migrations run via server scripts/entrypoint (
scripts/migrate-fs-v2.mjs), not API routes. - Vercel deployments do not run
scripts/openreader-entrypoint.mjs, so runpnpm migrate-fsin a controlled environment when migrating legacy filesystem data.
5. Smoke test after deploy
- Upload and read a PDF/EPUB document.
- Confirm sync/blob fetch works across refreshes/devices.
- Generate at least one audiobook chapter and play/download it.
- If using word highlighting, verify timestamps are produced and rendered.