define('PLUGIN_INSTALLER', true);

Hi

I have the plugin setting set to true in my config.php which is located in my data dir …

The permissions on the plugin are set to 755.

Is there something else that needs setting, i still get the message to say plugins disabled from the user interface ?

config.php should be in your app folder.

And when i say app folder, not to be confused with the app folder inside the app folder.

As in
var/www/app/config.php

Not
var/www/app/app/config.php

I have it in:

public_html/kanboard/app/

Is there an app folder in your app folder? If not, then its in the wrong folder and should be in your kanboard folder. If so…we’ll deal with that later…

Nope there’s no app folder in the app folder, I’ve tried with the config.php in the app folder and in the root of the kanboard dir with the same result sadly.

What are the contents of your config.php

Defaulft other then plugin enablement i think:

<?php

//
/
Rename this file to config.php if you want to change the values /
/
/
/
Make sure all paths are absolute by using DIR where needed /
/
/

// Data folder (must be writeable by the web server user and absolute)
define(‘DATA_DIR’, DIR.DIRECTORY_SEPARATOR.‘data’);

// Enable/Disable debug
define(‘DEBUG’, true);

// Available log drivers: syslog, stderr, stdout, system or file
define(‘LOG_DRIVER’, ‘system’);

// Log filename if the log driver is “file”
define(‘LOG_FILE’, DATA_DIR.DIRECTORY_SEPARATOR.‘debug.log’);

// Plugins directory
define(‘PLUGINS_DIR’, DIR.DIRECTORY_SEPARATOR.‘plugins’);

