Configuration reference#

This page documents all configuration options for the Thumbor image scaling integration. Settings are split between the Plone side (plone.pgthumbor) and the Thumbor side (zodb-pgjsonb-thumborblobloader).

Plone-side settings (plone.pgthumbor)#

Environment variables#

Environment variables take precedence over Plone registry settings. When an environment variable is set, the corresponding registry value is ignored.

Variable

Type

Default

Description

PGTHUMBOR_SERVER_URL

string

(none)

Public URL of the Thumbor server (for example, http://thumbor:8888). Required for Thumbor URL generation. Trailing slashes are stripped automatically.

PGTHUMBOR_SECURITY_KEY

string

""

Shared HMAC-SHA1 key for signing Thumbor URLs. Must match the SECURITY_KEY in thumbor.conf. Required unless PGTHUMBOR_UNSAFE is enabled.

PGTHUMBOR_UNSAFE

boolean

false

Generate unsigned /unsafe/ URLs. Accepts true, 1, or yes (case-insensitive). For development only.

If neither PGTHUMBOR_SECURITY_KEY nor PGTHUMBOR_UNSAFE is set, Thumbor URL generation is disabled and Plone falls back to standard ZODB-based image scaling.

Plone registry (IThumborSettings)#

These settings are editable through the Plone control panel (@@thumbor-settings) and stored in plone.app.registry. Environment variables override these values when set.

Field

Type

Default

Description

server_url

TextLine

""

Public URL of the Thumbor server.

security_key

TextLine

""

Shared HMAC-SHA1 key for signing Thumbor URLs.

unsafe

Bool

False

Generate unsigned URLs (development only).

smart_cropping

Bool

False

Enable Thumbor smart cropping (OpenCV face/feature detection). Applied to scale and cover modes.

paranoid_mode

Bool

False

Always verify image access with Plone for every request, even for publicly accessible content. When disabled, only non-public images use the authenticated 3-segment URL format.

Crop providers (ICropProvider)#

plone.pgthumbor uses a pluggable ICropProvider adapter to look up explicit crop coordinates before generating Thumbor URLs. See Write a custom crop provider for details on writing a custom provider.

Built-in providers:

Provider

Package

Registration

ImageCroppingCropProvider

plone.app.imagecropping

Automatic via conditional ZCML (registered when plone.app.imagecropping is installed).

Interface: plone.pgthumbor.interfaces.ICropProvider

Method

Parameters

Returns

get_crop(fieldname, scale_name)

fieldname (str), scale_name (str)

(left, top, right, bottom) tuple of int, or None

When a crop provider returns coordinates, the generated Thumbor URL includes crop instructions and forces fit_in=True, smart=False. When no provider is registered or the provider returns None, URL generation proceeds based on the scale mode and smart cropping settings.

Thumbor-side settings (zodb-pgjsonb-thumborblobloader)#

All Thumbor-side settings are configured in thumbor.conf.

Loader and handler registration#

Key

Value

Description

LOADER

'zodb_pgjsonb_thumborblobloader.loader'

Registers the blob loader that reads images from the blob_state PostgreSQL table.

HANDLER_LISTS

['zodb_pgjsonb_thumborblobloader.auth_handler']

Registers the auth handler that enforces Plone access control for 3-segment URLs.

Security#

Key

Type

Default

Description

SECURITY_KEY

string

(none)

Thumbor’s HMAC-SHA1 signing key. Must match PGTHUMBOR_SECURITY_KEY on the Plone side.

ALLOW_UNSAFE_URL

boolean

False

Accept unsigned /unsafe/ URLs. Must match PGTHUMBOR_UNSAFE on the Plone side.

PostgreSQL connection#

Key

Type

Default

Description

PGTHUMBOR_DSN

string

(required)

PostgreSQL connection string (for example, dbname=zodb host=localhost port=5432 user=zodb password=zodb).

PGTHUMBOR_POOL_MIN_SIZE

integer

1

Minimum number of connections in the async connection pool.

PGTHUMBOR_POOL_MAX_SIZE

integer

4

Maximum number of connections in the async connection pool.

The loader uses psycopg with AsyncConnectionPool. On first use, it verifies that the blob_state table exists (created by zodb-pgjsonb).

Disk cache#

Key

Type

Default

Description

PGTHUMBOR_CACHE_DIR

string

""

Directory for the local blob cache. Empty string disables caching.

PGTHUMBOR_CACHE_MAX_SIZE

integer

0

Maximum cache size in bytes. 0 disables caching. When the cache exceeds this size, the oldest files (by access time) are evicted until the cache reaches 90% of the limit.

Cache filenames are deterministic: {zoid:016x}-{tid:016x}.blob. Since blobs are addressed by immutable (zoid, tid) pairs, there is no cache invalidation concern – only LRU eviction for space management.

S3 storage (optional)#

When blob data is stored in S3 (instead of or in addition to PG bytea), the loader falls back to S3 if the data column is NULL and s3_key is present.

Key

Type

Default

Description

PGTHUMBOR_S3_BUCKET

string

""

S3 bucket name. Required when blobs use S3 tiering.

PGTHUMBOR_S3_REGION

string

us-east-1

AWS region for the S3 bucket.

PGTHUMBOR_S3_ENDPOINT

string

""

Custom S3 endpoint URL (for MinIO or compatible services). Empty uses the default AWS endpoint.

S3 downloads use boto3 synchronously, wrapped in asyncio.to_thread for compatibility with Thumbor’s async event loop.

Plone auth handler#

Key

Type

Default

Description

PGTHUMBOR_PLONE_AUTH_URL

string

""

Internal URL of the Plone site (for example, http://plone-internal:8080/Plone). Used by the auth handler to call @thumbor-auth. Required for 3-segment authenticated URLs.

PGTHUMBOR_AUTH_CACHE_TTL

integer

60

Auth result cache lifetime in seconds. Cached per (content_zoid, cookie) pair to avoid a Plone round-trip on every image request.

Automatic image format conversion#

Key

Type

Default

Description

AUTO_WEBP

boolean

True

Automatically convert images to WebP when the browser’s Accept header includes image/webp.

AUTO_AVIF

boolean

False

Automatically convert images to AVIF when the browser’s Accept header includes image/avif. More CPU-intensive than WebP; opt-in.

These are standard Thumbor settings. When enabled, format conversion is transparent – the same signed URL serves different formats based on content negotiation.

Smart cropping (detectors)#

Key

Type

Default

Description

DETECTORS

list of strings

[]

Thumbor detector modules for /smart/ URL support. Example: ['thumbor.detectors.face_detector', 'thumbor.detectors.feature_detector']. Requires opencv-python-headless (included in the Docker image).

Detectors run in-process when a URL contains /smart/. Face detection is tried first; feature detection is used as fallback. On the Plone side, enable smart_cropping in the registry so URLs include /smart/.

Result storage (optional)#

Thumbor’s built-in result storage caches the final processed images. This is separate from the blob disk cache (which caches raw originals).

Key

Type

Default

Description

RESULT_STORAGE

string

(none)

Result storage backend, for example, 'thumbor.result_storages.file_storage'.

RESULT_STORAGE_FILE_STORAGE_ROOT_PATH

string

(none)

Directory for file-based result storage.