Skip to content

Checking your license

Your deployment checks in with the license server on a schedule and caches the signed verdict. You can run that check-in by hand and read the cached result from the terminal.

Terminal window
docker compose exec web python manage.py license_checkin
Output Meaning
Licensing enforcement disabled (no LICENSE_SERVER_URL); skipping. No license server is configured. Every installed module is entitled and nothing is checked.
License check-in ok. The server’s signed verdict was verified and cached.
License check-in failed (see logs). The server was unreachable or the verdict failed verification. Read the licensing log lines in docker compose logs web.

This never touches the network. It prints what the last verified check-in stored, plus the enforcement mode derived from it.

Terminal window
docker compose exec web python manage.py shell -c "
from apps.platform.licensing.services.license_service import LicenseService, enforcement_enabled
service = LicenseService()
state = service.current_state()
print('enforcement_enabled:', enforcement_enabled())
print('status :', state.status)
print('edition :', state.edition)
print('entitlements :', state.entitlements)
print('seat_caps :', state.seat_caps)
print('expires_at :', state.expires_at)
print('grace_days :', state.grace_days)
print('checked_ok_at :', state.checked_ok_at)
print('last_checked_at :', state.last_checked_at)
print('last_message :', state.last_message)
print('enforcement_mode :', service.enforcement_mode())
print('renew_reminder :', service.renew_reminder())
"

checked_ok_at is the last verified check-in. last_checked_at is the last attempt. Failed attempts move only the second one, so a run of failures lets the first one age toward read-only.

To check a single module, add print(service.is_entitled('blog')) to the snippet. See Entitlements for the vocabulary.

Mode When
NORMAL Verified recently and not expired, within the expiry grace period, or inside the first-install window.
READ_ONLY No verified check-in after the first-install window, no verified check-in for over 72 hours, the license is suspended, or it is past expiry plus grace.
LOCKED The license is revoked, or far past expiry plus grace.

Check these environment variables in .env, then restart with docker compose up -d web:

  • LICENSE_SERVER_URL — empty means licensing is off.
  • LICENSE_KEY — your deployment’s license key.
  • LICENSE_SERVER_PUBLIC_KEY — the PEM public key that verifies the signed verdict. A wrong key makes every check-in fail verification.

Also confirm the host can reach the server: see the status page and probe.