# Grouprise 4.0.0 Release date: *2021-06-30* ## New configuration format Previously *grouprise* was configured directly via [Django settings](/administration/configuration/options-django) (e.g. `/etc/grouprise/settings.py`). This caused problems for the automation of configuration changes and it introduced the complexity of using code instead of a pure data definition. The [new configuration mechanism](/administration/configuration/options) uses the [YAML](https://yaml.org/) format and supports multiple configuration files. The old configuration will be used as long as `/etc/grouprisee/settings.py` exists, but you are encouraged to migrate to the new format as soon as possible. Migrate your old settings to the new ones: 1. upgrade *grouprise* to v4.0 1. create the directory `/etc/grouprise/conf.d/` 1. manually convert the old settings (`/etc/grouprisee/settings.py`) to the new format (e.g. `/etc/grouprise/conf.d/local.yaml`, see below for comprehensive examples) 1. rename or remove the old configuration file (`/etc/grouprisee/settings.py`) 1. restart the *grouprise* service ### Migration examples * `from grouprise.common_settings import *`: * discard this line * `SECRET_KEY = '...'` * `secret_key: '...'` [[doc](../administration/configuration/options.html#secret-key)] * `ALLOWED_HOSTS` * this line can be discarded under most circumstances * see [extra_allowed_hosts](../administration/configuration/options.html#extra-allowed-hosts) for special cases * `DATABASES = {'default': {'engine': '... 'name: '...'}}`: * `database: { engine: ..., name: ... }` [[doc](../administration/configuration/options.html#database)] * `SESSION_COOKIE_AGE = 60 * 60 * 24 * 365`: * `session_cookie_age: 31536000` [[doc](../administration/configuration/options.html#session-cookie-age)] * `ADMINS = [ ... ]` * `log_recipient_emails: [ ... ]` [[doc](../administration/configuration/options.html#log-recipient-emails)] * `DEFAULT_FROM_EMAIL = '...'`: * `default_from_email: ...` [[doc](../administration/configuration/options.html#default-from-email)] * `SERVER_EMAIL = '...'`: * can be discarded (indirectly configured via `default_from_email`) * `SECURE_CONTENT_TYPE_NOSNIFF`: * can be discarded (enabled by default since *grouprise* v4.0) * `ACCOUNT_DEFAULT_HTTP_PROTOCOL`, `SECURE_PROXY_SSL_HEADER`, `SECURE_HSTS_SECONDS`, `SECURE_HSTS_INCLUDE_SUBDOMAINS`, `SECURE_SSL_REDIRECT`, `SESSION_COOKIE_SECURE`, `CSRF_COOKIE_SECURE`: * indirectly configured via `transport_security` [[doc](../administration/configuration/options.html#transport-security)] * `TEMPLATES[0]['DIRS'] += '...'`: * `template_directories: [ ... ]` [[doc](../administration/configuration/options.html#template-directories)] * `DEBUG: False`: * `debug: false` [[doc](../administration/configuration/options.html#debug)] * `GROUPRISE['BACKUP_PATH'] = '...'`: * `backup_path: ...` [[doc](../administration/configuration/options.html#backup-path)] * `GROUPRISE['CLAIMS'] = [ ... ]`: * `claims: [ ... ]` [[doc](../administration/configuration/options.html#claims)] * `GROUPRISE['DEFAULT_DISTINCT_FROM_EMAIL'] = '...'`: * `default_distinct_from_email: ...` [[doc](../administration/configuration/options.html#default-distinct-from-email)] * `GROUPRISE['DEFAULT_REPLY_TO_EMAIL'] = '...'`: * `default_reply_to_email: ...` [[doc](../administration/configuration/options.html#default-reply-to-email)] * `GROUPRISE['COLLECTOR_MAILBOX_ADDRESS']` and `GROUPRISE['MAILBOX_DELIVERED_TO_EMAIL']` * `collector_mailbox_address: ...` [[doc](../administration/configuration/options.html#collector-mailbox-address)] * `GROUPRISE['POSTMASTER_EMAIL'] = '...'`: * `postmaster_email: ...` [[doc](../administration/configuration/options.html#postmaster-email)] * `GROUPRISE['MAILINGLIST_ENABLED'] = True`: * `mailinglist_enabled: true` [[doc](../administration/configuration/options.html#mailinglist-enabled)] * `GROUPRISE['BRANDING_LOGO_BACKDROP']`, `GROUPRISE['BRANDING_LOGO_FAVICON']`, `GROUPRISE['BRANDING_LOGO_SQUARE']`, `GROUPRISE['BRANDING_LOGO_TEXT']`: * see [[documentation](../administration/configuration/options.html#branding-logo-backdrop)] ```yaml branding: logo_backdrop: ... logo_favicon: ... logo_square: ... logo_text: ... ``` * `GROUPRISE['FEED_IMPORTER_GESTALT_ID'] = 42`: * `feed_importer_gestalt_id: 42` [[doc](../administration/configuration/options.html#feed-importer-gestalt-id)] * `GROUPRISE['OPERATOR_GROUP_ID'] = 1`: * `operator_group_id: 1` [[doc](../administration/configuration/options.html#operator-group-id)] * `GROUPRISE['UNKNOWN_GESTALT_ID'] = 23`: * `unknown_gestalt_id: 23` [[doc](../administration/configuration/options.html#unknown-gestalt-id)] * `GROUPRISE['SCORE_CONTENT_AGE'] = 100`: * `score_content_age: 100` [[doc](../administration/configuration/options.html#score-content-age)] * `GROUPRISE['UPLOAD_MAX_FILE_SIZE'] = 10`: * `upload_max_file_size: 10` [[doc](../administration/configuration/options.html#upload-max-file-size)] * `CSP_DEFAULT_SRC`, `CSP_SCRIPT_SRC`, `CSP_CONNECT_SRC`: * see [documentation](../administration/configuration/options.html#content-securicy-policy-csp) ```yaml csp: default_src: - "https://matomo.grouprise.org/" script_src: - "https://matomo.grouprise.org/" - "'sha256-J/TOUvP2iy3vYT4YNCGNCxigNR11I1/ut517suNX1hk='" connect_src: - foo ``` * anything else? * create a separate Django configuration file (e.g. `/etc/grouprise/django_settings.py`) with the remaining settings * add the setting [extra_django_settings_filenames](../administration/configuration/options.html#extra-django-settings-filenames) to your new *grouprise* configuration file: ```yaml extra_django_settings_filenames: - /etc/grouprise/django_settings.py ```