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'].valuebypasses the override, the same as in 1.x. Useregistry['key'],registry.get('key'), or aRecordsProxy(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
EnvOverrideRegistryclass 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:uninstallprofile 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.
- CHANGES.md -- changelog
License
GPL-2.0-only
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file plone_registryfromenviron-2.0.0.tar.gz.
File metadata
- Download URL: plone_registryfromenviron-2.0.0.tar.gz
- Upload date:
- Size: 19.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e48665795e78cf1dcaaaac8f1cbe4379d64a277e836f8fa9fbdc2a958daacc8
|
|
| MD5 |
209382e18ae2ff44ee07745f86e4aca2
|
|
| BLAKE2b-256 |
fdfd9c21e5e693498677bf395859f5011e6933f8f9a2f894efc36465f6ed71b4
|
Provenance
The following attestation bundles were made for plone_registryfromenviron-2.0.0.tar.gz:
Publisher:
release.yaml on bluedynamics/plone-registryfromenviron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
plone_registryfromenviron-2.0.0.tar.gz -
Subject digest:
0e48665795e78cf1dcaaaac8f1cbe4379d64a277e836f8fa9fbdc2a958daacc8 - Sigstore transparency entry: 1347364262
- Sigstore integration time:
-
Permalink:
bluedynamics/plone-registryfromenviron@a5144411c9b47404d7545f85ead84785afe21f97 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/bluedynamics
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@a5144411c9b47404d7545f85ead84785afe21f97 -
Trigger Event:
release
-
Statement type:
File details
Details for the file plone_registryfromenviron-2.0.0-py3-none-any.whl.
File metadata
- Download URL: plone_registryfromenviron-2.0.0-py3-none-any.whl
- Upload date:
- Size: 9.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f068347de51997dfe2d443d8a55ce17f8a1c742caa04f0014e175c3e163ebbc
|
|
| MD5 |
042bfca3cf595e4413598faae720d1f7
|
|
| BLAKE2b-256 |
34c942be19c603b50fb082b3b14bdc687618a58ce6ec7b3867ae7a4330dbf5a0
|
Provenance
The following attestation bundles were made for plone_registryfromenviron-2.0.0-py3-none-any.whl:
Publisher:
release.yaml on bluedynamics/plone-registryfromenviron
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
plone_registryfromenviron-2.0.0-py3-none-any.whl -
Subject digest:
2f068347de51997dfe2d443d8a55ce17f8a1c742caa04f0014e175c3e163ebbc - Sigstore transparency entry: 1347364347
- Sigstore integration time:
-
Permalink:
bluedynamics/plone-registryfromenviron@a5144411c9b47404d7545f85ead84785afe21f97 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/bluedynamics
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@a5144411c9b47404d7545f85ead84785afe21f97 -
Trigger Event:
release
-
Statement type: