Zequent Client SDK — Configuration

This page describes the public configuration model for external developers and customer deployments.

Zequent platform services are run from published container images. Customer applications use the Client SDKs and connect to the service endpoints exposed by the deployment.

Container Configuration

The public customer Compose template is docker-compose.customer.yml. It references one deployment-local .env file — start from .env.customer.example (cp .env.customer.example .env, then fill in every <PLACEHOLDER>; a runnable copy of the compose file, and an actual .env.customer rather than the .example template, also lives at the same paths under core/ for working directly in the monorepo).

services:
  connector-service:
    image: ghcr.io/zequent/connector-service:2.0.0
    env_file:
      - .env

Use the same env_file: .env pattern for Zequent service images, Admin Console images, adapter images, and customer application containers.

Do not commit .env files. Store credentials and deployment-specific values in your deployment environment or secret manager.

Start the public template with:

docker compose -f docker-compose.customer.yml up -d

Optional adapter images are enabled through Compose profiles, for example:

docker compose -f docker-compose.customer.yml --profile edge-dji up -d

Platform Service Images

ComponentImageDefault port
Connector Serviceghcr.io/zequent/connector-service:2.0.08010
Remote Control Serviceghcr.io/zequent/remote-control-service:2.0.08002
Live Data Serviceghcr.io/zequent/live-data-service:2.0.08003
Mission Autonomy Serviceghcr.io/zequent/mission-autonomy-service:2.0.08004
Admin Console APIghcr.io/zequent/admin-console-service:2.0.08005
Admin Console UIghcr.io/zequent/zqnt-platform-console:v2.0.03001

Use versioned image tags for production deployments (as above — not :latest). The Admin Console UI's tags carry a v prefix (v2.0.0), unlike the core service images (2.0.0).

Adapter Images

AdapterImageStatus
DJIghcr.io/zequent/zqnt-edge-adapter-dji:2.0.0Available
MAVLinkghcr.io/zequent/zqnt-adapter-mavlink:2.0.0Available
Sapientghcr.io/zequent/zqnt-adapter-sapient:2.0.0Available
RNSghcr.io/zequent/zqnt-adapter-rns:2.0.0Available
Betaflightghcr.io/zequent/zqnt-adapter-betaflight:2.0.0Available
AI Adapterghcr.io/zequent/zqnt-adapter-ai:2.0.0Available

Required .env Variables (Platform Deployment)

These go in the deployment-local .env file used by docker-compose.customer.yml — not in your customer application's own .env.

Database and cache

VariableExampleNotes
DATABASE_URLjdbc:postgresql://postgres:5432/zequent_dbJDBC URL, used by Hibernate
DATABASE_REACTIVE_URLpostgresql://postgres:5432/zequent_dbReactive driver URL (no jdbc: prefix)
DATABASE_USERpostgres
DATABASE_PASSWORD—Set your own; do not use the Postgres default in production
REDIS_URLredis://redis:6379

Licensing

Every platform service verifies a license lease before performing protected operations — see Licensing.

VariableApplies toNotes
LICENSING_INSTALLATION_IDAll servicesThis installation's own id. Generate it once (e.g. uuidgen) and never change it: every organization's license activation is bound to it. The Helm chart generates and keeps it for you
LICENSING_MANUAL_REFRESH_INTERVALAdmin Console onlyOptional. How often one organization may refresh its license by hand (default 30s)
LICENSE_SERVER_URLAdmin Console onlyDefaults to https://api.zequent.com; override only for a self-hosted/offline license server
EXPORT_PLATFORM_KEKAdmin Console only32 random bytes, base64 (openssl rand -base64 32). Seals every organization's license activation before it is stored; without it activations are lost on restart
LICENSING_LICENSE_KEYAdmin Console onlyOptional. Only a bootstrap for the default organization; leave unset and license organizations in the console

These are configured once per installation. Organizations are licensed afterwards, from the Admin Console, with no restart — see Licensing.

LICENSING_PUBLIC_KEY and LICENSING_SIGNING_KEY_ID are not needed: the services trust only the Zequent license hub's key compiled into them, and ignore these 1.3 variables (with a warning).

Authentication

Every bearer token this deployment issues is signed with an Ed25519 keypair you generate yourself — never reuse a value from any example or dev environment:

openssl genpkey -algorithm ed25519 -out auth-private.pem
openssl pkey -in auth-private.pem -pubout -out auth-public.pem
# base64 the PKCS8/SubjectPublicKeyInfo DER (or PEM, stripped of headers/newlines)
# into the two variables below
VariableNotes
AUTH_PRIVATE_KEYBase64 PKCS8-encoded Ed25519 private key
AUTH_PUBLIC_KEYBase64 SubjectPublicKeyInfo-encoded Ed25519 public key
AUTH_ISSUERToken issuer — typically <your-company>-admin-console
AUTH_EXPECTED_ISSUERMust match AUTH_ISSUER
AUTH_SYSTEM_ADMIN_EMAILEmail for the initial system admin account
OIDC_REDIRECT_URIOnly needed if an organization connects its own SSO/OIDC identity provider

Service identity

Every call between the platform services carries a short-lived service token. It is signed with a second Ed25519 key pair, separate from AUTH_*, one per installation. A 2.0 service refuses to start without it, and refuses a key committed to Zequent's repositories.

VariableApplies toNotes
SERVICE_AUTH_PRIVATE_KEYAll five platform servicesEd25519 private key (PKCS8 DER, base64, or PEM). openssl genpkey -algorithm ed25519 -out service.pem, then openssl pkey -in service.pem -outform DER | base64 -w0. Never give it to an adapter
SERVICE_AUTH_PUBLIC_KEYAll five platform servicesThe matching public key (openssl pkey -in service.pem -pubout -outform DER | base64 -w0). Adapters get it as ZQNT_PLATFORM_PUBLIC_KEY
SERVICE_AUTH_TOKEN_TTLAll five platform servicesOptional, ISO-8601 lifetime of the service tokens (default PT5M)

Live video

VariableApplies toNotes
LIVE_STREAM_AUTH_HOOK_SECRETAdmin Console onlyShared secret the media server presents to the stream-auth hook (MediaMTX: ?secret=<value> on its authHTTPAddress). Unset, the hook answers anyone. URL-safe, e.g. openssl rand -hex 32
LIVE_STREAM_KEYS_PEPPERAdmin Console onlyOptional pepper for operator-issued stream keys. Set once: changing or removing it invalidates every key issued under it

Client SDK Service Endpoints

Customer applications need the platform service hostnames and ports.

When the customer application runs inside the same Compose or Kubernetes network, use the service names:

VariableTypical value
REMOTE_CONTROL_SERVICE_HOSTremote-control-service
REMOTE_CONTROL_SERVICE_PORT8002
LIVE_DATA_SERVICE_HOSTlive-data-service
LIVE_DATA_SERVICE_PORT8003
MISSION_AUTONOMY_SERVICE_HOSTmission-autonomy-service
MISSION_AUTONOMY_SERVICE_PORT8004
CONNECTOR_SERVICE_HOSTconnector-service
CONNECTOR_SERVICE_PORT8010

When the customer application runs on the host and connects to exposed local ports, use localhost for the host values.

Client credential (ZQNT_CLIENT_TOKEN)

The platform refuses every gRPC call that carries no credential. An organization administrator issues a client credential in the Admin Console under Manage → Access & Integrations → Credentials (kind Client application); the token is shown once. Every client SDK sends it as authorization: Bearer <token>:

SDKHow to pass it
JavaZequentClient.builder().clientToken(token), zequent.client-token (Quarkus), or ZQNT_CLIENT_TOKEN
PythonZequentClient(..., client_token=token) or ZQNT_CLIENT_TOKEN (also for from_env())
Gogrpc.NewClient(target, append(auth.DialOptions(token), ...)...); "" reads ZQNT_CLIENT_TOKEN
client-sapientZQNT_CLIENT_TOKEN

