Storage
Connect S3 compatible object storage and configure CORS
omnipaper keeps document files in S3 compatible object storage. Postgres holds metadata only. Connect a bucket after first login in Settings → Storage.
Supported providers: Cloudflare R2, AWS S3, MinIO.
Connect a bucket
Pick a provider, fill in the fields, Test connection, then Save:
| Provider | You enter | Example |
|---|---|---|
| Cloudflare R2 | Bucket, Endpoint, Access Key ID, Secret Access Key | https://<account_id>.r2.cloudflarestorage.com |
| AWS S3 | Bucket, Region, Access Key ID, Secret Access Key | Region eu-central-1 |
| MinIO | Bucket, Endpoint, Access Key ID, Secret Access Key | https://minio.example.com |
Region (S3) and endpoint (R2, MinIO) are the only provider specific fields. Test connection does a real round trip to the bucket.
CORS
Add this rule to your bucket. Replace https://omnipaper.example.com with your APP_URL (scheme, host, port, no trailing slash).
Cloudflare R2 and AWS S3
[
{
"AllowedOrigins": ["https://omnipaper.example.com"],
"AllowedMethods": ["GET", "HEAD", "PUT"],
"AllowedHeaders": ["Range"],
"ExposeHeaders": ["Content-Range", "Accept-Ranges", "Content-Length"],
"MaxAgeSeconds": 3600
}
]R2: bucket → Settings → CORS Policy. S3: Permissions → Cross origin resource sharing (CORS).
MinIO
CORS is server wide via MINIO_API_CORS_ALLOW_ORIGIN (comma separated origins). Default is * so preview works out of the box. To restrict:
MINIO_API_CORS_ALLOW_ORIGIN=https://omnipaper.example.comRestart MinIO for the change to take effect.
Verify
Open a PDF in the app. If preview fails, confirm AllowedOrigins matches APP_URL exactly.