Skip to content

License

On-premise installations prove their calServer subscription with a license key. It is entered under Administration → Subscription & Modules and checked automatically once a day. The same key decides which optional modules run on the system.

Not to be confused with Administration → Diagnostics → Licenses

Those are the open source licenses of the bundled libraries. That is a legal notice, not a contract.


Entering the key

  1. Open Administration → Subscription & Modules.
  2. In the Subscription card, enter the key you received from calHelp and click Save.
  3. The key is checked immediately; on success the status changes to Licensed.

The key is stored encrypted and is never shown in clear text again — the card only displays the last four characters. A lost key is not recovered, it is entered again.

Nothing happens without a configured license service

If no license service is configured on the system (LICENSE_SERVER_URL, LICENSE_PUBLIC_KEY), the subscription card does not appear at all and every module counts as licensed. The whole mechanism stays inactive: installing this version takes nothing away from a running site.


Systems without internet access

If the installation cannot reach the license service — an isolated lab segment, a restrictive firewall — calHelp issues the license confirmation directly. It goes into the same field as a key; calServer recognises from the format which one it is.

The confirmation goes through exactly the same checks as a response from the license service: signature and instance ID must match. It is valid only for the installation it was issued for.

For that, calHelp needs the system's instance ID. It is shown under Administration → Subscription & Modules in the subscription card once a license service is configured. On the command line:

docker exec calserver-api-v2 php artisan license:issue

The command prints the instance ID and then stops — only calHelp can issue confirmations.

After the term ends the confirmation is renewed and pasted again; the system keeps running in the grace period meanwhile.


Optional modules

Three areas can be booked separately. They came after V1, are self-contained and need continuous maintenance — which is why they hang on the subscription rather than on the base scope:

Module What it covers
Seal Electronic sealing of reports under eIDAS (separate service).
Completion check The plausibility and specification areas before release.
Measurement history and trend History and trend per measuring point across a device's calibrations.

Which modules apply is stated in the signed confirmation from the license service. It cannot be changed on the system — not through role management and not through the SQL console either.

Release stays complete

Without Completion check, only those two areas are gone. The completeness check — customer, date, measured values, procedure — keeps running and keeps blocking. A missing module never makes an incomplete certificate releasable.

Why a function is greyed out

The Optional modules table names a reason per function. There are exactly three, and they lead to three different places:

Reason Meaning Who changes it
Not in the subscription The confirmation does not list the module. calHelp. Adding it takes effect without an update.
Not in the subscription tier This site's SUBSCRIPTION excludes the operation. The operator, under Administration → Plans.
Role missing Subscription and tier allow it, the user's role does not carry it. The operator, under Administration → Roles.

The Available to me and Reason columns refer to the signed-in user. Looking something up for someone else means checking their role, not your own.

A suspended subscription does not revoke modules

When the license reads Not licensed, only updates are blocked. Booked modules keep running. A module is withdrawn solely by the license service issuing a confirmation without it.


What the states mean

State Meaning Effect
Inactive No license service configured on this system. None.
Not checked No key entered, or no confirmation received yet. Notice for administrators. Updates remain possible.
Licensed Valid subscription. None.
Check outdated The license service was unreachable recently. Notice on this page. The license remains valid.
Grace period The subscription term has expired, the grace period is running. Warning with the remaining days. Updates remain possible.
Not licensed Subscription cancelled/suspended, or grace period expired. Warning for all users. Updates are blocked.
Read-only without license From 1 February 2027: no valid key, or subscription cancelled/suspended, or grace period expired. Warning for all users. Read-only mode and no optional modules, see below.

The running system keeps working normally in every one of these states except Read-only without license. Administration → Updates repeats the same state, but read-only: it explains why an update is blocked. The key itself is only maintained under Subscription & Modules.

In the other states only updates are blocked. A rollback to a previously installed version always stays available.

Grace period

After the subscription term ends, a grace period of 21 days by default (LICENSE_GRACE_DAYS) runs before the status changes to Not licensed. It covers exactly the cases that are not payment problems: a renewal in progress, a maintenance window, a firewall change.

A failed check attempt — license service unreachable, network error — does not change the status. It is recorded as Last error on the page, and the last confirmation received stays valid.

Read-only without license

From 1 February 2027, a system without a valid license is read-only. This applies when no key is entered, when the license service never confirmed the key, and when a subscription is cancelled or suspended or its grace period has expired. Until that day the system runs fully; administrators see a notice with the date at the top.

After that, viewing, searching, printing (including calibration certificates) and exports keep working, with no end date. Creating, changing and deleting are blocked, as are updates and the optional modules. No data is lost.

The grace period and a license service that is temporarily unreachable are not affected: as long as the subscription runs, the system keeps working without a fresh confirmation.

As soon as a valid license is entered and confirmed under Subscription & Modules, the write protection is lifted immediately, without reinstalling.


Automatic check

The scheduled license:check run checks once a day. The exact time is derived from the installation itself so that not all systems check at once.

Trigger a check manually:

docker exec calserver-api-v2 php artisan license:check --force

Without --force the command exits if the last check is still current. In the UI, Check now does the same.


Data transmitted

Each check sends exactly four values to the license service:

Field Content
license_key The stored license key
instance_id Random ID of this installation (generated once)
product_version Running calServer version
image_tag Active Docker image tag

No customer, device, calibration or usage data. The instance_id is a random UUID unrelated to customer data; it prevents a license confirmation from being copied from one system to others.


Environment variables (host .env)

Variable Meaning Default
LICENSE_SERVER_URL Base URL of the license service — (empty = disabled)
LICENSE_PUBLIC_KEY Ed25519 public key of the service (hex or Base64) — (empty = disabled)
LICENSE_GRACE_DAYS Grace period in days after the term ends 21
LICENSE_CHECK_INTERVAL_HOURS Interval between two checks 24
LICENSE_HTTP_TIMEOUT Timeout against the license service, in seconds 15

Both mandatory values must be set, otherwise the license check stays inactive. The public key is not a secret; the matching private key lives exclusively in the license service.


Troubleshooting

Status stays Not checked although a key is entered

The license service is unreachable or rejects the key. The reason is shown on the page under Last error. Check outbound HTTPS connectivity to the address in LICENSE_SERVER_URL.

Status Not licensed although the subscription is active

Trigger Check now first. If it persists, contact calHelp — the block then comes from a signed response of the license service, not from the system.

After restoring a backup onto a different server

The instance_id comes along with the backup; the confirmation stays valid. If the system is set up from scratch instead, a new instance_id is generated and the key has to be entered once more.

Key was encrypted with a different APP_KEY

After an APP_KEY change the stored key can no longer be read. Simply enter it again.