Skip to main content
Version: Current

Designer configuration

Designer configuration area contains configs for web application interface, security, various UI settings, database and more. Check configuration areas to understand where Designer configuration should be placed in the Nussknacker configuration.

The defaults of the Designer configuration are built into the Designer, in defaultDesignerConfig.conf; the tables below give the default of each setting.

License key​

Parameter nameImportanceTypeDefault valueDescription
licenseKeyHighstringLicense key received from Nussknacker; unset means no provider component is unlocked. Learn more

Web interface configuration​

Parameter nameImportanceTypeDefault valueDescription
http.portHighint8080HTTP Port of Designer app
http.interfaceHighstring"0.0.0.0"HTTP interface for Designer app
http.publicPathMediumstring""if Designer used with reverse proxy and custom path, use this configuration to generate links in Designer properly (Designer app is always served from root path)
ssl.enabledMediumbooleanfalseShould Designer app be served with SSL
ssl.keyStore.locationMediumstringKeystore file location (required if SSL enabled)
ssl.keyStore.passwordMediumstringKeystore file password (required if SSL enabled)
pekko.*MediumPekko HTTP is used for HTTP serving, you can configure it in standard way. Below we give Nussknacker-specific defaults
pekko.http.server.parsing.max-content-lengthLowint300000000Requests (e.g. with test data) can be quite large, so we increase the limit
pekko.http.server.request-timeoutLowduration1 minuteConsider increasing the value if you have large test data or long savepoint times during deploy

Database configuration​

Database is used to store scenario definitions; data processed by Nussknacker are not stored. Currently, Nussknacker supports following databases:

  • HSQL (embedded), we use syntax_ora option
  • PostgreSQL

Please check Slick documentation for detailed list of configuration options.

The table below presents most important options, or the ones that have Nussknacker specific defaults.

Parameter nameImportanceTypeDefault valueDescription
db.urlHighstring"jdbc:hsqldb:file:"${storageDir}"/db;sql.syntax_ora=true"Default HSQL location
db.driverHighstring"org.hsqldb.jdbc.JDBCDriver""org.postgresql.Driver" in case of PostgreSQL
db.userHighstring"SA"
db.passwordHighstring""
db.connectionTimeoutLowint30000
db.maximumPoolSizeLowint5We have lower limits than default config, since then Designer is not heavy-load application
db.minimumIdleLowint1We have lower limits than default config, since then Designer is not heavy-load application
db.numThreadsLowint5We have lower limits than default config, since then Designer is not heavy-load application

High Availability configuration​

High Availability (HA) mode lets you run several Designer instances concurrently. It is opt-in and disabled by default. When enabled it requires PostgreSQL as the Designer database shared by all instances. For an operational overview - how leader election works, deployment topology and the /api/app/leader endpoint - see the High Availability operations guide.

Example configuration:

ha {
enabled: true
instanceId: "designer-1"

leader {
heartbeatInterval: 10s
leaseDuration: 30s
releaseOnStop: true
}

periodicLockDuration: 5m
lockQueryTimeout: 5s
deploymentTargetsSynchronizationInterval: 10s
}
Parameter nameImportanceTypeDefault valueDescription
ha.enabledHighbooleanfalseEnables HA mode. When enabled, PostgreSQL is required.
ha.instanceIdHighstringhostnameIdentifier of this instance, used to identify the lock holder during leader election. Must be unique across all instances - two instances sharing the same value can both consider themselves the leader. Should also be stable across restarts so that an instance can re-acquire its own lock when ha.leader.releaseOnStop is false. Defaults to the machine hostname; rely on the default only when the hostname is guaranteed unique and stable, otherwise set it explicitly.
ha.leader.heartbeatIntervalMediumduration10sHow often the leader renews its lock.
ha.leader.leaseDurationMediumduration30sHow long a leader lock stays valid without renewal. Must be greater than heartbeatInterval (recommended: at least 3 * heartbeatInterval). Roughly determines how long coordinated background work can pause during failover.
ha.leader.releaseOnStopLowbooleantrueWhen true, the leader releases its lock on graceful shutdown so another instance can take over immediately. Set to false to let the same instance re-acquire its lock on restart without waiting for the lease to expire.
ha.periodicLockDurationLowduration5mMaximum time a periodic-scenario deployment lock is held (covers the full deploy round-trip).
ha.lockQueryTimeoutLowduration5sTimeout for individual lock database queries. Must be shorter than ha.leader.heartbeatInterval.
ha.deploymentTargetsSynchronizationIntervalLowduration10sHow often each instance refreshes its deployment targets created over the API from the database. Roughly how long it takes for a target created, changed or removed on one instance to be seen by the others.

Metrics settings​

Metric dashboard​

Each scenario can have a link to Grafana dashboard. The Docker Compose installation comes with a sample nussknacker-scenario dashboard (grafana/dashboards). You can modify/configure your own, the only assumption that we make is that variable scenarioName is used to display metrics for particular scenario.

Each scenario type can have different dashboard, this is configured by metricsSettings.scenarioTypeToDashboard settings. If no mapping is configured, metricsSettings.defaultDashboard is used. Actual link for particular scenario is created by replacing

  • $dashboard with configured dashboard
  • $scenarioName with scenario name in metricsSettings.url setting.
Parameter nameImportanceTypeDefault valueDescription
metricsSettings.urlHighstring/grafana/d/$dashboard?theme=dark&var-scenarioName=$scenarioName&var-env=local (for Docker setup)URL (accessible from user browser, in docker setup its configured as relative URL) to Grafana dashboard, see above for details
metricsSettings.defaultDashboardMediumstringnussknacker-scenario (for Docker setup)Default dashboard
metricsSettings.scenarioTypeToDashboardLowmapMapping of scenario types to dashboard

Counts​

Counts are based on InfluxDB metrics, stored in nodeCount measurement by default. countsSettings.queryMode setting can be used to choose metric computation algorithm:

  • OnlySingleDifference - subtracts values between end and beginning of requested range. Fast method, but if restart in the requested time range is detected error is returned. We assume the job was restarted when event counter at the source decreases.
  • OnlySumOfDifferences - difference is computed by summing differences in measurements for requested time range. This method works a bit better for restart situations, but can be slow for large diagrams and wide time ranges.
  • SumOfDifferencesForRestarts - if restart is detected, the metrics are computed with OnlySumDifferences, otherwise - with OnlySingleDifferences