A client credential belongs to exactly one organization and reaches only that organization's assets, Applications and runs: asset lookups and payloads, the Skill list, Applications and executions, telemetry/detection/notification subscriptions (a * subscription carries only the organization's assets) and asset commands. Users, organizations, identity providers, licenses, triggers, schedules, policies, technical configuration and asset registration are never reachable with it. UNAUTHENTICATED means no, an expired or a revoked credential; PERMISSION_DENIED means the call is outside that scope. Revoking it in the console takes effect on every service within seconds.

Admin Console

The Admin Console has two images:

ComponentImageDefault local URL
Admin Console APIghcr.io/zequent/admin-console-service:2.0.0http://localhost:8005
Admin Console UIghcr.io/zequent/zqnt-platform-console:v2.0.0http://localhost:3001

The Admin Console UI needs public API and WebSocket URLs that are reachable from the user's browser.

VariablePurpose
BACKEND_ORIGINBackend origin the UI container's own server-side proxy uses inside the deployment network. Silently defaults to http://localhost:8005 if unset, which inside that container resolves to the UI container itself, not the Admin Console API — producing a UI that loads but has no working backend connection
LICENSE_API_ORIGINThe UI container's server-side proxy target for license operations. Defaults to http://localhost:4000 if unset — a local mock this repo doesn't run — so set it to https://api.zequent.com (or your self-hosted license server) explicitly
ADMIN_CONSOLE_CORS_ORIGINSThe public dashboard origin(s) the Admin Console API accepts requests from
NEXT_PUBLIC_BACKEND_ORIGINPublic Admin Console API URL, general-purpose
NEXT_PUBLIC_BACKEND_AUTH_API_HOSTPublic Admin Console API URL
NEXT_PUBLIC_BACKEND_OPERATION_API_HOSTPublic operation API URL
NEXT_PUBLIC_BACKEND_SCHEDULER_API_HOSTPublic scheduler API URL
NEXT_PUBLIC_BACKEND_ASSET_API_HOSTPublic asset API URL
NEXT_PUBLIC_BACKEND_ORGANIZATION_API_HOSTPublic organization API URL
NEXT_PUBLIC_BACKEND_ASSET_WS_HOSTPublic asset WebSocket URL
NEXT_PUBLIC_BACKEND_DRC_WS_HOSTPublic direct remote control WebSocket URL
NEXT_PUBLIC_BACKEND_NOTIFICATION_WS_HOSTPublic notification WebSocket URL

For a local Compose deployment, these URLs normally point to localhost:8005.

Edge Adapter Configuration

Ready-made adapter images and custom Edge SDK adapters need a reachable adapter endpoint plus any device-specific credentials.

VariablePurpose
EDGE_ADAPTER_TARGET_ENDPOINTSHost and port where the platform can reach the adapter
ZQNT_EDGE_TOKENThe adapter's edge credential. A 2.0 platform refuses its calls without one. Issued in the Admin Console (Access & Integrations → Credentials, kind Edge adapter) or offline with core/scripts/mint-edge-credential.py from SERVICE_AUTH_PRIVATE_KEY; the Integration Hub needs one of kind Integration Hub
ZQNT_PLATFORM_PUBLIC_KEYThe platform's SERVICE_AUTH_PUBLIC_KEY. The adapter refuses every command not signed with it
ZQNT_EDGE_AUTH_DISABLEDtrue accepts unsigned commands. Local test stacks only, never a deployment
Device/broker credentialsCredentials required by the selected adapter integration
Storage credentialsOptional credentials when the adapter uploads or downloads mission files/media

The exact device-specific values depend on the selected adapter image.

Deployment Notes

  • Keep one .env per deployment environment.
  • Do not publish .env files in public documentation or source repositories.
  • Keep secrets in your orchestrator's secret mechanism for production.
  • Use service names for container-to-container communication.
  • Use public hostnames or exposed local ports for browser-facing URLs.
  • Use the Client SDK for customer applications.
  • Use the Edge SDK when you need to build a custom adapter.

Was this page helpful?