Skip to main content

Override plone.registry values from environment variables

Project description

plone.registryfromenviron

Override plone.registry values from environment variables.

Plone stores configuration in a persistent registry inside ZODB. This works well for through-the-web editing, but conflicts with modern deployment practices where configuration is injected via environment variables.

This package bridges that gap, making Plone cloud-native and 12-factor app friendly: the same Plone image can run in development, staging and production with different settings -- controlled entirely by environment variables, no ZODB changes needed.

How it works

At import time, the package scans os.environ for PLONE_REGISTRY_* variables. If any are present, it patches plone.registry.registry.Registry.__getitem__ and .get so that reads consult the env-var values first, falling back to ZODB when a key is not overridden. If no matching env vars are set, the package is a silent no-op with zero runtime cost.

All existing registry data is preserved — overrides are read-only and never written to ZODB.

Installation

Add the package to your Plone image / buildout / Python environment. That's it — no GenericSetup profile needs to be applied and nothing is written to ZODB.

The package ships with a plone.registryfromenviron:default profile for backwards compatibility with 1.x, but it is an empty no-op. You may leave it listed as a dependency in your own metadata.xml without any effect.

"Uninstalling" means removing the package from the deployment (and restarting the processes). There is no uninstall profile in 2.0.

Environment variable format

PLONE_REGISTRY_<registry_key>=<value>

Registry keys use dots (e.g. plone.smtp_host). Since dots are not allowed in environment variable names, replace each . with __ (double underscore). Single underscores are preserved as-is.

Examples

# plone.smtp_host = "mail.example.com"
export PLONE_REGISTRY_plone__smtp_host=mail.example.com

# plone.app.theming.interfaces.IThemeSettings.enabled = False
export PLONE_REGISTRY_plone__app__theming__interfaces__IThemeSettings__enabled=false

# plone.cachepurging.interfaces.ICachePurgingSettings.cachingProxies = ["http://varnish:8080"]
export PLONE_REGISTRY_plone__cachepurging__interfaces__ICachePurgingSettings__cachingProxies='["http://varnish:8080"]'

Type coercion

Values are automatically coerced based on the existing registry record's field type:

Field type Env value example Result
Bool true, 1, yes, on True
Bool false, 0, no, off False
Int 42 42
Float 3.14 3.14
TextLine / Text hello "hello"
List ["a", "b"] ["a", "b"]
Tuple ["a", "b"] ("a", "b")
Set ["a", "b"] {"a", "b"}
Dict {"key": "val"} {"key": "val"}

Collection and dict values use JSON syntax.

Behavior

  • Environment variables are scanned once at process startup. Changes require a restart.
  • Activation is automatic: if PLONE_REGISTRY_* variables are present, the patch is applied at first import. If not, nothing happens.
  • Overrides are read-only — writes via the registry API still go to ZODB, but subsequent reads for overridden keys return the env value.
  • Only existing registry keys can be overridden (the field definition is needed for type coercion).
  • Invalid values or unknown keys are logged and silently skipped (ZODB value is used as fallback).
  • Known limitation: direct access via registry.records['key'].value bypasses the override, the same as in 1.x. Use registry['key'], registry.get('key'), or a RecordsProxy (all go through the patched read path).

Upgrading from 1.x

Version 2.0 drops the portal_registry.__class__ swap approach (see issue #1 for the root-cause analysis).

For operators upgrading from 1.x:

  • Deploy 2.0, then click "Upgrade" once in the Plone Add-ons control panel. A GenericSetup upgrade step (1 → 2) clears any stale EnvOverrideRegistry class references from the site root and unregisters the addon from the "Installed" list of the control panel. Runtime activation is driven by env vars; the click only tidies up ZODB and the UI. If you do nothing, the addon keeps working correctly — the cleanup is cosmetic.
  • No uninstall step needed. Stop setting PLONE_REGISTRY_* env vars to deactivate, or remove the package from the deployment.
  • The plone.registryfromenviron:uninstall profile is gone. If your automation calls it, remove the call — it's a no-op.
  • Activation is now import-driven, not install-step-driven. Every pod picks up the behavior immediately on startup; no per-site install run is required anymore.

Source Code and Contributions

The source code is managed in a Git repository, with its main branches hosted on GitHub. Issues can be reported there too.

We'd be happy to see many forks and pull requests to make this package even better. We welcome AI-assisted contributions, but expect every contributor to fully understand and be able to explain the code they submit. Please don't send bulk auto-generated pull requests.

Maintainers are Jens Klein, Johannes Raggam and the BlueDynamics Alliance developer team. We appreciate any contribution and if a release on PyPI is needed, please just contact one of us. We also offer commercial support if any training, coaching, integration or adaptations are needed.

License

GPL-2.0-only

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

plone_registryfromenviron-2.0.0.tar.gz (19.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

plone_registryfromenviron-2.0.0-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file plone_registryfromenviron-2.0.0.tar.gz.

File metadata

File hashes

Hashes for plone_registryfromenviron-2.0.0.tar.gz
Algorithm Hash digest
SHA256 0e48665795e78cf1dcaaaac8f1cbe4379d64a277e836f8fa9fbdc2a958daacc8
MD5 209382e18ae2ff44ee07745f86e4aca2
BLAKE2b-256 fdfd9c21e5e693498677bf395859f5011e6933f8f9a2f894efc36465f6ed71b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for plone_registryfromenviron-2.0.0.tar.gz:

Publisher: release.yaml on bluedynamics/plone-registryfromenviron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file plone_registryfromenviron-2.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for plone_registryfromenviron-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2f068347de51997dfe2d443d8a55ce17f8a1c742caa04f0014e175c3e163ebbc
MD5 042bfca3cf595e4413598faae720d1f7
BLAKE2b-256 34c942be19c603b50fb082b3b14bdc687618a58ce6ec7b3867ae7a4330dbf5a0

See more details on using hashes here.

Provenance

The following attestation bundles were made for plone_registryfromenviron-2.0.0-py3-none-any.whl:

Publisher: release.yaml on bluedynamics/plone-registryfromenviron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page