Skip to main content
Version: 5.1

Built-in User Store

The built-in user store keeps user credentials (password hashes, salts, and per-user attributes such as failed-login counters) in a dedicated credentials database, separate from the main ICP database that holds projects, environments, and integration metadata.

By default both databases use the embedded H2 engine, writing to <ICP_HOME>/bin/database/. For production, switch the credentials database to PostgreSQL, MySQL, MSSQL, or Oracle.

Default Setup (H2)​

No configuration is needed. The ICP distribution ships with pre-initialized H2 database files in <ICP_HOME>/bin/database/, and the credentials database contains an admin user with password admin. ICP does not initialize the H2 schema itself, so if these files are deleted, sign-in fails. Restore them from the ICP distribution.

warning

H2 is for evaluation and development only. For production deployments, use PostgreSQL, MySQL, MSSQL, or Oracle.

warning

The default admin / admin credentials are publicly known. Change the password immediately after first login via Profile > Change Password.


Connecting an External Database​

Step 1: Create the database and user​

Create a dedicated database and user on the database server. The user needs CREATE, INSERT, UPDATE, DELETE, and SELECT privileges on the credentials database.

PostgreSQL example:

CREATE DATABASE credentials_db;
CREATE USER <icp_user> WITH PASSWORD '<icp_user_password>';
GRANT CONNECT ON DATABASE credentials_db TO <icp_user>;
\c credentials_db
GRANT USAGE, CREATE ON SCHEMA public TO <icp_user>;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO <icp_user>;

Step 2: Initialize the schema​

Run the appropriate init script to create the user_credentials and user_attributes tables and seed the default admin user. The scripts are located in the ICP installation directory:

DatabaseInit script
PostgreSQLdbscripts/credentials_postgresql_init.sql
MySQLdbscripts/credentials_mysql_init.sql
MSSQLdbscripts/credentials_mssql_init.sql
Oracledbscripts/credentials_oracle_init.sql

Example for PostgreSQL:

psql -h <hostname> -U <icp_user> -d credentials_db -f dbscripts/credentials_postgresql_init.sql

The init script seeds the admin user with a bcrypt hash of the default password admin.

warning

The default admin / admin credentials are publicly known. Change the password immediately after first login via Profile > Change Password.

Step 3: Configure deployment.toml​

Add the credentialsDb* keys as top-level entries in <ICP_HOME>/conf/deployment.toml, before any [section] header:

credentialsDbType     = "postgresql"
credentialsDbHost = "<hostname>"
credentialsDbPort = 5432
credentialsDbName = "credentials_db"
credentialsDbUser = "<icp_user>"
credentialsDbPassword = "<icp_user_password>"
note

These keys must be top-level entries, not inside the [icp_server.storage] section. The [icp_server.storage] section controls the main ICP database (projects, environments, etc.), which is configured independently.

KeyDefaultDescription
credentialsDbTypeh2Database engine: h2, postgresql, mysql, mssql, or oracle
credentialsDbHostlocalhostDatabase server hostname (not used for H2)
credentialsDbPort5432Database port (not used for H2). Set it explicitly for engines other than PostgreSQL.
credentialsDbNamecredentials_dbName of the credentials database
credentialsDbUsericp_userDatabase user
credentialsDbPasswordicp_passwordDatabase password — must be changed in production
credentialsDbUseTLSfalseConnect to Oracle over TLS (TCPS), for example for Oracle Autonomous Database. Only used for Oracle.

Default ports: PostgreSQL 5432, MySQL 3306, MSSQL 1433, Oracle 1521.

Database-specific examples​

MySQL

credentialsDbType     = "mysql"
credentialsDbHost = "db.example.com"
credentialsDbPort = 3306
credentialsDbName = "credentials_db"
credentialsDbUser = "icp_user"
credentialsDbPassword = "changeme"

Microsoft SQL Server

credentialsDbType     = "mssql"
credentialsDbHost = "db.example.com"
credentialsDbPort = 1433
credentialsDbName = "credentials_db"
credentialsDbUser = "icp_user"
credentialsDbPassword = "changeme"

Oracle

credentialsDbType     = "oracle"
credentialsDbHost = "db.example.com"
credentialsDbPort = 1521
credentialsDbName = "<service_name>"
credentialsDbUser = "icp_user"
credentialsDbPassword = "changeme"

Account lockout​

After lockoutThreshold consecutive failed sign-in attempts, ICP locks the account for lockoutBaseMinutes. Each further set of lockoutThreshold failures doubles the lockout, up to lockoutMaxMinutes. A successful sign-in resets the counter, and an administrator can unlock the account earlier. Add these keys as top-level entries in <ICP_HOME>/conf/deployment.toml:

KeyDefaultDescription
lockoutThreshold5Failed attempts before the account is locked. Set to 0 to disable lockout.
lockoutBaseMinutes15Duration of the first lockout, in minutes
lockoutMaxMinutes60Maximum lockout duration, in minutes