Configuration Guide
1. Overview
This document describes the configuration options for the Northbound API application. The application uses multiple configuration files:
-
api.properties- Main API configuration -
Environment variables (in Docker via
.env.mysqlor.env.oracle) -
Spring configuration profiles in YAML format
-
hazelcast-client.yaml- Hazelcast client configuration for caching
2. API Properties Configuration
The api.properties file contains core settings that control the behavior of the API.
This file is loaded from the path specified in the API_CONFIG_PATH environment variable.
2.1. SOAP API Configuration
| Property | Description |
|---|---|
|
SOAP API endpoint name. Default: FTACSWS |
|
Controls whether to show transactionId in the result XML. Default: |
2.2. Request Handling Settings
| Property | Description |
|---|---|
|
Default value for reprovision when absent in request. Default: |
|
Timeout in seconds for FTGetDeviceParameters(REST analog(HTTP method, path): POST, api/Parameter) when a source != "1". Default: |
|
Timeout in seconds to wait for CPE creation in FTCreateDevice(REST analog(HTTP method, path): PUT, api/Device/). |
|
Whether to check model name and OUI before creating CPE. Default: |
|
Whether to check if parameter exists (used in FTAddObject(REST analog(HTTP method, path): PUT, api/Object/) and FTSetDeviceParameters(REST analog(HTTP method, path): PUT, api/Parameter)). Default: |
|
Priority for tasks when isn’t set in the request. Default: |
|
Default value for push. Default: |
|
If |
|
Whether username and password are required for device operations. Default: |
2.3. Logging Configuration
| Property | Description |
|---|---|
|
Whether to store log information in the database (table process_log). Default: |
|
Whether to store log information in the ProcessLog file. Default: |
|
Log level setting: |
|
Directory where ProcessLog files are stored. Default: |
|
For |
|
For ProcessLogLevel= |
2.4. Runtime Log Level Management
The application supports changing the log level at runtime without restarting the container, using Spring Boot Actuator.
| Level | What is logged |
|---|---|
|
Critical errors only (lost connection to ACS/DB) |
|
Business errors (device not found, invalid parameter) — without stack trace |
|
Key operations (startup, authorization, main actions) |
|
Detailed diagnostics + stack traces for business errors |
|
In production use |
2.4.1. Changing log level on the fly (Actuator)
Changes take effect immediately, no restart required. Resets on container restart.
curl http://<host>:8080/iot-webservice/actuator/loggers/com.friendly.northboundapi
{
"configuredLevel": "DEBUG",
"effectiveLevel": "DEBUG"
}
curl -X POST http://<host>:8080/iot-webservice/actuator/loggers/com.friendly.northboundapi \
-H 'Content-Type: application/json' \
-d '{"configuredLevel": "INFO"}'
curl -X POST http://<host>:8080/iot-webservice/actuator/loggers/com.friendly.northboundapi \
-H 'Content-Type: application/json' \
-d '{"configuredLevel": "DEBUG"}'
curl -X POST http://<host>:8080/iot-webservice/actuator/loggers/com.friendly.northboundapi \
-H 'Content-Type: application/json' \
-d '{"configuredLevel": null}'
| All POST requests return HTTP 204 No Content with an empty body — this is the expected success response. To verify the change, use the GET request above. |
If the API runs over HTTPS (port 8443), use https://<host>:8443 and add -k for self-signed certificates.
|
2.4.2. Changing the log level for a specific package
# Example: enable DEBUG only for custom RPC service
curl -X POST http://<host>:8080/iot-webservice/actuator/loggers/com.friendly.northboundapi.customrpc \
-H 'Content-Type: application/json' \
-d '{"configuredLevel": "DEBUG"}'
2.4.3. Changing log level via environment variable (on restart)
Set LOGGING_LEVEL_COM_FRIENDLY_NORTHBOUNDAPI in the environment file (.env.mysql or .env.oracle):
# Values: ERROR, WARN, INFO, DEBUG
LOGGING_LEVEL_COM_FRIENDLY_NORTHBOUNDAPI=INFO
The change takes effect on container restart.
2.4.4. Troubleshooting scenario: investigating a business error
-
Enable DEBUG to get stack traces:
curl -X POST http://<host>:8080/iot-webservice/actuator/loggers/com.friendly.northboundapi \ -H 'Content-Type: application/json' \ -d '{"configuredLevel": "DEBUG"}' -
Reproduce the issue
-
Collect logs — business errors now include full stack traces
-
Restore INFO after investigation:
curl -X POST http://<host>:8080/iot-webservice/actuator/loggers/com.friendly.northboundapi \ -H 'Content-Type: application/json' \ -d '{"configuredLevel": "INFO"}'
2.5. Timeout Settings
| Property | Description |
|---|---|
|
Additional timeout in seconds for kickDevice (test online status). Used in FTCPEStatus(REST analog(HTTP method, path): POST, api/Device/Status), FTGetDeviceParametersTransID(REST analog(HTTP method, path): POST, api/Transaction/Parameter) and FTGetDeviceParameters(REST analog(HTTP method, path): POST, api/Parameter). Default: |
|
ACS response timeout in seconds. Default: |
|
Timeout in milliseconds for waiting for RPC response in FTRPCInvoke(REST analog(HTTP method, path): PUT, api/Rpc). Default: |
|
Transaction timeout in seconds. Default: |
2.6. ISP and Authentication Settings
| Property | Description |
|---|---|
|
ISP setting mode: |
|
Whether to enable authentication by username/password. Default: |
2.7. Upload Settings
| Property | Description |
|---|---|
|
HTTP URL for upload. Default: |
|
HTTP username for upload. Default: not set |
|
HTTP password for upload. Default: not set |
|
FTP URL for upload. Default: |
|
FTP username for upload. Default: not set |
|
FTP password for upload. Default: not set |
|
List of extensions for upload files, delimited by |
|
Maintain environment-specific versions of the upload endpoints (DEV/QA/PROD) in |
2.8. Miscellaneous Settings
| Property | Description |
|---|---|
|
Whether to write statistics into 'process_stat'. Default: |
|
Whether connection strings are encrypted. Default: |
|
Defines which ACS method is used by FTGetDeviceParameters: |
3. Environment Variables Configuration
The application uses environment variables for configuring database connections, service endpoints, and other runtime settings.
These variables can be specified in the environment file (.env.mysql or .env.oracle) when running with Docker.
3.1. Application Configuration
| Environment Variable | Description |
|---|---|
|
HTTP port. When HTTPS is enabled, this value is used by the additional plain-HTTP connector ( |
|
Primary HTTPS listener port ( |
|
Active Spring profile ( |
|
Enable HTTPS/TLS listener ( |
|
Path to the TLS keystore, for example |
|
Password for the TLS keystore |
|
Keystore type ( |
|
Private key password (if different from keystore password) |
|
Alias of the certificate key in the keystore. Default: |
|
Optional trust store path used for custom CA or mTLS setups |
|
Password for optional trust store |
To enable HTTPS in Docker, place keystore file (for example keystore.p12) in ./configs,
set SERVER_SSL_ENABLED=true, set HTTPS_PORT=8443, and provide keystore passwords in the environment file.
In this mode Tomcat starts with two connectors: HTTPS on HTTPS_PORT and HTTP on PORT.
Keep PORT and HTTPS_PORT different to avoid connector binding conflicts.
3.2. Database Configuration
3.2.1. Common Settings
| Environment Variable | Description |
|---|---|
|
Upper bound for the HikariCP pool. Raise it for high-concurrency workloads, but be mindful of the actual database limits. Default: |
|
Minimum number of warm connections that HikariCP keeps ready. Lower values reduce idle resource usage; higher values keep latency low for bursty workloads. Default: |
|
How long the application will wait for a free connection before failing a request. Increase this when the database experiences temporary spikes. Default: |
3.2.2. MySQL Profile
| Environment Variable | Description |
|---|---|
|
Complete JDBC URL override. Provide this when you need extra connection parameters or wish to skip separate host/port/schema variables. Default: auto-generated from |
|
MySQL hostname. Defaults to |
|
The port exposed by the MySQL server or container. Default: |
|
Schema (database) name that stores the ACS data. Default: |
|
User account used by the application. Adjust this if you delegate access through a read/write database role. Inherits |
|
Password for |
|
Driver class used by Spring Boot. Change it only when targeting a MySQL-compatible engine with a vendor driver. Default: |
|
Schema (database) name of the OneIoT web back-end, read by the second |
|
Complete JDBC URL override for the |
3.2.3. Oracle Profile
| Environment Variable | Description |
|---|---|
|
Complete JDBC URL override. Useful when connecting through Oracle Wallets or adding advanced parameters – the host/port/service variables are ignored once this is set. Default: |
|
Oracle hostname or service name exposed via Docker. Defaults back to |
|
Oracle listener port. Default: |
|
Oracle service/SID that contains the ACS schema. Default: |
|
Shared fallback user for both Oracle datasources. Used when the datasource-specific |
|
Shared fallback password for both Oracle datasources. Used when the datasource-specific |
|
User owning the ACS (FTACS) schema. Falls back to |
|
Password for |
|
User owning the OneIoT web back-end schema, read by the second |
|
Password for |
|
Oracle JDBC driver class name. Keep |
3.2.4. IOTW (OneIoT) Datasource
The application opens a second datasource named iotw against the OneIoT web back-end schema. It is required by the Group Update API (condition views are read from this schema); other endpoints do not use it.
It is configured through the active database profile rather than a separate variable set:
-
MySQL profile — reuses
MYSQL_HOST,MYSQL_PORT,MYSQL_USER,MYSQL_PASSWORD, andMYSQL_DRIVER_CLASS_NAME. Only the schema differs, viaMYSQL_SCHEMA_IOTW(or a fullMYSQL_URL_IOTWoverride). See MySQL Profile. -
Oracle profile — reuses the same listener (
ORACLE_HOST/ORACLE_PORT/ORACLE_SERVICEorORACLE_JDBC_URL) andORACLE_DRIVER_CLASS_NAME. The schema is selected by a dedicated account throughORACLE_USER_IOTW/ORACLE_PASSWORD_IOTW. See Oracle Profile.
There are no IOTW_DATABASE_URL / IOTW_DATABASE_USER / IOTW_DATABASE_PASS / IOTW_DRIVER_CLASS_NAME variables — the iotw datasource is driven entirely by the *_IOTW variables of the active profile listed above.
|
3.3. SQL Login Queries
The following properties define SQL statements used to authenticate administrative users:
| Property | Description |
|---|---|
|
Query to authenticate by name when |
|
Query to authenticate by name when |
|
Query to authenticate by name when |
3.4. ACS Service Configuration
| Environment Variable | Description |
|---|---|
|
Base URL of the ACS service ( |
|
Port of the ACS service. Typical values: |
|
Username for ACS service authentication. Default: |
|
Password for ACS service authentication. Default: |
3.5. Other Configuration
| Environment Variable | Description |
|---|---|
|
Path to API configuration properties file. Default: |
|
Path to Hazelcast client configuration directory. Default: |
|
Secret key for JWT token generation and validation. Default: |
|
JWT token expiration time in milliseconds. Default: |
|
Log level for the application package ( |
|
Make sure to place the |
4. Cache Configuration
The application uses Hazelcast for caching.
The Hazelcast client configuration is stored in hazelcast-client.yaml (or hazelcast-client.yml in legacy deployments) and is mounted into the container via the CACHE_CONFIG_PATH environment variable.
Place the file in the working directory next to api.properties when following the Docker layout from the installation guide so it resolves to /etc/app/hazelcast-client.yaml inside the container.
A configuration looks like this (update cluster-name to the value used by your Hazelcast deployment and adjust other fields as required):
# Copyright (c) 2008-2024, Hazelcast, Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# The default Hazelcast client configuration used in hz-cli script.
#
# This file differs from hazelcast-client-default.yaml in some settings
# and it is used in the ZIP/TAR distributions,
# which are the basis for other distributions like docker & package managers.
#
# To learn how to configure Hazelcast, please see the Reference Manual
# at https://docs.hazelcast.com/
hazelcast-client:
cluster-name: dev
properties:
hazelcast.client.shuffle.member.list: true
hazelcast.client.heartbeat.timeout: 60000
hazelcast.client.heartbeat.interval: 5000
hazelcast.client.event.thread.count: 5
hazelcast.client.event.queue.capacity: 1000000
hazelcast.client.invocation.timeout.seconds: 120
network:
# List of addresses for the client to try to connect to. All members of
# a Hazelcast cluster accept client connections.
# Use the format <hostname>:<port>
# If a port number is not specified, port range 5701-5703 will be tried.
cluster-members:
- ipOrHostName:portLike5701
# Whether client should discover and connect other members in the cluster
# and route requests to them or only connects to the members listed
# above.
# cluster-routing:
# mode: "ALL_MEMBERS"
redo-operation: true
connection-timeout: 60000
socket-options:
tcp-no-delay: false
keep-alive: true
reuse-address: true
linger-seconds: 3
buffer-size: 128
near-cache:
default:
time-to-live-seconds: 90
max-idle-seconds: 100
invalidate-on-change: true
in-memory-format: OBJECT
serialize-keys: true
local-update-policy: INVALIDATE
preloader:
enabled: false
directory: directory
store-initial-delay-seconds: 50
store-interval-seconds: 10
connection-strategy:
async-start: true
reconnect-mode: ASYNC
connection-retry:
initial-backoff-millis: 2000
max-backoff-millis: 60000
multiplier: 3
cluster-connect-timeout-millis: 5000
jitter: 0.5
user-code-deployment:
enabled: false
cluster-name must match the server-side Hazelcast configuration; using a mismatched value prevents the client from joining the cluster.
Update cluster-members to match the hostnames or container names that run the Hazelcast members on your Docker network.
The default parameters and their values are:
| Parameter | Default Value | Description |
|---|---|---|
cluster-name |
ft-iot-cache |
Name of the Hazelcast cluster the client connects to. |
properties.hazelcast.client.shuffle.member.list |
true |
Whether to shuffle the list of cluster members before attempting connection. |
properties.hazelcast.client.heartbeat.timeout |
60000 |
Heartbeat timeout in milliseconds for client-server health checks. |
properties.hazelcast.client.heartbeat.interval |
5000 |
Interval in milliseconds between heartbeat messages. |
properties.hazelcast.client.event.thread.count |
5 |
Number of threads dedicated to processing cluster events. |
properties.hazelcast.client.event.queue.capacity |
1000000 |
Maximum number of events to queue for processing. |
properties.hazelcast.client.invocation.timeout.seconds |
120 |
Operation invocation timeout in seconds before failure. |
network.cluster-members |
127.0.0.1:5701 |
Comma-separated list of cluster member addresses in host:port format. |
network.redo-operation |
true |
Whether to automatically retry failed operations. |
network.connection-timeout |
60000 |
Socket connection timeout in milliseconds. |
network.socket-options.tcp-no-delay |
false |
Enable TCP_NODELAY to disable Nagle’s algorithm. |
network.socket-options.keep-alive |
true |
Enable SO_KEEPALIVE to detect dead peers. |
network.socket-options.reuse-address |
true |
Enable SO_REUSEADDR to allow address reuse. |
network.socket-options.linger-seconds |
3 |
Linger time in seconds before closing the socket. |
network.socket-options.buffer-size |
128 |
Socket buffer size in bytes. |
near-cache.default.time-to-live-seconds |
90 |
Time-to-live for near-cache entries in seconds. |
near-cache.default.max-idle-seconds |
100 |
Maximum idle time in seconds before near-cache eviction. |
near-cache.default.invalidate-on-change |
true |
Invalidate near-cache entries upon cluster data changes. |
near-cache.default.in-memory-format |
OBJECT |
Format for storing cache entries (OBJECT or BINARY). |
near-cache.default.serialize-keys |
true |
Whether to serialize keys when storing in near-cache. |
near-cache.default.local-update-policy |
INVALIDATE |
Policy for handling local updates: INVALIDATE or CACHE. |
near-cache.default.preloader.enabled |
false |
Whether the near-cache preloader is enabled. |
near-cache.default.preloader.directory |
directory |
Filesystem directory to store near-cache preload data. |
near-cache.default.preloader.store-initial-delay-seconds |
50 |
Initial delay in seconds before the first preloader store. |
near-cache.default.preloader.store-interval-seconds |
10 |
Interval in seconds between preloader store executions. |
connection-strategy.async-start |
true |
Whether to start the client connection process asynchronously. |
connection-strategy.reconnect-mode |
ASYNC |
Reconnection strategy mode for handling lost connections. |
connection-strategy.connection-retry.initial-backoff-millis |
2000 |
Initial backoff in milliseconds for retrying connections. |
connection-strategy.connection-retry.max-backoff-millis |
60000 |
Maximum backoff in milliseconds for retrying connections. |
connection-strategy.connection-retry.multiplier |
3 |
Multiplier for exponential backoff between retries. |
connection-strategy.connection-retry.cluster-connect-timeout-millis |
5000 |
Timeout in milliseconds for initial cluster discovery. |
connection-strategy.connection-retry.jitter |
0.5 |
Jitter factor to randomize retry intervals. |
user-code-deployment.enabled |
false |
Whether deployment of user-provided code is enabled. |
5. Docker Configuration
When running in Docker, the application uses the settings from the environment file (.env.mysql or .env.oracle) and mounts the configuration files.
The Docker container exposes port 8080 and includes a healthcheck to monitor application health.
See the Dockerfile and Docker Installation Guide for more details on Docker deployment.