// Plugins directory URL
define(‘PLUGIN_API_URL’, ‘https://kanboard.org/plugins.json’);

// Enable/Disable plugin installer
define(‘PLUGIN_INSTALLER’, true);

// Available cache drivers are “file” and “memory”
define(‘CACHE_DRIVER’, ‘memory’);

// Cache folder to use if cache driver is “file” (must be writeable by the web server user)
define(‘CACHE_DIR’, DATA_DIR.DIRECTORY_SEPARATOR.‘cache’);

// Folder for uploaded files (must be writeable by the web server user)
define(‘FILES_DIR’, DATA_DIR.DIRECTORY_SEPARATOR.‘files’);

// Enable/disable email configuration from the user interface
define(‘MAIL_CONFIGURATION’, true);

// E-mail address used for the “From” header (notifications)
define(‘MAIL_FROM’, ‘replace-me@kanboard.local’);

// Mail transport available: “smtp”, “sendmail”, “mail” (PHP mail function), “postmark”, “mailgun”, “sendgrid”
define(‘MAIL_TRANSPORT’, ‘mail’);

// SMTP configuration to use when the “smtp” transport is chosen
define(‘MAIL_SMTP_HOSTNAME’, ‘’);
define(‘MAIL_SMTP_PORT’, 25);
define(‘MAIL_SMTP_USERNAME’, ‘’);
define(‘MAIL_SMTP_PASSWORD’, ‘’);
define(‘MAIL_SMTP_ENCRYPTION’, null); // Valid values are “null”, “ssl” or “tls”

// Sendmail command to use when the transport is “sendmail”
define(‘MAIL_SENDMAIL_COMMAND’, ‘/usr/sbin/sendmail -bs’);

// Run automatically database migrations
// If set to false, you will have to run manually the SQL migrations from the CLI during the next Kanboard upgrade
// Do not run the migrations from multiple processes at the same time (example: web page + background worker)
define(‘DB_RUN_MIGRATIONS’, true);

// Database driver: sqlite, mysql or postgres (sqlite by default)
define(‘DB_DRIVER’, ‘sqlite’);

// Mysql/Postgres username
define(‘DB_USERNAME’, ‘root’);

// Mysql/Postgres password
define(‘DB_PASSWORD’, ‘’);

// Mysql/Postgres hostname
define(‘DB_HOSTNAME’, ‘localhost’);

// Mysql/Postgres database name
define(‘DB_NAME’, ‘kanboard’);

// Mysql/Postgres custom port (null = default port)
define(‘DB_PORT’, null);

// Mysql SSL key
define(‘DB_SSL_KEY’, null);

// Mysql SSL certificate
define(‘DB_SSL_CERT’, null);

// Mysql SSL CA
define(‘DB_SSL_CA’, null);

// Mysql SSL server verification, set to false if you don’t want the Mysql driver to validate the certificate CN
define(‘DB_VERIFY_SERVER_CERT’, null);

// Timeout value for PDO attribute
define(‘DB_TIMEOUT’, null);

// Enable LDAP authentication (false by default)
define(‘LDAP_AUTH’, false);

// LDAP server hostname
define(‘LDAP_SERVER’, ‘’);

// LDAP server port (389 by default)
define(‘LDAP_PORT’, 389);

// By default, require certificate to be verified for ldaps:// style URL. Set to false to skip the verification
define(‘LDAP_SSL_VERIFY’, true);

// Enable LDAP START_TLS
define(‘LDAP_START_TLS’, false);

// By default Kanboard lowercase the ldap username to avoid duplicate users (the database is case sensitive)
// Set to true if you want to preserve the case
define(‘LDAP_USERNAME_CASE_SENSITIVE’, false);

// LDAP bind type: “anonymous”, “user” or “proxy”
define(‘LDAP_BIND_TYPE’, ‘anonymous’);

// LDAP username to use with proxy mode
// LDAP username pattern to use with user mode
define(‘LDAP_USERNAME’, null);

// LDAP password to use for proxy mode
define(‘LDAP_PASSWORD’, null);

// LDAP DN for users
// Example for ActiveDirectory: CN=Users,DC=kanboard,DC=local
// Example for OpenLDAP: ou=People,dc=example,dc=com
define(‘LDAP_USER_BASE_DN’, ‘’);

// LDAP pattern to use when searching for a user account
// Example for ActiveDirectory: ‘(&(objectClass=user)(sAMAccountName=%s))’
// Example for OpenLDAP: ‘uid=%s’
define(‘LDAP_USER_FILTER’, ‘’);

// LDAP attribute for username
// Example for ActiveDirectory: ‘samaccountname’
// Example for OpenLDAP: ‘uid’
define(‘LDAP_USER_ATTRIBUTE_USERNAME’, ‘uid’);

// LDAP attribute for user full name
// Example for ActiveDirectory: ‘displayname’
// Example for OpenLDAP: ‘cn’
define(‘LDAP_USER_ATTRIBUTE_FULLNAME’, ‘cn’);

// LDAP attribute for user email
define(‘LDAP_USER_ATTRIBUTE_EMAIL’, ‘mail’);

// LDAP attribute to find groups in user profile
define(‘LDAP_USER_ATTRIBUTE_GROUPS’, ‘memberof’);

// LDAP attribute for user avatar image: thumbnailPhoto or jpegPhoto
define(‘LDAP_USER_ATTRIBUTE_PHOTO’, ‘’);

// LDAP attribute for user language, example: ‘preferredlanguage’
// Put an empty string to disable language sync
define(‘LDAP_USER_ATTRIBUTE_LANGUAGE’, ‘’);

// Allow automatic LDAP user creation
define(‘LDAP_USER_CREATION’, true);

// LDAP DN for administrators
// Example: CN=Kanboard-Admins,CN=Users,DC=kanboard,DC=local
define(‘LDAP_GROUP_ADMIN_DN’, ‘’);

// LDAP DN for managers
// Example: CN=Kanboard Managers,CN=Users,DC=kanboard,DC=local
define(‘LDAP_GROUP_MANAGER_DN’, ‘’);

// Enable LDAP group provider for project permissions
// The end-user will be able to browse LDAP groups from the user interface and allow access to specified projects
define(‘LDAP_GROUP_PROVIDER’, false);

// LDAP Base DN for groups
define(‘LDAP_GROUP_BASE_DN’, ‘’);

// LDAP group filter
// Example for ActiveDirectory: (&(objectClass=group)(sAMAccountName=%s*))
define(‘LDAP_GROUP_FILTER’, ‘’);

// LDAP user group filter
// If this filter is configured, Kanboard will search user groups in LDAP_GROUP_BASE_DN with this filter
// Example for OpenLDAP: (&(objectClass=posixGroup)(memberUid=%s))
define(‘LDAP_GROUP_USER_FILTER’, ‘’);

// LDAP attribute for the group name
define(‘LDAP_GROUP_ATTRIBUTE_NAME’, ‘cn’);

// Enable/disable the reverse proxy authentication
define(‘REVERSE_PROXY_AUTH’, false);

// Header name to use for the username
define(‘REVERSE_PROXY_USER_HEADER’, ‘REMOTE_USER’);

// Username of the admin, by default blank
define(‘REVERSE_PROXY_DEFAULT_ADMIN’, ‘’);

// Default domain to use for setting the email address
define(‘REVERSE_PROXY_DEFAULT_DOMAIN’, ‘’);

// Enable/disable remember me authentication
define(‘REMEMBER_ME_AUTH’, true);

// Enable or disable “Strict-Transport-Security” HTTP header
define(‘ENABLE_HSTS’, true);

// Enable or disable “X-Frame-Options: DENY” HTTP header
define(‘ENABLE_XFRAME’, true);

// Escape html inside markdown text
define(‘MARKDOWN_ESCAPE_HTML’, true);

// API alternative authentication header, the default is HTTP Basic Authentication defined in RFC2617
define(‘API_AUTHENTICATION_HEADER’, ‘’);

// Enable/disable url rewrite
define(‘ENABLE_URL_REWRITE’, false);

// Hide login form, useful if all your users use Google/Github/ReverseProxy authentication
define(‘HIDE_LOGIN_FORM’, false);

// Disabling logout (useful for external SSO authentication)
define(‘DISABLE_LOGOUT’, false);

// Enable captcha after 3 authentication failure
define(‘BRUTEFORCE_CAPTCHA’, 3);

// Lock the account after 6 authentication failure
define(‘BRUTEFORCE_LOCKDOWN’, 6);

// Lock account duration in minute
define(‘BRUTEFORCE_LOCKDOWN_DURATION’, 15);

// Session duration in second (0 = until the browser is closed)
// See http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime
define(‘SESSION_DURATION’, 0);

// HTTP client proxy
define(‘HTTP_PROXY_HOSTNAME’, ‘’);
define(‘HTTP_PROXY_PORT’, ‘3128’);
define(‘HTTP_PROXY_USERNAME’, ‘’);
define(‘HTTP_PROXY_PASSWORD’, ‘’);

// Set to false to allow self-signed certificates
define(‘HTTP_VERIFY_SSL_CERTIFICATE’, true);

// TOTP (2FA) issuer name
define(‘TOTP_ISSUER’, ‘Kanboard’);

// Comma separated list of fields to not synchronize when using external authentication providers
define(‘EXTERNAL_AUTH_EXCLUDE_FIELDS’, ‘username’);

Really not sure, try changing something else in your config, and see if it holds true, like set up smtp.

There are three requirements to enable plugin directory feature:

  • The plugin directory must be writeable by the web server user
  • The Zip extension must be available on your server
  • The config parameter PLUGIN_INSTALLER must be set to true

Apparently you have the first and third conditions, please check if you have the zip extension enabled

Place config.php inside public_html/kanboard/ folder. Note that your PLUGINS_DIR is set to DIR.DIRECTORY_SEPARATOR.'plugins', so there should be a plugin folder inside the same folder config.php is (because of DIR). This is the default, public_html/kanboard/plugins. This folder should be writeable by webserver user. By setting 755 you have to check if the webserver user is the owner of plugins folder.

1 Like

Nailed it …

“The Zip extension must be available on your server”

It was on for all versions bar the version of PHP in use.

All sorted, many thanks @rafaelcamargo and @creecros for your support on this.

1 Like