Docker Container Setup
i-net Clear Reports can be used from inside a Docker Container. There is a pre-built container based up on an alpine release at Docker Hub. The container only brings the application and tools required to run the application.
Note: The container does not provide any default users. You have to use the Sign Up button to create a new user account first. After running the docker command, open the server UI, e.g. http://localhost:9000. You can find the Sign Up button at the top right of the server UI. See below for advanced use cases.
Quickstart
Run the following command to start an i-net Clear Reports Server Docker Container:
docker run -d -p 9000:9000 -e CONF_listener__port=9000 --name reporting inetsoftware/i-net-clear-reports
Available Tags
-
i-net Clear Reports 26.4: latest, alpine-26, alpine-26.4 (latest can be the next major version, new license key may be required)
-
i-net Clear Reports 25.10: alpine-25.10
-
i-net Clear Reports 25.x: alpine-25
-
i-net Clear Reports 24.x: alpine-24
-
i-net Clear Reports 23.x: alpine-23
-
i-net Clear Reports 22.10: alpine-22.10 (last supported version)
Creating a pre-set configuration
The i-net Clear Reports Docker Container should be pre-configured using either a configuration properties file or environment variables. Either way, a local installation with the specific setup should be created first. Using the Maintenance module a backup of the configuration can be created and the configuration properties file in there can be used as a basis.
Note: To have the container fully set up on startup you have to specify at least the following properties: CONF_listener__port and CONF_licensekey
Note: In private cloud environments you have to set the property CONF_serverURL as well. It is recommended to set this property in other environments too.
Adding the configuration
A configuration file can be added by using a volume or any other means that adds a specified configuration to the container. The default configuration file can be used or a different one can be set using an environment variable. See Environment Properties Matrix.
Example
version: '2.1' services: reporting: image: 'inetsoftware/i-net-clear-reports:latest' restart: 'always' ports: - 9000:9000 environment: - DEFAULT_PROPFILE=/tmp/defaultConfiguration.properties - DEFAULT_CONFIG=User/Default # Set the externally visible server url (un-comment and insert the correct url) #- CONF_serverURL=https://hostname.company.com:9443/ # Set the license key (un-comment and insert the full license key) #- CONF_licensekey=... # Run the application on a pre-determined port for easier mapping - CONF_listener__port=9000 # Customize an option, e.g. the theming colors - CONF_theme__themecolors={"@base-color":"#0a89dd","@primary-color":"#42a7ca"} # Enable logging, route log to the container log-file - CONF_log__engine=true - CONF_log__file=/dev/stdout # Location for automatic backups - CONF_BackupLocation=/home/reporting/.i-net software/reporting_User_Default/backup
Using Docker Secrets
For sensitive configuration values like license keys, Docker secrets provide a more secure alternative to environment variables. Secrets are automatically loaded from the /run/secrets/ directory and made available as environment variables.
Note: The container automatically loads all files from /run/secrets/. For files starting with conf_ (case-insensitive), the CONF_ prefix is kept uppercase and the rest is converted to lowercase. For example:
-
A secret file named
conf_licensekeywill be available as the environment variableCONF_licensekey -
A secret file named
conf_listener__portbecomesCONF_listener__port -
For other secret files, the entire filename is uppercased
Important: For configuration keys with mixed-case (like serverURL), you must use explicit mapping because automatic loading converts everything after CONF_ to lowercase. For example:
-
Config key
serverURLrequires environment variableCONF_serverURL(with uppercase URL) -
Automatic loading of
conf_serverurlwould createCONF_serverurl(all lowercase), which is incorrect -
Use explicit mapping: Set
SECRET_CONF_serverURLenvironment variable to load from/run/secrets/conf_serverurland export asCONF_serverURL
Important: The container runs as a non-root user (typically UID 1000/GID 1000). Secret files must be readable by the container's group. When creating secret files on the Docker host, ensure they have the correct permissions. If the container shows a permission error, it will display the actual GID that needs read access.
To use Docker secrets, you need to:
-
Create the secret file on your Docker host (e.g.,
/etc/docker/secrets/conf_licensekey) -
Set proper permissions so the file is readable by the container's group (typically GID 1000)
-
Configure the secret in your
docker-compose.ymlfile
Example: Simple secret (all lowercase)
For configuration keys that are all lowercase (like licensekey), you can use automatic loading:
version: '2.1' services: reporting: image: 'inetsoftware/i-net-clear-reports:latest' restart: 'always' ports: - 9000:9000 secrets: - conf_licensekey environment: - DEFAULT_PROPFILE=/tmp/defaultConfiguration.properties - DEFAULT_CONFIG=User/Default - CONF_listener__port=9000 # The license key will be automatically loaded from /run/secrets/conf_licensekey # and available as CONF_licensekey environment variable secrets: conf_licensekey: file: /etc/docker/secrets/conf_licensekey
Example: Mixed-case secret (requires explicit mapping)
For configuration keys with mixed-case (like serverURL), you must use explicit mapping:
version: '2.1' services: reporting: image: 'inetsoftware/i-net-clear-reports:latest' restart: 'always' ports: - 9000:9000 secrets: - conf_serverurl environment: - DEFAULT_PROPFILE=/tmp/defaultConfiguration.properties - DEFAULT_CONFIG=User/Default - CONF_listener__port=9000 # Explicit mapping for mixed-case: SECRET_CONF_serverURL loads from /run/secrets/conf_serverurl # and exports as CONF_serverURL (preserving the mixed case) - SECRET_CONF_serverURL secrets: conf_serverurl: file: /etc/docker/secrets/conf_serverurl
Note: Make sure to set proper permissions on the secret files on the Docker host. The container runs as a non-root user (typically GID 1000), so secrets must be readable by that group. To find the actual GID, check the container logs if there's a permission error - it will show the required GID. Alternatively, you can check with:
# Find the container's GID (replace 'reporting' with your container name) docker exec reporting id -g
Then set the permissions accordingly (replace 1000 with the actual GID if different):
CONTAINER_GID=1000 # Use the GID from the command above if different mkdir -p /etc/docker/secrets chmod 750 /etc/docker/secrets chgrp $CONTAINER_GID /etc/docker/secrets echo "your-license-key-here" | tee /etc/docker/secrets/conf_licensekey echo "https://hostname.company.com:9443/" | tee /etc/docker/secrets/conf_serverurl chmod 640 /etc/docker/secrets/conf_licensekey chmod 640 /etc/docker/secrets/conf_serverurl chgrp $CONTAINER_GID /etc/docker/secrets/conf_licensekey chgrp $CONTAINER_GID /etc/docker/secrets/conf_serverurl
Note: When using Docker Swarm secrets (not file-based secrets), Docker automatically handles permissions. However, if you're using file-based secrets in docker-compose, you need to set the permissions manually as shown above.
Advanced Use Case
If there are more specific requirements, such as a pre-filled user database, a custom container should be created
Example: internal access with public account
Using the following compose example, you can create a server that is started without any permission restrictions and can be used without further authentication using the public URL context.
version: '2.1' services: reporting: image: 'inetsoftware/i-net-clear-reports:latest' restart: 'always' ports: # Not setting a host port allows to use --scale, but the external port varies - 9000:9000 environment: # Using the User Default configuration - DEFAULT_CONFIG=User/Default # Set the license key (un-comment and insert the full license key) #- CONF_licensekey=... # Run the application on a pre-determined port for easier mapping - CONF_listener__port=9000 # Only guest account is active. Activate webapi. - CONF_authentication__settings=[{"provider":"guest"}] - CONF_plugins__activated={"webapi.core":true}
Example: add PAM authentication and a default user
The following Dockerfile will create a user admin with the password password in a new container.
FROM inetsoftware/i-net-clear-reports
# Switch to root user for installation
USER root
# Tools
RUN apk add --update linux-pam
# grant pam permissions to everybody
# Create User that we can log in with
RUN chmod +r /etc/shadow \
&& adduser -D -g "User" admin \
&& echo admin:password | chpasswd \
&& ln -s "/etc/pam.d/base-password" "/etc/pam.d/reporting"
# Switch back to product user
USER reporting
Mounting / Re-using a given configuration
Environment Properties Matrix
MongoDB Persistence
Docker Compose Example
To bundle a docker container with a MongoDB persistence using Docker Compose, the following docker-compose.yml script can be used as a starting point:
version: '2.1' services: reporting: image: 'inetsoftware/i-net-clear-reports:latest' restart: 'always' ports: # Not setting a host port allows to use --scale, but the external port varies - 9000:9000 environment: # Using the System/Default config is mandatory in cloud persistence environments - DEFAULT_CONFIG=System/Default # Set the externally visible server url (un-comment and insert the correct url) #- CONF_serverURL=https://hostname.company.com:9443/ # Set the license key (un-comment and insert the full license key) #- CONF_licensekey=... # Run the application on a pre-determined port for easier mapping - CONF_listener__port=9000 # Do not force the application to overwrite a previously imported configuration # or other instances using the same MongoDB will have their configuration modified - FORCE_IMPORT_CONFIG=0 # Set up the connection the MongoDB persistence - inet_persistence=mongodb://root:example@mongo:27017/reporting mongo: image: mongo environment: MONGO_INITDB_ROOT_PASSWORD: example MONGO_INITDB_ROOT_USERNAME: root restart: always
Note: The parameter FORCE_IMPORT_CONFIG should be set to 0 so that the configuration is imported only once versus every time the container is started. This way the configuration may be persisted and re-used on subsequent restarts or in a scaled environment.
Note: Depending on the specific environment there may be some more options that have to be set. Please have a look at the Environment Properties Matrix.
To bundle a docker container with a MongoDB persistence using Docker Compose, the following docker-compose.yml script can be used as a starting point:
version: '2.1' services: reporting: image: 'inetsoftware/i-net-clear-reports:latest' restart: 'always' ports: # Not setting a host port allows to use --scale, but the external port varies - 9000:9000 # Root user is required for other persistences than file user: "root" environment: # Using the System/Default config is mandatory in cloud persistence environments - DEFAULT_CONFIG=System/Default # Run the application on a pre-determined port for easier mapping - CONF_listener__port=9000 # Do not force the application to overwrite a previously imported configuration # or other instances using the same MongoDB will have their configuration modified - FORCE_IMPORT_CONFIG=0 # Set up the connection the MongoDB persistence - inet_persistence=mongodb://root:example@mongo:27017/reporting mongo: image: mongo environment: MONGO_INITDB_ROOT_PASSWORD: example MONGO_INITDB_ROOT_USERNAME: root restart: always
Note: The parameter FORCE_IMPORT_CONFIG should be set to 0 so that the configuration is imported only once versus every time the container is started. This way the configuration may be persisted and re-used on subsequent restarts or in a scaled environment.
Note: Depending on the specific environment, there may be some more options that have to be set. Please look at the Environment Properties Matrix.
Euro-Office with Docker
Last updated: July 2026
This page describes the recommended setup path for the Euro-Office integration: a Euro-Office document server running with Docker and connected to i-net HelpDesk.
A compatible ONLYOFFICE server can also be used, but in this documentation it is the compatibility and fallback path, not the primary reference setup.
Recommended Standard Path
For new installations, this setup is recommended:
-
HelpDesk runs in a container.
-
The Euro-Office document server runs in a separate container.
-
Both containers are part of the same Docker network.
-
The browser accesses the editor through the public document server URL.
-
Server-to-server communication uses internal container addresses.
Full Stack with HelpDesk
The following Docker Compose example starts HelpDesk, MariaDB, and the Euro-Office document server together on a shared network:
services: helpdesk: image: your-helpdesk-image:latest container_name: helpdesk restart: always ports: - "9000:9000" environment: - CONF_eurooffice__documentserver__url=https://documentserver.example.com - CONF_eurooffice__documentserver__internal_url=http://documentserver - CONF_eurooffice__helpdesk__internal_url=http://helpdesk:9000 - CONF_eurooffice__documentserver__jwt_secret=your-shared-jwt-secret - CONF_eurooffice__session_secret=your-session-signing-secret depends_on: - mariadb - documentserver mariadb: image: mariadb:10.11 container_name: helpdesk-mariadb restart: always environment: - MARIADB_ROOT_PASSWORD=root-password - MARIADB_DATABASE=helpdesk volumes: - mariadb_data:/var/lib/mysql documentserver: image: ghcr.io/euro-office/documentserver:latest container_name: documentserver restart: always environment: - JWT_ENABLED=true - JWT_SECRET=your-shared-jwt-secret - JWT_HEADER=Authorization - ALLOW_PRIVATE_IP_ADDRESS=true - ALLOW_META_IP_ADDRESS=false - PLUGINS_ENABLED=false volumes: - documentserver_data:/var/www/onlyoffice/Data - documentserver_logs:/var/log/onlyoffice volumes: mariadb_data: documentserver_data: documentserver_logs:
Standalone Document Server
If you already have a HelpDesk installation and only want to add the document server, use this minimal setup:
services: documentserver: image: ghcr.io/euro-office/documentserver:latest container_name: documentserver restart: always ports: - "8080:80" environment: - JWT_ENABLED=true - JWT_SECRET=your-shared-jwt-secret - JWT_HEADER=Authorization - ALLOW_PRIVATE_IP_ADDRESS=true - ALLOW_META_IP_ADDRESS=false - PLUGINS_ENABLED=false volumes: - documentserver_data:/var/www/onlyoffice/Data - documentserver_logs:/var/log/onlyoffice volumes: documentserver_data: documentserver_logs:
Start the container:
docker compose up -d
The document server needs some time to start the first time. Check the health endpoint:
curl http://localhost:8080/healthcheck
The response should be true once the server is ready.
HelpDesk Configuration
For the recommended Docker standard path, these values are typically relevant in HelpDesk:
-
Document server URL: public document server URL for browser access, e.g.
https://documentserver.example.com -
Document server JWT secret: shared JWT secret
-
Session signing secret: dedicated HelpDesk secret for session tokens
-
Internal document server URL: in the Docker standard case
http://documentserver -
Internal HelpDesk URL: in the Docker standard case
http://helpdesk:9000
More details about the fields are available on the Configuration page.
HelpDesk Environment Variables
To configure the Euro-Office plugin in the HelpDesk container, use environment variables with the CONF_eurooffice__ prefix.
| Variable | Description | Example |
|---|---|---|
CONF_eurooffice__documentserver__url |
Public document server URL for browser access | https://documentserver.example.com |
CONF_eurooffice__documentserver__internal_url |
Internal URL for server-side downloads from HelpDesk to the document server | http://documentserver |
CONF_eurooffice__helpdesk__internal_url |
Internal URL for downloads and callbacks from the document server back to HelpDesk | http://helpdesk:9000 |
CONF_eurooffice__documentserver__jwt_secret |
Shared JWT secret | (shared secret) |
CONF_eurooffice__session_secret |
Secret for signing HelpDesk session tokens | (fixed secret) |
Document Server Environment Variables
| Variable | Description | Default |
|---|---|---|
JWT_ENABLED |
Enable JWT authentication for callbacks and editor configurations | false |
JWT_SECRET |
Shared secret for JWT token signing | (empty, JWT disabled) |
JWT_HEADER |
HTTP header used for JWT transmission in callbacks | Authorization |
ALLOW_PRIVATE_IP_ADDRESS |
Allow requests to private IP addresses | true |
ALLOW_META_IP_ADDRESS |
Allow META IP address access | false |
PLUGINS_ENABLED |
Enable document server plugins | false |
SECURE_LINK_SECRET |
Secret for secure document links | (empty, disabled) |
URL_EXTENSION |
URL extension pattern for incoming requests | / |
TZ |
Container timezone | system default |
Networking and Reachability
The document server must be reachable cleanly from three directions:
-
Browser to document server: The browser loads the editor, JavaScript, CSS, and WebSocket connections through the public document server URL.
-
Document server to HelpDesk: The document server sends callbacks and downloads document content from HelpDesk.
-
HelpDesk to document server: During callback processing, HelpDesk downloads the edited file from the document server.
In the Docker standard case, this typically results in:
Browser Docker Docker
GET editor JS/API ────> documentserver:80
GET /office-editor ────> helpdesk:9000
HelpDesk (internal) ───> documentserver:80 (server-side file downloads)
DocumentServer ───> helpdesk:9000 (callbacks, content downloads)
If the document server runs on a different host or network, replace the internal Docker service names with real host names or IP addresses.
Example:
CONF_eurooffice__documentserver__internal_url=http://192.168.1.100 CONF_eurooffice__helpdesk__internal_url=http://192.168.1.200:9000
When HelpDesk runs natively on the same host as the Docker document server, http://host.docker.internal:9000 can be used as the internal HelpDesk URL. This allows the document server to call back to a non-containerized HelpDesk.
JWT Authentication
JWT authentication protects the communication between HelpDesk and the document server:
-
Editor configuration: HelpDesk signs the editor configuration with the shared JWT secret.
-
Callbacks: The document server sends a signed JWT token with save notifications to HelpDesk.
-
Algorithm: HS256 (HMAC with SHA-256)
-
Verification: The signature is checked server-side.
For production environments, JWT should be enabled.
Compatible ONLYOFFICE Server
If you want to use a compatible ONLYOFFICE server instead of Euro-Office, you can use the same overall setup. The main difference is the Docker image.
Replace this in the Compose example:
image: ghcr.io/euro-office/documentserver:latest
with:
image: onlyoffice/documentserver:latest
For further ONLYOFFICE-specific notes, see ONLYOFFICE on Windows.