If you have custom metrics settings which result in different fields or tags (e.g. you have different telegraf configuration), you can configure required values with the settings presented below:

Parameter nameImportanceTypeDefault valueDescription
countsSettings.influxUrlMediumstringMain InfluxDB query endpoint (e.g. http://influx:8086/query). It should be accessible from Nussknacker Designer server, not from user browser
countsSettings.databaseMediumstringInfluxDB database name
countsSettings.userMediumstringUser name (optional)
countsSettings.passwordMediumstringPassword (optional)
countsSettings.additionalHeadersLowmap of stringsempty mapAdditional headers sent to InfluxDB
countsSettings.queryModeLowOnlySingleDifference / OnlySumOfDifferences / SumOfDifferencesForRestartsOnlySumOfDifferences
countsSettings.metricsConfig.sourceCountMetricLowstringsource_count
countsSettings.metricsConfig.nodeCountMetricLowstringnodeCount
countsSettings.metricsConfig.nodeIdTagLowstringnodeId
countsSettings.metricsConfig.additionalGroupByTagsLowlist of string["slot", "instanceId"]
countsSettings.metricsConfig.scenarioTagLowstringscenario
countsSettings.metricsConfig.countFieldLowstringcount
countsSettings.metricsConfig.envTagLowstringenv

Deployment settings​

Nussknacker Designer can be configured to replace certain values in comments to links that can point e.g. to external issue tracker like GitHub issues or Jira. For example, MARKETING-555 will change to link https://jira.organization.com/jira/browse/MARKETING-555.

Parameter nameImportanceTypeDefault valueDescription
commentSettings.substitutionPatternLowregexpRegular expression to look for issue identifier (e.g. (issues/[0-9]*) - note use of regexp group)
commentSettings.substitutionLinkLowstringLink template (e.g. https://git.example.com/project/$1 - $1 will be replaced with matched group from substitutionPattern config
deploymentCommentSettings.validationPatternLowregexpIf deploymentCommentSettings is specified, comment matching validation pattern is required for deployment. Also, if substitutionPattern is defined, at least one match is required
deploymentCommentSettings.exampleCommentLowstringExample of comment which passes validation. Unlike validationPattern field is not mandatory.

Security​

Overview​

Nussknacker has pluggable security architecture - we support three types of authentication: BasicAuth, OAuth2 and OpenID Connect (OIDC). Configuration specific to each of these three types of authentication mechanism is described in the dedicated sections.

Nussknacker supports roles; the roles permissions are defined in the users configuration file.

Users, roles and permissions​

Each user has id and set of permissions for every scenario category. The following permissions are supported:

  • Read - user can view scenarios in category
  • Write - user can modify/add new scenarios in category
  • Deploy - user can deploy or cancel scenarios in given category

You can set isAdmin flag to a certain role in the users configuration file. Users who have this role will be considered an Admin user by the system and will have all the permissions to every scenario category as well as all the global permissions.

Global permissions​

In addition to permission system oriented around scenarios categories we provide additional set of permissions. This feature is designed to control access to components that have no category attached, or it doesn't make sense for them to have one.

Currently supported permissions:

  • Impersonate - Enables technical user to impersonate a business user and act on their behalf with their permissions.

Impersonation​

Nussknacker supports an impersonation mechanism on the API level, allowing system's technical users to perform actions on behalf of business users. A technical user has to have the Impersonate global permission configured in order to be able to impersonate.

Currently only the BasicAuth and BasicAuthForm security mechanisms support this feature.

You can configure whether Admin users can be impersonated by such technical users with isAdminImpersonationPossible setting in the authentication section. By default, it's set to false.

Common configuration parameters​

The table below contains parameters common to all the supported authentication methods.

Parameter nameImportanceTypeDefault valueDescription
authentication.methodrequiredstringBasicAuth, BasicAuthForm, Oidc or OAuth2
authentication.usersFilerequiredurl or pathURL or path to a file with a mapping of user identities to roles and roles to permissions
authentication.isAdminImpersonationPossibleoptionalbooleanfalsetrue or false. Flag describing whether users with Impersonate global permission can impersonate Admin users.

Users' file format:​

The association of the users to the roles is in the users' configuration file; in the case of OIDC it can additionally be supplemented by the list of roles provided by the OpenId provider.

If OpenID Connect (OIDC) authentication is used, the information about the user identity is stored in the field sub (subject) of the OIDC token - make sure that these values match.

users: [
{
identity: "admin"
roles: ["Admin"]
},
{
identity: "userId",
username: "overrided username",
roles: ["Admin"]
},
{
identity: "userWithAdminTab"
roles: ["User", "UserWithAdminTab"]
}
{
identity: "user"
roles: ["User"]
}
]

rules: [
{
role: "Admin"
isAdmin: true
},
{
role: "UserWithAdminTab"
permissions: ["Read", "Write", "Deploy"]
globalPermissions: ["AdminTab"]
categories: ["Category2", "RequestResponseCategory1"]
},
{
role: "User"
permissions: ["Read", "Write"]
categories: ["Category1", "Category2"]
}
]

BasicAuth security module​

In order to use Basic authentication you just need to set authentication.method to BasicAuth and provide either plain or encrypted passwords for users additionally to the usersFile's content as follows:

users: [
{
...
password: "pass"
},
{
...
encryptedPassword: "$2a$12$oA3U7DXkT5eFkyB8GbtKzuVqxUCU0zDmcueBYV218zO/JFQ9/bzY6"
}
]

...

Encrypted hashes​

Encryption of passwords uses BCrypt algorithm. You can generate sample hash using command:

python -c 'import bcrypt; print(bcrypt.hashpw("password".encode("utf8"), bcrypt.gensalt(rounds=12, prefix="2a")))'

If you don't have bcrypt installed, use pip install bcrypt.

Be aware that usage of BCrypt hashes will cause significant CPU overhead for processing of each http request, because we don't have sessions and all requests are authenticated. To avoid this overhead you can configure caching of hashes using configuration:

authentication: {
method: "BasicAuth"
usersFile: "conf/users.conf"
cachingHashes {
enabled: true
maximumSize: 1000
expireAfterAccess: 5 minutes
}
}

Hash caching is disabled by default. The example above retains at most 1,000 entries, expiring after five minutes of inactivity. Each access refreshes the expiry, so this is not a hard five-minute lifetime from insertion. It only applies to bcrypt hashes: file-based accounts configured with password instead of encryptedPassword do not use it and gain no performance improvement.

The Docker Compose installation bundle (examples/installation) enables these bounded settings and exposes BASIC_AUTH_CACHE_ENABLED=false to disable them.

BasicAuthForm security module​

BasicAuthForm authenticates the same users as BasicAuth and takes the same parameters, but the Designer asks for the username and password on a sign-in page of its own instead of the browser's login dialog, and signing out works in every browser. API clients keep sending HTTP Basic credentials as with BasicAuth, but they have to send them with the first request: the 401 challenge lists Bearer before Basic, which keeps the browser's dialog away, and a client that negotiates the scheme from the challenge would pick Bearer.

It can also sign every visitor in automatically, with no further parameters. The account's password is public, so give it read-only roles:

authentication: {
method: "BasicAuthForm"
usersFile: "conf/users.conf"
autoLogin: {
login: "demo"
password: "demo"
}
}

OpenID Connect (OIDC) security module​

When talking about OAuth2 in the context of authentication, most people probably mean OpenID Connect, an identity layer built on top of it. Nussknacker provides a separate authentication provider for OIDC with simple configuration and provider discovery. The only supported flow is the authorization code flow with client secret.

You can select this authentication method by setting the authentication.method parameter to Oidc

Parameter nameImportanceTypeDefault valueDescription
authentication.issuerrequiredurlOpenID Provider's location
authentication.clientIdrequiredstringClient identifier valid at the authorization server
authentication.clientSecretrequiredstringSecret corresponding to the client identifier at the authorization server
authentication.audiencerecommendedstringRequired aud claim value of an access token that is assumed to be a JWT.
authentication.rolesClaimsrecommendedlist of stringName of the field in the ID token which contains list of user roles. These roles must correspond to those defined in the usersFile.
authentication.redirectUrioptionalurlinferred from UI's locationCallback URL to which a user is redirected after successful authentication
authentication.scopeoptionalstringopenid profileScope parameter's value sent to the authorization endpoint.
authentication.authorizationEndpointauxiliaryurl or pathdiscoveredAbsolute URL or path relative to Issuer overriding the value retrieved from the OpenID Provider
authentication.tokenEndpointauxiliaryurl or pathdiscoveredas above
authentication.userinfoEndpointauxiliaryurl or pathdiscoveredas above
authentication.jwksUriauxiliaryurl or pathdiscoveredas above
authentication.tokenCookie.nameauxiliarystringname of cookie to store access token
authentication.tokenCookie.pathauxiliarystringpath of access token cookie
authentication.tokenCookie.domainauxiliarystringdomain of access token cookie
authentication.usernameClaimoptionalstringThe OIDC claim from JWT which be mapped to the username at Nussknacker authorized user object. Available options: preferred_username, given_name, nickname, name. By default, username is represented by the sub (identifier) claim from JWT.
authentication.enableBasicAuthAccountsoptionalbooleanfalseLets users defined in the usersFile with a password/encryptedPassword authenticate via HTTP Basic in addition to the OIDC flow. Formerly enableBasicAuthForTechnicalAccounts, still read - see below
authentication.autoLogin.loginoptionalstringIdentity of a usersFile account that the frontend signs every visitor in as - see below
authentication.autoLogin.passwordoptionalstringPassword of that account, handed to every visitor
authentication.defaultSignInoptionalstringSingleSignOnWhat someone without a session is offered first: SingleSignOn, Password or Chooser - see below

Technical accounts with HTTP Basic authentication​

Some clients cannot perform the OIDC flow - for example the RemoteEnvironment scenario-migration client, which always sends HTTP Basic credentials. Setting authentication.enableBasicAuthAccounts to true lets such accounts authenticate with a password while all regular users keep authenticating through the OIDC provider. The accounts are plain entries of the same usersFile, with a password or (preferably) an encryptedPassword:

users: [
{
identity: "some-oidc-subject-id"
roles: ["User"]
}
{
identity: "migration-technical-account"
encryptedPassword: "$2a$12$..."
roles: ["Writer"]
}
]

Users without a password - the regular, OIDC-identified ones - cannot authenticate this way. Two cautions:

  • give a technical account only the roles it needs (the migration client needs write access to the target environment, not administrative rights),
  • make its identity one that the OpenID Provider cannot issue as a subject (sub) claim. The usersFile maps both OIDC subjects and technical accounts by identity, so an OIDC user whose subject equals a technical account's identity would be granted that account's roles.

Automatic login​

An instance can let people look around without an account of their own by signing every visitor in as one shared account. With Oidc and OAuth2 it needs enableBasicAuthAccounts, because the frontend signs in with HTTP Basic:

authentication: {
method: "Oidc"
enableBasicAuthAccounts: true
autoLogin: {
login: "demo"
password: "demo"
}
}

The account must be a usersFile entry whose identity is the login, with the same password. The password is returned by GET /authentication/<method>/settings to anyone, so give the account read-only roles. Visitors with an account of their own sign in by opening the Designer with the ?signin query parameter.

Signing in with a password​

enableBasicAuthAccounts also lets people sign in from the UI with an identity and password from the usersFile. Any account with a password can sign in this way, technical accounts included. Opening the Designer with ?signin shows a page offering both single sign-on and username and password. What a plain visit without a session does depends on defaultSignIn:

  • SingleSignOn (default) - goes to the OpenID Provider,
  • Password - shows the username and password form alone,
  • Chooser - shows the page offering both.

Where automatic login is configured, a plain visit signs in with it instead. Password and Chooser need enableBasicAuthAccounts; the Designer does not start otherwise.

This works both with the default frontend strategy and with the Remote one set in overrideFrontendAuthenticationStrategy. The default strategy cannot end the session the OpenID Provider holds, so after signing out it shows the page in place of SingleSignOn - with single sign-on alone where enableBasicAuthAccounts is off - and single sign-on chosen there asks the provider for credentials rather than signing the same person straight back in.

Auth0 sample configuration​

Assuming ${nussknackerUrl} is the location of your deployment, in your Auth0 tenant settings do the following:

  • Create a "Regular Web Application" with the "Allowed Callback URL's" field set to ${nussknackerUrl}
  • Create an "API" with the "Identifier" field preferably set to ${nussknackerUrl}/api
  • Create an Auth Pipeline Rule with the content:
function (user, context, callback) {
const assignedRoles = (context.authorization || {}).roles || ['User'];

let idTokenClaims = context.idToken || {};

idTokenClaims[`nussknacker:roles`] = assignedRoles;

context.idToken = idTokenClaims;
callback(null, user, context);}

You can find more configurations options at Auth0's documentation on applications and APIs

In Nussknacker's configuration file add the following authentication section:

authentication: {
method: "Oidc"
issuer: "https://<the value of Applications -> Application Name -> Settings -> Basic Information -> Domain>"
clientSecret: "<the value of Applications -> Application Name -> Settings -> Basic Information -> Client Secret>"
clientId: "<the value of Applications -> Application Name -> Settings -> Basic Information -> Client Identifier>"
audience: "<the value of APIs -> API Name -> Settings -> General Settings -> Identifier>"
rolesClaims: ["nussknacker:roles"]
usersFile: "conf/users.conf"
}

The role names in the usersFile should match the roles defined in the Auth0 tenant.

MS Azure Active Directory sample configuration​

  • Open MS Azure Portal: https://portal.azure.com/
  • Go to Azure Active Directory Service
  • Register new app: AAD Service -> App registrations -> New registration
  • Add auth platform: AAD Service -> App registrations -> Your App -> Authentication -> Add a platform
  • Register app roles: AAD Service -> App registrations -> Your App -> App roles -> Create app role
  • Add client secret: AAD Service -> App registrations -> Your App -> Certificates & secrets -> New client secret
  • Configure users roles: Enterprise applications -> Your App -> Users and groups -> Add user/group

In Nussknacker's configuration file add the following authentication section:

authentication: {
method: "Oidc"
issuer: "https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0"
clientSecret: <the value of App registrations -> Your App -> Certificates & secrets -> Your created secret value>
clientId: <the value of App registrations -> Your App -> Overview -> Application (client) ID>
usernameClaim: "name" # Here MS AAD returns at JWT full user name
rolesClaims: ["roles"] # Here MS AAD returns at JWT information about assigned roles
usersFile: "conf/users.conf"
}

The value of YOUR_TENANT_ID you can find at App registrations -> Your App -> Directory (tenant) ID. More information about the API you can find at https://login.microsoftonline.com/YOUR_TENANT_ID/v2.0/.well-known/openid-configuration.

The role names in the usersFile should match the roles defined in MS AAD App registrations -> Your App -> App roles.

OAuth2 security module​

Generic configuration​

authentication: {
method: ${?AUTHENTICATION_METHOD} (default: "BasicAuth")
usersFile: ${?AUTHENTICATION_USERS_FILE}
authorizeUri: ${?OAUTH2_AUTHORIZE_URI}
clientSecret: ${?OAUTH2_CLIENT_SECRET}
clientId: ${?OAUTH2_CLIENT_ID}
issuer: ${?OAUTH2_ISSUER}
profileUri: ${?OAUTH2_PROFILE_URI}
profileFormat: ${?OAUTH2_PROFILE_FORMAT}
accessTokenUri: ${?OAUTH2_ACCESS_TOKEN_URI}
redirectUri: ${?OAUTH2_REDIRECT_URI}
implicitGrantEnabled: ${?OAUTH2_IMPLICIT_GRANT_ENABLED}
jwt {
accessTokenIsJwt: ${?OAUTH2_ACCESS_TOKEN_IS_JWT} (default: false)
userinfoFromIdToken: ${?OAUTH2_USERINFO_FROM_ID_TOKEN} (default: false)
audience: ${?OAUTH2_JWT_AUDIENCE}
publicKey: ${?OAUTH2_JWT_AUTH_SERVER_PUBLIC_KEY}
publicKeyFile: ${?OAUTH2_JWT_AUTH_SERVER_PUBLIC_KEY_FILE}
certificate: ${?OAUTH2_JWT_AUTH_SERVER_CERTIFICATE}
certificateFile: ${?OAUTH2_JWT_AUTH_SERVER_CERTIFICATE_FILE}
idTokenNonceVerificationRequired: ${?OAUTH2_JWT_ID_TOKEN_NONCE_VERIFICATION_REQUIRED}
}
accessTokenParams {
grant_type: ${?OAUTH2_GRANT_TYPE}
}
authorizeParams {
response_type: ${?OAUTH2_RESPONSE_TYPE}
scope: ${?OAUTH2_SCOPE}
audience: ${?OAUTH2_AUDIENCE}
}
usernameClaim: ${?OAUTH2_USERNAME_CLAIM}
headers {
Accept: ${?AUTHENTICATION_HEADERS_ACCEPT}
}
authorizationHeader: "Authorization" (default)
accessTokenRequestContentType: "application/json" (default)
defaultTokenExpirationDuration: "1 hour" (default)
tokenCookie: None (default)
overrideFrontendAuthenticationStrategy: None (default)
enableBasicAuthAccounts: false (default)
autoLogin: None (default)
defaultSignIn: "SingleSignOn" (default)
}

enableBasicAuthAccounts, autoLogin and defaultSignIn work as with Oidc - see technical accounts, automatic login and signing in with a password.

When method is set to OAuth2, the following fields are mandatory: clientSecret, clientId, authorizeUri , redirectUri, accessTokenUri, profileUri, profileFormat, implicitGrantEnabled, usersFile.

For the profileFormat one of oidc or github is supported by default.

Subconfigs accessTokenParams, accessTokenRequestContentType, authorizeParams, headers are optional and every field from any of the subconfigs is optional and could be provided separately.

By default, access token request is sent using application/json content type, to change it (e.g. to application/x-www-form-urlencoded) use accessTokenRequestContentType config.

Subconfig jwt is also optional. However, if it is present and enabled is set to true, the audience and one of the publicKey, publicKeyFile, certificate, certificateFile, fields have to be provided.

Access tokens are introspected only once and then stored in a cache for the expiration time. When using JWT, an incoming access token is validated against its signature and aud(audience) claim. Otherwise, a token is considered valid when it allows a profileUri (e.g. /userinfo) query. No token refreshing nor revoking is implemented.

Remarks:​

  • Setting jwt.idTokenNonceVerificationRequired to true has an effect only if implicitGrantEnabled is also set to true.

  • For security reasons, if implicit flow used, implicitGrantEnabled and jwt.idTokenNonceVerificationRequired should be set to true. Furthermore authorizeParams.response_type should be set to "access_token id_token" (not only "access_token"). Then a received access_token format has to be JWT (like id_token).

    Of course, this does not apply when authorizeParams.response_type is set to code (code flow used).

  • Provided jwt is enabled, the backend first checks whether a user profile can be obtained from the access_token, secondly it tries to obtain the profile from a request sent to authorizeUri.

  • Access token can be configured to be set in http-only cookie (e.g. for enabling proxy grafana authentication). This is disabled by default, it can be enabled with following config:

  authentication {
...
tokenCookie {
name: "cookieName"
path: "/grafana" //optional
domain: "mydomain.com" //optional
}
}

OAuth2 security module - GitHub example with code flow​

Configuration example:​

authentication: {
method: "OAuth2"
clientSecret: ""
clientId: ""
authorizeUri: "https://github.com/login/oauth/authorize"
redirectUri: "http://localhost:3000"
accessTokenUri: "https://github.com/login/oauth/access_token"
profileUri: "https://api.github.com/user"
profileFormat: "github"
implicitGrantEnabled: false
accessTokenParams {
grant_type: "authorization_code"
}
headers {
Accept: "application/json"
}
authorizeParams {
response_type: "code"
}
usersFile: "./src/test/resources/oauth2-users.conf"
}

Users file example:​

users: [ //Special settings by user email
{
identity: "some@email.com"
roles: ["Admin"]
}
]

rules: [
{
role: "Admin"
isAdmin: true
},
{
role: "User" //this is default role for all users
permissions: ["Read", "Write", "Deploy"]
categories: ["Default", "FraudDetection"]
}
]

UI customization options​

Process Toolbar Configuration​

Toolbars and buttons at process window are configurable, you can configure params:

  • uuid - optional uuid identifier which determines unique code for FE localstorage cache, default: null - we generate uuid from hashcode config
  • topLeft - optional top left panel, default: empty list
  • topCenter - optional center top panel, default: empty list
  • topRight - optional top right panel, default: empty list
  • bottomLeft - optional bottom left panel, default: empty list
  • bottomCenter - optional center bottom panel, default: empty list
  • bottomRight - optional bottom right panel, default: empty list
  • aboveNodeWindow - optional panel shown above an open node window, default: empty list
  • dynamicLeft - optional left side panel, default: empty list
  • dynamicRight - optional right side panel, default: empty list

Example configuration:

processToolbarConfig {
defaultConfig {
topLeft: [
{ type: "tips-panel" }
]
topRight: [
{
id: "actions-panel"
type: "buttons-panel"
title: "actions"
buttons: [
{ type: "process-save", disabled: { fragment: false, archived: true, type: "oneof" } }
{ type: "custom-link", title: "Metrics for $processName", url: "/metrics/$processId" }
]
}
]
}
}

We can also create special configuration for each category by:

processToolbarConfig {
categoryConfig {
"CategoryName" {
id: "58f1acff-d864-4d66-9f86-0fa7319f7043"
topLeft: [
{ type: "creator-panel", hidden: {fragment: true, archived: false, type: "allof"} }
]
}
}
}

Toolbar Panel Conditioning​

Configuration allow us to:

  • hiding panels
  • hiding or disabling buttons

Each of this function can be configured by condition expression where we can use three parameters:

  • fragment: boolean - if true then condition match only fragment, by default ignored
  • archived: boolean - if true then condition match only archived, by default ignored
  • type: allof / oneof - information about that checked will be only one condition or all conditions

Toolbar Panel Templating​

Configuration allows to templating params like:

  • name - available only on Buttons
  • title- available on Panels and Buttons
  • url - available only on CustomLink buttons
  • icon- available only on Buttons

Right now we allow to template two elements:

  • scenario id -$processId
  • scenario name - $processName

Example usage:

  • title: "Metrics for $processName"
  • name: "deploy $processName"
  • url: "/metrics/$processId"
  • icon: "/assets/process-icon-$processId"

Default Process Panel Configuration​

processToolbarConfig {
defaultConfig {
topLeft: []
topRight: [
{
type: "scenario-status-panel"
buttons: [
{ type: "process-properties" }
{ type: "process-compare" }
{ type: "process-migrate", disabled: { archived: true } }
{ type: "process-import", disabled: { archived: true } }
{ type: "process-export" }
{ type: "process-archive", hidden: { archived: true } }
{ type: "process-unarchive", hidden: { archived: false } }
]
}
{ type: "search-panel" }
{ type: "tips-panel" }
{ type: "activities-panel" }
]
topCenter: [
{
id: "top-edit-panel"
type: "buttons-panel"
title: "edit"
hidden: { archived: true }
buttonsVariant: "small"
buttons: [
{ type: "edit-undo" }
{ type: "edit-redo" }
{ type: "edit-copy" }
{ type: "edit-paste" }
{ type: "edit-delete" }
]
}
{
id: "top-actions-panel"
type: "buttons-panel"
title: "actions"
hidden: { archived: true }
buttonsVariant: "small"
buttons: [
{ type: "process-save", title: "Save changes", disabled: { archived: true } }
{
type: "scenario-test"
disabled: { archived: true }
docs: { url: "https://docs.nussknacker.io/scenariosAuthoring/testingAndDebugging", label: "docs" }
}
{ type: "process-deploy", disabled: { fragment: true, archived: true, type: "oneof" } }
{ type: "process-redeploy", disabled: { fragment: true, archived: true, type: "oneof" } }
{ type: "process-cancel", disabled: { fragment: true, archived: true, type: "oneof" } }
{ type: "process-run-off-schedule", disabled: { archived: true }, hidden: { fragment: true } }
{ type: "live-data", disabled: { fragment: true, archived: true, type: "oneof" } }
]
}
]
aboveNodeWindow: [
{
id: "above-node-panel"
type: "buttons-panel"
hidden: { archived: true }
additionalParams: { noDrag: "true" }
buttonsVariant: "small"
buttons: [
{ type: "process-save", title: "Save changes", disabled: { archived: true } }
{
type: "scenario-test"
disabled: { archived: true }
docs: { url: "https://docs.nussknacker.io/scenariosAuthoring/testingAndDebugging", label: "docs" }
}
{ type: "process-deploy", disabled: { fragment: true, archived: true, type: "oneof" } }
{ type: "process-redeploy", disabled: { fragment: true, archived: true, type: "oneof" } }
{ type: "process-cancel", disabled: { fragment: true, archived: true, type: "oneof" } }
{ type: "process-run-off-schedule", disabled: { archived: true }, hidden: { fragment: true } }
{ type: "live-data", disabled: { fragment: true, archived: true, type: "oneof" } }
]
}
]
bottomCenter: [
{
id: "view-panel"
type: "buttons-panel"
title: "view"
buttons: [
{ type: "view-zoom-in" }
{ type: "view-zoom-out" }
{ type: "view-reset" }
{ type: "edit-layout" }
]
}
{
id: "metrics-panel"
type: "buttons-panel"
title: "Metrics"
buttons: [
{ type: "custom-link", name: "metrics", icon: "/assets/buttons/metrics.svg", url: "/metrics/$processName", disabled: { fragment: true } }
{ type: "test-counts" }
{ type: "test-from-file", disabled: { archived: true }, hidden: { fragment: true } }
{ type: "test-generate", disabled: { archived: true }, hidden: { fragment: true } }
{ type: "test-hide" }
]
}
]
dynamicRight: [
{
type: "creator-panel-dynamic"
hidden: { archived: true }
additionalParams: { noDrag: "true", disableCollapse: "true" }
}
]
}
}

Tabs (in the side menu, such as Scenarios etc.) can be configured in the following way:

 tabs: ${tabs} [
{
id: "kibana",
title: "Kibana",
url: "https://myKibana.org/kibana",
type: "IFrame",
requiredPermission: "AdminTab"
}
]

By default, the Scenarios and Components tabs and a Docs link (to https://docs.nussknacker.io/) are configured.

Parameter nameTypeDefault valueDescription
idstringUnique identifier
titlestringTitle appearing in UI
typeIFrame/Local/Remote/UrlType of tab (see below for explanation)
urlstringURL of the tab
requiredPermissionstringOptional parameter, name of Global Permission
adminOnlybooleanfalseOptional. When true, the tab is shown to admins only - other users neither see it in the menu nor can open its url
configurationRecoverybooleanfalseOptional. When true, tab is available also in CONFIGURATION_ERROR mode (for recovery/fix flows)
accessTokenInQuery.enabledbooleanfalseWhen true the parameter holding access token (if OAuth2 authentication is used) will be added to iframe query parameters
accessTokenInQuery.parameterNamestringauth_tokenOptional name of query parameter that holds the access token

The types of tabs can be as follows (see dev-application.conf for some examples):

  • IFrame - contents of the url parameter will be embedded as IFrame
  • Local - redirect to Designer page (/scenarios, /components etc., see designer/client/packages/shell/src/containers/RootRoutes.tsx for other options)
  • Remote - module federation can be used to embed external tabs, url should be in form: {module}/{path}@{host}/{remoteEntry}.js
  • Url - redirect to external page/url

Sticky notes configuration​

Sticky notes on the scenario graph are configured in the stickyNotesSettings section:

stickyNotesSettings: {
maxContentLength: 5000
maxNotesCount: 20
enabled: true
}
Parameter nameTypeDefault valueDescription
maxContentLengthint5000Maximum length of a sticky note's content (characters)
maxNotesCountintOptional maximum number of sticky notes in one scenario or fragment. When not set, the number is not limited
enabledbooleantrueWhen false, the sticky notes feature is disabled: sticky notes can't be created and are not loaded into the graph

Topics extension​

The enterprise Topics extension adds the Topics page, where users create, edit, preview and remove Kafka topics and their schemas. It is configured under topicsExtension and shown through a Remote tab ({id: "topics", url: "nuEnterpriseTopics/tab@/static/topics/remoteEntry.js", title: "Topics", type: "Remote"}).

Parameter nameImportanceTypeDefault valueDescription
topicsExtension.processingTypeHighstringProcessing type whose model configuration supplies the Kafka and schema registry connection (components.webhook.config) and the namespace of topic names
topicsExtension.topicLimitMediumintno limitMaximum number of topics of this instance; adding a topic beyond it is refused
topicsExtension.defaultPartitionsMediumintNumber of partitions of a newly created topic
topicsExtension.defaultReplicationFactorMediumshortReplication factor of a newly created topic
topicsExtension.defaultRetentionHoursMediumintRetention of a new topic when none is given, e.g. when it is created with the Create New Topic button of a Kafka source or sink
topicsExtension.maxMessageBytesMediumlongmax.message.bytes of a newly created topic

All parameters except topicLimit are required.

Environment configuration​

Nussknacker installation may consist of more than one environment. Typical example is a configuration, where you have:

  • environment for testing scenarios, which mirrors production data (e.g. via Kafka mirror-maker), but contains only scenarios that are currently worked on
  • production environment

You can configure secondaryEnvironment to allow for

  • easy migration of scenarios
  • comparing scenarios between environments
  • testing (currently only via REST API) if all scenarios from secondary environment are valid with model configuration from this environment (useful for testing configuration etc.) Currently, you can only configure secondary environment if it uses BASIC authentication - technical user is needed to access REST API.
Parameter nameImportanceTypeDefault valueDescription
environmentMediumstringUsed mainly for metrics configuration. Please note: it has to be consistent with the env tag of the metrics - in the Docker Compose installation set by telegraf/telegraf.conf from NU_ENVIRONMENT
environmentAlert.contentLowstringHuman readable name of environment, to display in UI
environmentAlert.colorLowindicator-green / indicator-blue / indicator-yellow / indicator-redColor of environment indicator
secondaryEnvironment.uriMediumstringURL of Nussknacker REST API e.g. http://secondary.host:8080/api
secondaryEnvironment.userMediumstringUser that should be used for migration/comparison
secondaryEnvironment.passwordMediumstringPassword of the user that should be used for migration/comparison
secondaryEnvironment.remoteConfig.batchSizeLowint10For testing compatibility we have to load all scenarios, we do it in batches to optimize
secondaryEnvironment.targetEnvironmentIdLowstringName of the secondary environment (used mainly for messages for user)

Testing​

Parameter nameImportanceTypeDefault valueDescription
testDataSettings.maxSamplesCountMediumint20Limits the number of samples to be generated and received from a file
testDataSettings.testDataMaxLengthLowint200000Limits the size (in characters) of the test data generated and received in tests from a file
testDataSettings.resultsMaxBytesLowlong50000000Limits the size (in bytes) of returned test results (i.e. variables for each node, invocation results and errors)
testCasesSettings.multipleEnabledLowbooleantrueAllows more than one test case per scenario
testCasesSettings.multipleParallelismExecutionLowint1How many test cases are run at the same time by Run all

Other configuration options​

Parameter nameImportanceTypeDefault valueDescription
attachments.maxSizeInBytesMediumlong10485760Limits max size of scenario attachment, by default to 10mb
analytics.engineLowMatomoCurrently only available analytics engine is Matomo
analytics.urlLowstringURL of Matomo server
analytics.siteIdLowstringSite id
intervalTimeSettings.processesLowint20000How often frontend reloads scenario list
intervalTimeSettings.healthCheckLowint30000How often frontend reloads checks scenarios states
developmentModeMediumbooleanfalseFor development mode we disable some security features like CORS. Don't use in production
enableConfigEndpointMediumbooleanfalseExpose config over http (GET /api/app/config/) - requires admin permission. Please mind, that config often contains password or other confidential data - this feature is meant to be used only on 'non-prod' envrionments.
redirectAfterArchiveLowbooleantrueRedirect to scenarios list after archive operation.
scenarioLabelSettings.validationRulesLowarray[]Allows to configure validation rules for scenario labels
scenarioLabelSettings.validationRules[0].validationPatternLowstringRegular expression for scenario label validation
scenarioLabelSettings.validationRules[0].validationMessageLowstringHint shown to the user when the scenario label does not match the given validation regex
scenarioStateTimeoutLowduration5 secondsTimeout for fetching scenario state operation
monitoring.scenarioViewTracking.enabledLowbooleantrueWhether the time users spend in the Designer, and with each scenario presented, is recorded. It feeds the User activity timeline, Online now on Status and presence on Insights under Monitoring, so turning it off empties all of them. Sessions recorded before it was turned off are still removed after retention
monitoring.scenarioViewTracking.inactivityGapLowduration3 minutesHow long a break in looking at a scenario still counts as the same session. There is no event saying that somebody closed a scenario, so this is what decides where one session ends and the next begins. Has to stay well above the interval the UI reports with - browsers throttle a background tab to about a report a minute - so that a hidden window does not cut one sitting into pieces
monitoring.scenarioViewTracking.minimumTimeBetweenReportsLowduration15 secondsHow rarely a report is written down, however often it arrives, per thing being reported - a scenario, or simply having the Designer open. The first switch to another version of a scenario within that time is written down at once. It decides the write load of the feature, and also how much of a session is lost at its end, which is never reported. Has to stay at or below half of onlineWindow, and well below inactivityGap
monitoring.scenarioViewTracking.onlineWindowLowduration45 secondsHow long after their last report a user is still shown as looking at what they last reported, on the Status page. Has to stay at or above twice minimumTimeBetweenReports, and below inactivityGap. A report arriving just before the throttle lets one through waits out another whole interval, so a viewer who never left can go unrecorded for the throttle plus the interval the UI reports with, and would blink out of the page if the window did not cover it
monitoring.scenarioViewTracking.retentionLowduration92 daysHow long a recorded session is kept. Nothing else removes them, and the User activity timeline reaches back monitoring.userActivities.maxTimelinePeriod at most
monitoring.scenarioViewTracking.cleanupIntervalLowduration1 hourHow often the sessions older than the retention are swept away. Runs on the leader only
monitoring.scenarioViewTracking.cleanupTimeoutLowduration1 minuteHow long one sweep is waited for before it is abandoned and retried next time round
monitoring.engineDiagnostics.cacheTTLLowduration30 secondsHow long the answer of the Engines section is served before the engines are asked again. Shared between everybody looking, so this caps how much traffic the section can cause
monitoring.engineDiagnostics.timeoutLowduration10 secondsHow long a single engine has to answer before it is reported as not answering
monitoring.insights.hourlyBucketsUpToLowduration48 hoursUp to this long a period is drawn in hourly buckets on the Insights charts, above it in daily ones. At most 14 days
monitoring.insights.liveDataFreshnessLowduration5 minutesHow long after its last report a scenario still counts as reporting live data rather than being stale
monitoring.insights.liveDataHorizonLowduration24 hoursHow far back a live data row is still worth reading. Past this it describes a deployment that is long gone
monitoring.insights.liveDataCollectorSilenceLowduration15 secondsHow long one collector of a scenario may fall behind the scenario's most recent upload before what it reported is no longer added up: it is taken for one that a restart replaced. Keep it well above how often the engines upload (uploadIntervalInSeconds, and idleIntervalInSeconds when samples are uploaded on demand)
monitoring.userActivities.defaultLimitLowint100How many activities the user activity API answers with when no limit is given
monitoring.userActivities.maxLimitLowint1000The most activities the user activity API answers with. A larger limit is lowered to this; hasMore tells there are more
monitoring.userActivities.usersCacheTTLLowduration5 minutesHow long the list of users the pickers offer is served before it is read again. Counting the activities of every user reads the whole activity table, so the answer is shared between everybody looking
monitoring.userActivities.defaultTimelinePeriodLowduration7 daysThe period the timeline covers when none is asked for
monitoring.userActivities.maxTimelinePeriodLowduration92 daysThe longest period the timeline can be asked for
usageStatisticsReports.enabledLowbooleantrueWhen enabled browser will send anonymous usage statistics reports to stats.nussknacker.io
usageStatisticsReports.errorReportsEnabledLowbooleantrueWhen enabled browser will send anonymous errors reports to stats.nussknacker.io
assistantSettings.enabledLowbooleanfalseWhether the AI assistant is shown in the Designer. The assistant itself is configured in assistantHttpService

AI assistant​

The AI assistant consists of the chat in the Designer and the assistant extension running in the Designer's backend. To use it:

  1. Put the extension on the Designer's classpath. The nussknacker Designer image contains it in /opt/nussknacker/extensions/assistant/, so add /opt/nussknacker/extensions/assistant/* to CLASSPATH.
  2. Turn the chat on with assistantSettings.enabled: true.
  3. Configure the assistant under assistantHttpService.assistant. Without this section the extension starts the dummy assistant, which only echoes the question back - useful for checking the setup, not for users.

The LLM assistant answers questions from documentation embeddings: a file, built from this documentation, that is searched for the fragments relevant to a question. The model itself is called through the API of the configured provider, with your API key.

assistantSettings {
enabled: true
}

assistantHttpService {
assistant {
type: "llm"
llmModel {
type: "anthropic"
apiKey: ${ASSISTANT_API_KEY}
modelName: "claude-sonnet-4-6"
# tool calls that build scenarios carry large arguments; a low output limit cuts them off
maxTokens: 16000
}
embeddingsResourceUri: "file:/opt/nussknacker/designer-assistant-embeddings/embeddings.store"
# lets the model read and edit scenarios with the Designer's tools
useExternalTools: true
historyMaxMessages: 200
}
}
Parameter nameImportanceTypeDefault valueDescription
assistantHttpService.assistant.typeHighstringdummyllm for the assistant backed by a language model, dummy for a stub that answers with a fixed message
assistantHttpService.assistant.llmModelHighobjectThe model to use, see the table below. Required for llm
assistantHttpService.assistant.embeddingsResourceUriHighURILocation of the documentation embeddings file, as a file: or classpath: URI. Required for llm
assistantHttpService.assistant.useExternalToolsHighbooleanfalseWhether the model may call the tools the Designer sends with each message, i.e. read and edit scenarios, manage topics, read skills. When false the assistant only answers questions from the documentation
assistantHttpService.assistant.promptLowstringbuilt-in promptSystem prompt of the assistant. Replacing it replaces the built-in instructions entirely
assistantHttpService.assistant.historyMaxMessagesMediumint50How many of the latest messages of a conversation the assistant remembers. Every tool call takes several messages, so building a scenario with tools needs a larger value, e.g. 200
assistantHttpService.assistant.contentRetrieverMaxResultsLowint15How many documentation fragments are retrieved for one search
assistantHttpService.assistant.contentRetrieverMinScoreLowdoubleMinimal relevance score (between 0 and 1) of a documentation fragment to be used. No limit when not set

llmModel.type selects the provider. Each provider has its own fields:

llmModel.typeFields (defaults)
open-aiapiKey, modelName (gpt-4.1-mini), temperature, topP, maxCompletionTokens, maxRetries (3)
mistralapiKey, modelName (mistral-medium-latest), temperature, topP, maxTokens, maxRetries (3)
anthropicapiKey, modelName (claude-haiku-4-5), temperature, topP, maxTokens, maxRetries (3)
one-ofllmModels - a list of the models above, tried in order: when one fails, the next one is used

apiKey is required; the other fields are optional. maxRetries applies only to non-streaming requests.

Conversations are kept in the Designer's memory and are lost when the Designer restarts.

Usage statistics storage (QuestDB)​

The Designer keeps the usage statistics sent by the browser (POST /api/statistic) in an embedded QuestDB database stored on the local disk. They are summed up per day, and today's sums are added to the anonymous usage statistics report (see usageStatisticsReports above). Nothing else is stored there, and QuestDB failing to start only turns the collection off - the Designer starts anyway. The storage is on unless questDbSettings.enabled is set to false.

Parameter nameImportanceTypeDefault valueDescription
questDbSettings.enabledLowbooleantrueWhether the statistics sent by the browser are collected
questDbSettings.directoryLowstring<java.io.tmpdir>/nu/<instanceId>Directory of the QuestDB files
questDbSettings.instanceIdLowstringdesigner-statisticsName of the directory under the temporary directory when directory is not set. With several Designer instances on one host, give each its own
questDbSettings.tasksExecutionDelayLowduration30 secondsHow often the statistics gathered in memory are written to QuestDB
questDbSettings.retentionDelayLowduration24 hoursHow often the days before today are dropped
questDbSettings.poolConfig.corePoolSizeLowint2Core size of the thread pool reading and writing the statistics. When poolConfig is set, all four of its fields have to be given
questDbSettings.poolConfig.maxPoolSizeLowint4Maximum size of that thread pool
questDbSettings.poolConfig.keepAliveTimeInSecondsLowlong60How long an idle thread above the core size is kept
questDbSettings.poolConfig.queueCapacityLowint8Capacity of the queue of that thread pool

Node actions extension​

The nodes-actions Designer extension (extensions/nodes-actions/nodes-actions.jar in the Designer image, activated by adding it to the CLASSPATH) serves the action buttons of the node window and the Key-Value Store namespace management: it creates the topic behind an HTTP endpoint (generate-endpoint), sends the data sample of a source to that topic (send-sample-request), checks a WebSocket subscription (test-ws-forwarder) and creates and deletes KV namespaces (create-kv-namespace, delete-kv-namespace). It is exposed under /api/custom/nodes, e.g. POST /api/custom/nodes/{scenarioName}/actions with the action name in actionName.

Messages are sent to a topic, and WebSocket subscriptions are checked, through Blabber, the HTTP and WebSocket gateway to Kafka. When the extension is on the classpath, nodesActionsHttpService is required: without gateway.httpApiGatewayFormatUrl and blabberManagement the Designer does not start.

Parameter nameImportanceTypeDefault valueDescription
nodesActionsHttpService.gateway.httpApiGatewayFormatUrlHighstringURL a message for a topic is POSTed to, with $topicName where the topic name goes
nodesActionsHttpService.gateway.auth.usernameMediumstringBasic Auth user for the gateway. Without auth, the requests carry no credentials; with it, both fields have to be non-empty
nodesActionsHttpService.gateway.auth.passwordMediumstringBasic Auth password for the gateway
nodesActionsHttpService.blabberManagement.baseUriHighstringBase URI of the Blabber management API; WebSocket subscriptions are checked with POST <baseUri>/forwarding/test
nodesActionsHttpService.blabberManagement.accessTokenHighstringBearer token for the Blabber management API
nodesActionsHttpService {
gateway {
httpApiGatewayFormatUrl: "http://blabber:8147/topics/$topicName"
auth {
username: ${BLABBER_PUBLISHER_USER}
password: ${BLABBER_PUBLISHER_PASSWORD}
}
}
blabberManagement {
baseUri: "http://blabber:8147/management"
accessToken: ${BLABBER_ACCESS_TOKEN}
}
}

The topics themselves are created through the topics registry, configured separately.

Scenario type, categories​

Every scenario has to belong to a group called category. Category defines the business area around which you can organize users permissions.

For example, in one Nussknacker installation you can have scenarios detecting frauds, and those implementing marketing campaigns. Then, the configuration will look like:

scenarioTypes {
streaming-marketing {
deploymentConfig {
(...)
}
modelConfig {
(...)
}
category: "Marketing"
}
streaming-fraud-detection {
deploymentConfig {
(...)
}
modelConfig {
(...)
}
category: "Fraud Detection"
}
}

Scenario type configuration consists of parts:

In Nussknacker distribution there are preconfigured scenario types:

  • streaming - using Flink Deployment Manager providing both stateful and stateless streaming components
  • streaming-lite-embedded - using embedded Lite Deployment Manager in Streaming processing mode providing only stateless streaming components
  • request-response-embedded - use embedded Request-Response Deployment Manager, scenario logic is exposed as REST API, on additional HTTP port at Designer

Each of these scenario types has Default category assigned.