openreader/docs-site/docs/deploy/vercel-deployment.md

3.8 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/ffprobe-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/ffprobe packaging in Vercel functions

ffmpeg-static and ffprobe-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 and ffprobe-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_URL instead 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 run pnpm migrate-fs in a controlled environment when migrating legacy filesystem data.

5. Smoke test after deploy

  1. Upload and read a PDF/EPUB document.
  2. Confirm sync/blob fetch works across refreshes/devices.
  3. Generate at least one audiobook chapter and play/download it.
  4. If using word highlighting, verify timestamps are produced and rendered.