Configuration Reference
This page provides a reference of configuration helpers available in NRP-based repositories through the oarepo.config module.
configure_generic_parameters
A comprehensive setup helper that initializes a broad set of repository-wide configuration defaults.
It covers core aspects such as site URLs, authentication, security headers, localization, database, search, cache, job backends, file storage, and RDM-specific features.
Use this as a baseline initializer for a NRP repository before applying any of your custom config overrides.
Defined in oarepo/config/generic_parameters.py.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| languages | sequence of tuples | (("cs", _("Czech")),) | Sequence of (code, translated-name) pairs to register as available languages. |
The helper reads additional environment/variable flags and exposes many other optional behaviors; consult the implementation for the full list.
Effect
Calling configure_generic_parameters() has a wide-ranging impact on application configuration:
Application & Site URLs
- Defines
SITE_UI_URLandSITE_API_URLusing either environment-provided values or constructed defaults from host/port. - Sets
APP_ALLOWED_HOSTSto allow local access (0.0.0.0,localhost,127.0.0.1).
Security
- Constructs the baseline
APP_DEFAULT_SECURE_HEADERSdictionary — CSP defaults, HTTPS enforcement, frame options, cookie security, HSTS. Appends the S3 endpoint todefault-srcwhen S3 storage is configured. The value is then extended byconfigure_ui(license badges, Matomo). See Security headers for the full defaults and how to customize them. - Enables secure cookies (
SESSION_COOKIE_SECURE=True) and sets saneStrict-Transport-Securitydefaults. - Enables local login and fine-grained security features (registration, password recovery, confirmation) via environment toggles (
INVENIO_SECURITY_*). - Configures rate limits for guest and authenticated users (
RATELIMIT_GUEST_USER,RATELIMIT_AUTHENTICATED_USER).
Authentication
- Enables OAuth/autologin redirects (
OAUTHCLIENT_AUTO_REDIRECT_TO_EXTERNAL_LOGIN). - Defines empty
OAUTHCLIENT_REMOTE_APPSready to be populated with external identity providers. - Sets
ACCOUNTS_LOGIN_VIEW_FUNCTIONto auto-redirect when single external login is configured.
Database
- Constructs
SQLALCHEMY_DATABASE_URIfromINVENIO_DATABASE_*environment variables if not provided directly. - Uses PostgreSQL by default.
Internationalization
- Sets default locale (
BABEL_DEFAULT_LOCALE="en") and timezone (Europe/Prague). - Registers available UI languages from the
languagesargument intoI18N_LANGUAGES.
File Storage & S3
- Defaults to S3-based storage with fallback to local:
FILES_REST_STORAGE_FACTORY = "invenio_s3.s3fs_storage_factory"- Constructs
S3_ENDPOINT_URL,S3_ACCESS_KEY_ID, andS3_SECRET_ACCESS_KEY.
- Adds S3 endpoint to CSP’s
default-src. - Defines
FILES_REST_STORAGE_CLASS_LISTand default storage class. - Sets file serving cache max-age (
SEND_FILE_MAX_AGE_DEFAULT = 300).
User Profiles
- Allows editing of profile info (
USERPROFILES_READ_ONLY = False).
Search
- Configures OpenSearch connection (
SEARCH_INDEX_PREFIX,SEARCH_HOSTS,SEARCH_CLIENT_CONFIG). - Supports SSL and certificate-based setups through environment variables.
Caching & Background Tasks
- Enables Redis caching (
INVENIO_CACHE_TYPE = "redis"). - Constructs Redis URLs for caches, sessions, communities, and Celery results.
- Configures Celery broker (RabbitMQ by default) and Redis result backend.
JSON Schemas & Record Configuration
- Sets
RECORDS_REFRESOLVER_CLS,RECORDS_REFRESOLVER_STORE, andJSONSCHEMAS_HOST. - Optionally imports and sets
VOCABULARIES_*configuration classes ifoarepo-vocabulariesis available.
RDM-Specific Settings
- Enables RDM features (
INVENIO_RDM_ENABLED=True). - Sets defaults for:
- Persistent identifiers (
RDM_PERSISTENT_IDENTIFIERS,RDM_PARENT_PERSISTENT_IDENTIFIERS). - User moderation, metadata-only records, file enablement.
- Archive download support.
- DOI/DataCite test mode.
- Persistent identifiers (
- Configures identifier validation schemes for persons, organizations, funders, affiliations, etc. (
VOCABULARIES_*_SCHEMES,RDM_RECORDS_*_SCHEMES).
- Sets
MAIL_DEFAULT_SENDER(from environment or placeholder). - Enables
MAIL_SUPPRESS_SENDif configured in environment.
Miscellaneous
- Defines rate limits and quota defaults (
APP_RDM_DEPOSIT_FORM_QUOTA,FILES_REST_DEFAULT_QUOTA_SIZE). - Sets
SECRET_KEYfrom environment. - Provides
DASHBOARD_RECORD_CREATE_URLplaceholder (to be customized). - Clears default Invenio record routes and endpoints (since NRP provides replacements).
Environment-driven
The helper relies heavily on load_configuration_variables() to pull all INVENIO_* prefixed environment variables (or values from an equivalent .env/variable store).
All discovered values are injected into the caller scope via set_constants_in_caller().
Example
from invenio_i18n import lazy_gettext as _
from oarepo import config
config.configure_generic_parameters(
languages=(("en", _("English")), ("cs", _("Czech"))),
)configure_ui
Configures UI branding, theming, and build-time integration for an NRP or InvenioRDM-based repository.
This helper establishes the front-end metadata, asset pipeline defaults, theme template layout, and optional analytics integration.
Defined in oarepo/config/ui.py.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
code | str | "myrepo" | Short repository identifier used in internal theme names, URLs, and build integration. |
name | str | _('My Repository') | Translated display name for the repository, used in UI titles and metadata. |
description | str | "" | Human-readable description of the repository displayed in various templates and metadata. |
use_default_frontpage | bool | False | If True, uses the standard default front page layout instead of a custom one. |
show_frontpage_intro | bool | True | Controls whether the front-page introduction (hero/intro section) is displayed. |
analytics | bool | False | Enables analytics integration. Set to "matomo" to enable Matomo tracking (requires additional environment vars). |
csp | CSP | None | None | Optional Content-Security-Policy additions, declared as a config.CSP instance. Merged with the APP_DEFAULT_SECURE_HEADERS baseline via CSP.apply_defaults() following CSP’s fallback rules, so adding e.g. connect_src doesn’t drop the existing default-src sources. See Security headers. |
Effects
Calling configure_ui() populates numerous UI- and frontend-related configuration constants:
Theming & Templates
- Defines the application theme chain (
APP_THEME) including the repository code,oarepo, andsemantic-uilayers. - Points to a custom
INSTANCE_THEME_FILE(./less/theme.less) for repository-specific LESS theme overrides. - Configures all core page templates (e.g.,
BASE_TEMPLATE,HEADER_TEMPLATE,FOOTER_TEMPLATE,FRONTPAGE_TEMPLATE,SETTINGS_TEMPLATE, etc.). - Ensures template load order avoids Invenio issues by explicitly setting
SETTINGS_TEMPLATEandHEADER_TEMPLATE. - Enables
SEARCH_UI_SEARCH_TEMPLATEfor InvenioRDM-style search results.
Branding & Identity
- Sets
THEME_SITENAME,THEME_FRONTPAGE_TITLE, andREPOSITORY_NAMEbased onnameparameter. - Defines
REPOSITORY_DESCRIPTIONfor use in metadata and templates. - Configures
THEME_LOGO, optionalTHEME_FRONTPAGE_LOGO, and intro visibility (THEME_SHOW_FRONTPAGE_INTRO_SECTION). THEME_FRONTPAGEtoggles whether the default front page is used.
Analytics Integration
- If
analytics="matomo"and the deployment is not local, adds Matomo tracking:MATOMO_ANALYTICS_TEMPLATE = "oarepo_ui/matomo_analytics.html"- Reads
INVENIO_MATOMO_ANALYTICS_URLandINVENIO_MATOMO_ANALYTICS_SITE_IDfrom environment. - Appends the Matomo endpoint URL to
default-srcofAPP_DEFAULT_SECURE_HEADERS’sContent-Security-Policy(the helper also always appendshttps://licensebuttons.net/for license badge images). See Security headers.
Frontend Build Configuration
- Configures frontend build pipeline defaults:
JAVASCRIPT_PACKAGES_MANAGER = "pnpm"ASSETS_BUILDER = "rspack"WEBPACKEXT_NPM_PKG_CLS = "pynpm:PNPMPackage"WEBPACKEXT_PROJECT = "oarepo_ui.webpack:project"
- These ensure compatibility with the NRP/RDM Rspack + pnpm-based build s
Example
config.configure_ui(
code="myrepo",
name=_("My NRP Repository"),
description=_("My NRP-based repository for research data."),
analytics="matomo",
use_default_frontpage=False,
show_frontpage_intro=True,
csp=config.CSP(
connect_src=["https://api.example.org"],
),
)configure_cron
Register default Celery beat schedules for background tasks such as indexing, session cleanup, statistics processing, and cache invalidation.
Additional cron definitions can be provided via keyword arguments.
Defined in oarepo/config/cron.py.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| **extra_cron_items | dict[str, Any] | {} | Extra Celery beat entries to merge into the default schedule (e.g., additional periodic jobs). |
Effect
Defines the CELERY_BEAT_SCHEDULE constant in the caller’s module.
The schedule includes default periodic jobs for:
- Record indexing queue management: every 10 seconds
- Session cleanup: every 60 minutes
- IP deletion: every 6 hours
- Statistics event processing: hourly at minutes 25 and 55
- Statistics aggregation: hourly at minute 0
- Community cache clearing: daily at 01:00 UTC
- Expired access token cleanup: daily at 00:04 UTC
Any extra cron items passed as keyword arguments are merged into the schedule before being set.
Example
from oarepo import config
from datetime import timedelta
from celery.schedules import crontab
config.configure_cron(
my_custom_task={
"task": "my_package.tasks.cleanup_temp",
"schedule": crontab(minute=30, hour=3), # every day at 03:30 UTC
},
)configure_stats
Enable and initialize repository & record-level statistics collection and aggregation features provided by invenio-stats.
This helper activates event receivers and imports default event, aggregation, and query definitions from invenio-app-rdm.
Defined in oarepo/config/stats.py.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| enable | bool | True | Whether to enable registration of statistics event receivers and related analytics features. |
Effect
- Sets
STATS_REGISTER_RECEIVERSto control activation of statistics event receivers. - Imports and applies default
STATS_EVENTS,STATS_AGGREGATIONS,STATS_QUERIES, andSTATS_PERMISSION_FACTORYfrominvenio_app_rdm.config. - Makes these constants available to the caller, so that the repository inherits the default InvenioRDM statistics setup.
Example
from oarepo import config
# Enable statistics collection and aggregation
config.configure_stats()
# Disable all statistics receivers (e.g., in development)
config.configure_stats(enable=False)configure_vocabulary
Register or extend controlled vocabularies used in the repository.
Each vocabulary is identified by a short code and associated metadata parameters that describe its configuration or source.
Be consistent with your vocabularies defined in app_data folder.
Defined in oarepo/config/vocabulary.py.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| code | str | — | Unique identifier for the vocabulary type (e.g., "licenses", "languages"). |
| **kwargs | dict[str, Any] | {} | Arbitrary metadata for the vocabulary, such as loader configuration, schema, or labels. |
Effect
- Updates the
INVENIO_VOCABULARY_TYPE_METADATAdictionary in the caller’s configuration with a new entry keyed bycode. - Makes vocabulary type metadata available at runtime for vocabulary registration and CLI loading.
- Supports multiple calls to incrementally register several vocabularies.
Example
from oarepo import config
config.configure_vocabulary(
"licenses",
pid_type="lic",
hierarchical=True,
name={"en": "Licenses", "cs": "Licence"},
)configure_communities
Configure community-related settings, role definitions, and permission policies for Invenio Communities integration.
Defines how community membership and CRUD permissions are structured within the repository.
Defined in oarepo/config/communities.py.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| communities_roles | list[dict] | None (uses built-in defaults) | Optional custom role definitions. If omitted, defaults to the built-in ordered list of "owner", "curator", and "member" roles. Each role dictionary can include fields such as name, title, description, is_owner, can_manage, and can_manage_roles. |
Default role definitions
If communities_roles is not provided, the following default roles are applied:
-
owner
name:"owner"title:_('Community owner')description:_('Can manage community.')is_owner:Truecan_manage:Truecan_manage_roles:["owner", "curator", "member"]
-
curator
name:"curator"title:_('Curator')description:_('Can curate records.')can_manage:Truecan_manage_roles:["member"]
-
member
name:"member"title:_('Member')description:_('Community member with read permissions.')
Effect
Sets the following constants in the caller module:
COMMUNITIES_REGISTER_UI_BLUEPRINT = FalseCOMMUNITIES_PERMISSION_POLICY = DefaultCommunitiesPermissionPolicy- A custom permission policy extending
CommunityPermissionPolicy, grantingAdministrationandSystemProcessprivileges for core actions. - If
oarepo_communitiesis installed, integrates thePrimaryCommunityRolegenerator for finer-grained role control.
- A custom permission policy extending
COMMUNITIES_ROLES— list of role dictionaries (ordered by importance).
Example
from invenio_i18n import lazy_gettext as _
from oarepo import config
config.configure_communities(
communities_roles=[
dict(
name="root",
title=_("Root administrator"),
description=_("Can administer community."),
is_owner=True,
can_manage=True,
can_manage_roles=["root", "librarian", "reader"],
),
dict(
name="librarian",
title=_("Librarian"),
description=_("Can curate community records."),
can_manage=True,
can_manage_roles=["reader"],
),
dict(
name="reader",
title=_("Reader"),
description=_("Can read community records."),
),
]
)
register_workflow
Register a workflow with its display name, permission policy, and request policy.
Workflows define how deposits are handled in the repository, including approval processes, permissions, and request types.
Defined in oarepo/config/workflows.py.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| name | str | — | Unique identifier for the workflow (e.g., "default", "individual"). |
| title | str | — | Translated display name for the workflow, shown in UI and metadata. |
| permissions_class | str | — | Dotted import path to the permission policy class that defines who can perform actions in this workflow. |
| requests_class | str | — | Dotted import path to the request policy class that defines what types of requests (review, deletion, versioning) are supported. |
Effect
- Registers a new workflow in the
WORKFLOWSdictionary in the caller’s configuration. - Each workflow entry maps the
nameto a dictionary containingtitle,permissions_class, andrequests_class. - Makes the workflow available for use in community or individual deposit configurations.
- Supports different approval processes: community workflows with curator/owner approval, or simpler individual workflows.
Example
from invenio_i18n import lazy_gettext as _
from oarepo import config
# Full workflow for community deposits:
# requires approval from curators/owners before publishing
# and supports review, versioning, and deletion requests.
config.register_workflow(
"default",
_("Default workflow"),
"common.workflows.default.DefaultWorkflowPermissions",
"common.workflows.default.DefaultWorkflowRequests",
)
# Simple workflow for individual deposits:
# fewer rules, no full approval process like in communities,
# mostly basic permissions for creating and managing records.
config.register_workflow(
"individual",
_("Individual deposition workflow"),
"common.workflows.individual.IndividualDepositionWorkflowPermissions",
"oarepo_workflows.requests.policy.WorkflowRequestPolicy",
)Common configuration topics
The helpers above are the building blocks; this section expands on a few cross-cutting configuration values they manage, so you can adjust them safely when needed.
Security headers (APP_DEFAULT_SECURE_HEADERS)
NRP repositories configure HTTP security headers through the standard Invenio
APP_DEFAULT_SECURE_HEADERS
variable. Invenio applies these headers to every response it serves.
Two of the configuration helpers collaborate to build the dictionary:
configure_generic_parameterssets the baseline — a full security-header dictionary with the CSP, HTTPS enforcement, cookie, and HSTS defaults listed below, plus theS3_ENDPOINT_URLappended todefault-srcwhen S3 storage is used.configure_uithen extends the value prepared byconfigure_generic_parameters— it appendshttps://licensebuttons.net/todefault-srcso license badge images load, and, whenanalytics="matomo"is used on a non-local deployment, appends the Matomo endpoint URL fromINVENIO_MATOMO_ANALYTICS_URL.
The baseline produced by configure_generic_parameters() looks like this:
APP_DEFAULT_SECURE_HEADERS = {
"content_security_policy": {
"default-src": [
"'self'",
"fonts.googleapis.com", # for fonts
"*.gstatic.com", # for fonts
"data:", # for fonts
"'unsafe-inline'", # for inline scripts and styles
"blob:", # for pdf preview
],
"script-src": [
"'self'",
"blob:",
"'wasm-unsafe-eval'", # checksum Web Worker (hash-wasm) for multipart uploads
],
},
"content_security_policy_report_only": False,
"content_security_policy_report_uri": None,
"force_file_save": False,
"force_https": True,
"force_https_permanent": False,
"frame_options": "sameorigin",
"frame_options_allow_from": None,
"session_cookie_http_only": True,
"session_cookie_secure": True,
"strict_transport_security": True,
"strict_transport_security_include_subdomains": True,
"strict_transport_security_max_age": 31556926, # one year, in seconds
"strict_transport_security_preload": False,
}Customizing the CSP
Do not edit APP_DEFAULT_SECURE_HEADERS by hand for routine CSP changes — pass a
config.CSP instance
to configure_ui() via its csp= argument instead. The helper merges your directives with
the already-configured defaults, following the CSP specification’s own fallback rules, so
you don’t accidentally drop sources the application still needs:
from oarepo import config
config.configure_generic_parameters()
config.configure_ui(
code="myrepo",
name=_("My NRP Repository"),
csp=config.CSP(
# let the deposit form call an external vocabulary API from the browser
connect_src=["https://api.example.org"],
# allow embedding this repository in an iframe on the same origin
frame_ancestors=["'self'"],
),
)CSP is a dataclass with one field per directive — default_src, script_src,
script_src_elem, script_src_attr, style_src, style_src_elem, style_src_attr,
img_src, font_src, connect_src, object_src, media_src, frame_src,
frame_ancestors, child_src, worker_src, manifest_src, prefetch_src,
form_action, base_uri, report_to — plus report_uri and report_only
for Flask-Talisman’s reporting options. Each directive field takes a list of sources.
When configure_ui() applies your CSP, it resolves each directive against whatever was
already configured:
- A directive you set is merged with the sources already configured for it, or — if
none — with the sources of the directive it would fall back to (
script-srcforscript-src-elem/script-src-attr,style-srcforstyle-src-elem/style-src-attr,child-srcforframe-src/worker-src, otherwisedefault-src). This is what letscsp=CSP(connect_src=["https://api.example.org"])add to the existingdefault-srcsources instead of replacing them. base_uri,form_action,frame_ancestors,report_tonever inheritdefault-src, matching the CSP spec — setting one only adds the sources you pass in.- A directive you leave unset keeps whatever was already configured, unchanged —
including directives the
CSPclass does not model (e.g.upgrade-insecure-requests). - Your sources come first in the merged source list, followed by the inherited ones, deduplicated.
A report_uri you set overrides one already configured in
APP_DEFAULT_SECURE_HEADERS["content_security_policy_report_uri"]; if you don’t set one,
the configured value is kept as-is. report_only=True switches the policy to
report-only mode (violations are logged, not blocked) and requires a report_uri —
either on the CSP instance or already configured, otherwise apply_defaults() raises
ValueError.
For non-CSP keys (force_https, frame_options, strict_transport_security_*, etc.),
no helper API exists — override them after both helpers, before set_constants_in_caller
publishes the value:
config.configure_generic_parameters()
config.configure_ui(code="myrepo", name=_("My NRP Repository"))
# non-CSP overrides come after both helpers
APP_DEFAULT_SECURE_HEADERS["frame_options"] = "deny"You only need to extend CSP when the browser talks to an additional origin — external vocabulary autocomplete endpoints, analytics providers, embedded media, additional CDNs, and so on. If the call goes through your repository backend instead, no CSP change is needed and cross-origin restrictions do not apply.