Apps Config.php Parameters


This document describes parameters for apps maintained by ownCloud that are not part of the core system. All keys are only valid if the corresponding app is installed and enabled. You must copy the keys needed to the active config.php file.

Multiple configuration files

ownCloud supports loading configuration parameters from multiple files. You can add arbitrary files ending with .config.php in the config/ directory.


You could place your email server configuration in email.config.php. This allows you to easily create and manage custom configurations or to divide a large complex configuration file into a set of smaller files. These custom files are not overwritten by ownCloud, and the values in these files take precedence over config.php.

ownCloud may write configurations into config.php. These configurations may conflict with identical keys already set in additional config files. Be careful when using this capability!

App: Activity

Possible keys: activity_expire_days DAYS

Define the retention for activities of the activity app

Code Sample

'activity_expire_days' => 365,

App: Admin Audit

Possible keys: log.conditions ARRAY

Possible keys: admin_audit.groups ARRAY

Configure the path to the log file

Code Sample

'log.conditions' => [
	'apps' => ['admin_audit'],
	  // Adjust the path below, to match your setup
	'logfile' => '/var/www/owncloud/data/admin_audit.log'

Filter the groups that messages are logged for

Code Sample

'admin_audit.groups' => ['group1', 'group2'],

App: Files Antivirus

Possible keys: files_antivirus.av_path STRING

Possible keys: files_antivirus.av_cmd_options STRING

Default path to the clamscan command line anti-virus scanner.

This setting only applies when the operating mode of the files_antivirus app is set to executable mode. See the documentation for more details.

Code Sample

'files_antivirus.av_path' => '/usr/bin/clamscan',

Command line options for the clamscan command line anti-virus scanner.

This setting only applies when the operating mode of the files_antivirus app is set to executable mode. See the documentation for more details.

Code Sample

'files_antivirus.av_cmd_options' => '',

App: Files Versions

Possible keys: versions_retention_obligation STRING

Use following values to configure the retention behaviour. Replace D with the number of days.


Default value if nothing is set

D, auto

Keep versions at least for D days, apply expiration rules to all versions that are older than D days

auto, D

Delete all versions that are older than D days automatically, delete other versions according to expiration rules

D1, D2

Keep versions for at least D1 days and delete when they exceed D2 days


Disable Versions; no files will be deleted.

Pattern to define the expiration date for each backup version created.

Code Sample

'versions_retention_obligation' => 'auto',

App: Firstrunwizard

Possible keys: customclient_desktop URL

Possible keys: customclient_android URL

Possible keys: customclient_ios URL

Configuring the download links for ownCloud clients, as seen in the first-run wizard and on Personal pages

Code Sample

'customclient_desktop' =>
'customclient_android' =>
'customclient_ios' =>


Possible keys: ldapIgnoreNamingRules doSet or false

Possible keys: user_ldap.enable_medial_search BOOL

Define parameters for the LDAP app

Code Sample

'ldapIgnoreNamingRules' => false,
'user_ldap.enable_medial_search' => false,

App: Market

Possible keys: appstoreurl URL

Define the download URL for apps

Code Sample

'appstoreurl' => '',

App: Metrics

Note: This app is for Enterprise customers only.

Possible keys: metrics_shared_secret STRING

Secret to use the Metrics dashboard

You have to set a Metrics secret to use the dashboard. You cannot use the dashboard without defining a secret. You can use any secret you like. In case you want to generate a random secret, use the following example command: echo $(tr -dc 'a-z0-9' < /dev/urandom | head -c 20) It is also possible to set this secret via an occ command which writes key and data to the config.php file. Please see the occ command documentation for more information.

Code Sample

'metrics_shared_secret' => 'replace-with-your-own-random-string',

App: Microsoft Office Online (WOPI)

Note: This app is for Enterprise customers only.

Possible keys: wopi.token.key STRING

Possible keys: wopi.proxy.key STRING

Possible keys: URL

Possible keys: wopi_group STRING

Possible keys: wopi.proxy.url URL

Possible keys: STRING

Random Keys Created by the ownCloud Admin

Both, wopi.token.key and wopi.proxy.key are random keys created by the ownCloud admin. The keys are used by ownCloud to create encrypted JWT tokens for the communication with your Microsoft Office Online instance. The keys must be distinct. Note that wopi.token.key must be at least 32 bytes long.

You can use the following example command to generate a random key: echo $(tr -dc 'a-z0-9' < /dev/urandom | head -c 32)

Code Sample

'wopi.token.key' => 'replace-with-your-own-very-long-random-string',

Microsoft Office Online instance URL

This is the URL of the Microsoft Office Online instance ownCloud communicates with. Keep in mind that you need to grant communication access at your Microsoft Office Online instance with this ownCloud instance. For further information, read the ownCloud documentation.

Code Sample

'' => '',

Define the group name for users allowed to use Microsoft Office Online

Restrict access to Microsoft Office Online to a defined group. Please note, only one group can be defined. Default = empty = no restriction.

Code Sample

'wopi_group' => '',

Define the Proxy URL

This global option defines the proxy URL if you are a Microsoft Business user.

Note that you will get a working URL from ownCloud Support after you provide a written declaration that your company has an eligible Microsoft Business contract.

Code Sample

'wopi.proxy.url' => '',

Define if Business Flow Is Enabled

This global option defines if Office users are business users.

In that case, Office Online will check if the user logged in has an Office 365 business account. If not, the user must sign in and Office Online will check if the subscription is valid. Use yes to enable it and no to disable it or remove the key completely. To use this option, you need at least ownCloud’s Microsoft Office Online app version 1.6.0.

Code Sample

'' => 'no',

App: Microsoft Teams Bridge

Possible keys: msteamsbridge ARRAY

Sub key: loginButtonName STRING

Login Button Label

This key is necessary for security reasons. Users will be asked to click a login button each time when accessing the ownCloud app after a fresh start of their Microsoft Teams app or after idle time. This behavior is by design. The button name can be freely set based on your requirements.

Code Sample

'msteamsbridge' => [
   "loginButtonName" => "Login to ownCloud with Azure AD",

App: OpenID Connect (OIDC)

Possible keys: openid-connect ARRAY

Possible keys: openid-connect.basic_auth_guest_only BOOL

Configure OpenID Connect - all possible sub-keys

You have to use the main key openid-connect together with sub keys listed below, see code samples.


Limit the users which are allowed to login to a specific user backend - e.g. LDAP ('allowed-user-backends' ⇒ ['LDAP'])


Additional parameters which are sent to the IdP during the auth requests


If true, the ownCloud login page will redirect directly to the Identity Provider login without requiring the user to click a button. The default is false.


If auto-provision is setup, an ownCloud user will be created if not exists, after successful login using openid connect. The config parameters mode and search-attribute will be used to create a unique user so that the lookup mechanism can find the user again. This is where an LDAP setup is usually required. The profile picture will only be transferred upon account creation, but will not be updated afterwards if it changes in the connected IdP. If auto-provision is not setup or required, it is expected that the user exists and you MUST declare this with ['enabled' ⇒ false] like shown in the Easy Setup example. auto-provision holds several sub keys, see the example setup with the explanations below.


When using the provisioning mode auto-update, user account info will update with the current information provided by the OpenID Connect provider upon each user log in.


Boolean value (true/false), no SSL verification will take place when talking to the IdP - DO NOT use in production!


If set to true, JWK (JSON Web Token) will be taken from the JWT header instead of the IdP’s jwks_uri. Should only be enabled in exceptional cases as this could lead to vulnerabilities


The name as displayed on the login screen which is used to redirect to the IdP. By default, the OpenID Connect App will add a button on the login page that will redirect the user to the Identity Provider and allow authentication via OIDC. This parameter allows the button text to be modified.


This is the attribute in the owncloud accounts table to search for users. The default value is email. The alternative value is: userid.


A given URL where the IdP should redirect to after logout.


Additional config array depending on the IdP to be entered here - usually only necessary if the IdP does not support service discovery.

provider-url, client-id and client-secret

Variables are to be taken from the OpenID Connect Provider’s setup. For the provider-url, the URL where the IdP is living. In some cases (KeyCloak, Azure AD) this holds more than just a domain but also a path.


The full URL under which the ownCloud OpenId Connect redirect URL is reachable - only needed in special setups.


Enter the list of required scopes depending on the IdP setup.


The attribute which is taken from the access token JWT or user info endpoint to identify the user. This is the claim from the OpenID Connect user information which shall be used for searching in the accounts table. The default value is email. For more information about the claim, see


Client ID to be used with the token introspection endpoint.


Client secret to be used with the token introspection endpoint.


If set to true any user information will be read from the access token. If set to false the userinfo endpoint is used (starting app version 1.1.0).

Easy setup

Code Sample

'openid-connect' => [
	  // it is expected that the user already exists in ownCloud
	'auto-provision' => ['enabled' => false],
	'provider-url' => '',
	'client-id' => 'fc9b5c78-ec73-47bf-befc-59d4fe780f6f',
	'client-secret' => 'e3e5b04a-3c3c-4f4d-b16c-2a6e9fdd3cd1',
	'loginButtonName' => 'OpenId Connect'

Setup auto provisioning mode

Code Sample

'openid-connect' => [
	  // explicit enable the auto provisioning mode,
	  // if not exists, the user will be created in ownCloud
	'auto-provision' => [
		'enabled' => true,
		  // documentation about standard claims:
		  // only relevant in userid mode, defines the claim which holds the email of the user
		'email-claim' => 'email',
		  // defines the claim which holds the display name of the user
		'display-name-claim' => 'given_name',
		  // defines the claim which holds the picture of the user - must be a URL
		'picture-claim' => 'picture',
		  // defines a list of groups to which the newly created user will be added automatically
		'groups' => ['admin', 'guests', 'employees'],
		  // sets a claim which is defined at the IDP.
		  // the IDP will return a single value or an array like:
		  // "allowed_applications": ["erp", "owncloud"],
		'provisioning-claim' => 'allowed_applications',
		  // defines the matching case for the provisioning. the attribute can only be a
		  // single value in case no match is found against the IDP response,
		  // no provisioning will be made, "User not found" will be returned
		'provisioning-attribute' => 'owncloud',
		  // auto-update user account info with current information provided by the
		  // OpenID Connect provider account attributes, that will be updated,
		  // can be specified in `attributes` config option
		'update' => ['enabled' => true],
		  // enable the user info auto-update mode
	  // `mode` and `search-attribute` will be used to create a unique user in ownCloud
	'mode' => 'email',
	'search-attribute' => 'email',

Manual setup

Code Sample

'openid-connect' => [
	  // it is expected that the user already exists in ownCloud
	'auto-provision' => ['enabled' => false],
	'autoRedirectOnLoginPage' => false,
	'client-id' => 'fc9b5c78-ec73-47bf-befc-59d4fe780f6f',
	'client-secret' => 'e3e5b04a-3c3c-4f4d-b16c-2a6e9fdd3cd1',
	'loginButtonName' => 'OpenId Connect',
	'mode' => 'userid',
	'search-attribute' => 'sub',
	  // only required if the OpenID Connect Provider does not support service discovery
	  // replace the dots with your values
	'provider-params' => [
		'authorization_endpoint' => '...',
		'end_session_endpoint' => '...',
		'jwks_uri' => '...',
		'registration_endpoint' => '...',
		'token_endpoint' => '',
		'token_endpoint_auth_methods_supported' => '...',
		'userinfo_endpoint' => '...'
	'provider-url' => '...',

Test setup

Code Sample

'openid-connect' => [
	  // it is expected that the user already exists in ownCloud
	'auto-provision' => ['enabled' => false],
	'provider-url' => 'http://localhost:3000',
	'client-id' => 'ownCloud',
	'client-secret' => 'ownCloud',
	'loginButtonName' => 'node-oidc-provider',
	'mode' => 'userid',
	'search-attribute' => 'sub',
	  // do not verify tls host or peer
	'insecure' => true

Authenticate guests only with basic auth

Only guests are able to log in using basic auth. Other users will need to use another auth mechanisms (such as OIDC).

Code Sample

'openid-connect.basic_auth_guest_only' => false,

App: Richdocuments

Possible keys: collabora_group STRING

Define the group name for users allowed to use Collabora

Please note, only one group can be defined. Default = empty = no restriction.

Code Sample

'collabora_group' => '',

App: S3 Primary Object Storage

Possible keys: objectstore ARRAY

Configure the access parameters for a particular S3 provider.

The detailed configuration of that array depends on the S3 provider. This example can therefore only show the general construct. See the "S3 Compatible Object Storage as Primary Storage Location" documentation for more details.

Code Sample

'objectstore' => [
	'class' => 'OCA\Files_Primary_S3\S3Storage',
	'arguments' => [
		// ...

App: Windows Network Drive (WND)

Note: This app is for Enterprise customers only.

Possible keys: wnd.listen.reconnectAfterTime INTEGER

Possible keys: wnd.logging.enable BOOL

Possible keys: wnd.fileInfo.parseAttrs.mode STRING

Possible keys: wnd.in_memory_notifier.enable BOOL

Possible keys: wnd.permissionmanager.cache.size INTEGER

Possible keys: wnd2.cachewrapper.ttl INTEGER

Possible keys: wnd.activity.registerExtension BOOL

Possible keys: wnd.activity.sendToSharees BOOL

Possible keys: wnd.groupmembership.checkUserFirst BOOL

Possible keys: wnd.connector.opts.timeout INTEGER

Possible keys: wnd2.cachewrapper.normalize BOOL

Note With WND 2.1.0, key is obsolete and has been removed completely.

Mandatory Listener Reconnect to the Database

The listener will reconnect to the DB after given seconds. This will prevent the listener to crash if the connection to the DB is closed after being idle for a long time.

Code Sample

'wnd.listen.reconnectAfterTime' => 28800,

Enable Additional Debug Logging for the WND App

Code Sample

'wnd.logging.enable' => false,

The Way File Attributes for Folders and Files will be Handled

There are 3 possible values: "none", "stat" and "getxattr":

  • "stat". This is the default if the option is missing or has an invalid value. This means that the file attributes will be evaluated only for files, NOT for folders. Folders will be shown even if the "hidden" file attribute is set.

  • "none". This means that the file attributes won’t be evaluated in any case. Both hidden files and folders will be shown, and you can write on read-only files (the action is available in ownCloud, but it will fail in the SMB server).

  • "getxattr". This means that file attributes will always be evaluated. However, due to problems in recent libsmbclient versions (4.11+, it might be earlier) it will cause malfunctions in ownCloud; permissions are wrongly evaluated. So far, this mode works with libsmbclient 4.7 but not with 4.11+ (not tested with any version in between).

Note that the ACLs (if active) will be evaluated and applied on top of this mechanism.

Code Sample

'wnd.fileInfo.parseAttrs.mode' => 'stat',

Enable or Disable the WND In-Memory Notifier for Password Changes

Having this feature enabled implies that whenever a WND process detects a wrong password in the storage - maybe the password has changed in the backend - all WND storages that are in-memory will be notified in order to reset their passwords if applicable and not to requery again.

The intention is to prevent a potential password lockout for the user in the backend. As with PHP lower than 7.4, this feature can take a lot of memory resources. This is because WND keeps the storage access and its caches in-memory. With PHP 7.4 or above, the memory usage has been reduced significantly. Alternatively, you can disable this feature completely.

Code Sample

'wnd.in_memory_notifier.enable' => true,

Maximum Number of Items for the Cache Used by the WND Permission Managers

A higher number implies that more items are allowed, increasing the memory usage.

Real memory usage per item varies because it depends on the path being cached. Note that this is an in-memory cache used per request. Multiple mounts using the same permission manager will share the same cache, limiting the maximum memory that will be used.

Code Sample

'wnd.permissionmanager.cache.size' => 512,

TTL for the WND2 Caching Wrapper

Time to Live (TTL) in seconds to be used to cache information for the WND2 (collaborative) cache wrapper implementation. The value will be used by all WND2 storages. Although the cache isn’t exactly per user but per storage id, consider the cache to be per user, because it will be like that for common use cases. Data will remain in the cache and won’t be removed by ownCloud. Aim for a low TTL value in order to not fill the memcache completely. In order to properly disable caching, use -1 or any negative value. 0 (zero) isn’t considered a valid TTL value and will also disable caching.

Code Sample

'wnd2.cachewrapper.ttl' => 1800,  // 30 minutes

Enable to Push WND Events to the Activity App

Register WND as extension into the Activity app in order to send information about what the wnd:process-queue command is doing. The activity sent will be based on what the wnd:process-queue detects, and the activity will be sent to each affected user. There won’t be any activity being sent outside of the wnd:process-queue command. wnd:listen
wnd:process-queue + activity app are required for this to work properly. See wnd.activity.sendToSharees below for information on how to send activities for shared resources. Please consider that this can have a performance impact when changes are sent to many users.

Code Sample

'wnd.activity.registerExtension' => false,

Enable to Send WND Activity Notifications to Sharees

The wnd:process-queue command will also send activity notifications to the sharees if a WND file or folder is shared (or accessible via a share). It’s REQUIRED that the wnd.activity.registerExtension flag is set to true (see above), otherwise this flag will be ignored. This flag depends on the wnd.activity.registerExtension and has the same restrictions.

Code Sample

'wnd.activity.sendToSharees' => false,

Make the Group Membership Component Assume that the ACL Contains a User

The WND app doesn’t know about the users or groups associated with ACLs. This means that an ACL containing "admin" might refer to a user called "admin" or a group called "admin". By default, the group membership component considers the ACLs to target groups, and as such, it will try to get the information for such a group. This works fine if the majority of the ACLs target groups. If the majority of the ACLs contain users, this might be problematic. The cost of getting information on a group is usually higher than getting information on a user. This option makes the group membership component assume the ACL contains a user and checks whether there is a user in ownCloud with such a name first. If the name doesn’t refer to a user, it will get the group information. Note that this will have performance implications if the group membership component can’t discard users in a large number of cases. It is recommended to enable this option only if there are a high number of ACLs targeting users.

Code Sample

'wnd.groupmembership.checkUserFirst' => false,

The timeout (in ms) for all the operations against the backend.

The same timeout will be applied for all the connections.

Increase it if requests to the server sometimes time out. This can happen when SMB3 encryption is selected and smbclient is overwhelming the server with requests.

Code Sample

'wnd.connector.opts.timeout' => 20000,  // 20 seconds

Manage UTF-8 Glyph Normalization on macOS

A glyph is a character like ñ as used in the spanish word señorita which can be composed by two different byte sequences.

With UTF-8, glyphs can have two valid representations of these sequences in filesystems. Normalization makes it possible to determine whether any two Unicode strings are equivalent. The most used normalization forms are NFC and NFD. By default, ownCloud usually normalizes names to NFC. With macOS and HFS+ as filesystem, NFD is required. When using WND collaborative mount points connecting to macOS with HFS+, or any other filesystem using NFD, probing both forms can be enforced by setting the config variable wnd2.cachewrapper.normalize to true. This is necessary because if a file accessed via collaborative WND contains NFD characters, WND will not find the file and the WND app will assume user doesn’t have access to it. As a result, the file will not be shown.

As a mandatory prerequisite, the mount point setting Compatibility with Mac NFD encoding must be checked.

Code Sample

'wnd2.cachewrapper.normalize' => false,

App: Workflow / Tagging

Note: This app is for Enterprise customers only.

Possible keys: workflow.retention_engine STRING

Provide Advanced Management of File Tagging

Enables admins to specify rules and conditions (file size, file mimetype, group membership and more) to automatically assign tags to uploaded files. Values: tagbased (default) or userbased.

Code Sample

'workflow.retention_engine' => 'tagbased',