Skip to main content
CID222 Docs

Install and activation problems

The failures that happen between booting the installer and a licensed appliance serving traffic, with the runbook for each.

  • Version: 0.4
  • Role: admin_user
  • Type: troubleshooting

Everything between booting the installer and a licensed appliance serving traffic. Find the symptom in the table, then work the runbook under it.

Nothing about the product is collected until the product runs, so anything that fails during provisioning is diagnosed from the installer's own console messages and its log at /var/log/cid-firstboot.log. From first boot onwards, start with the diagnostic snapshot instead.

Find your symptom

What you seePhaseRunbook
The run stops with a red failure line naming the registry, at step 6/8InstallProvisioning stops at 6/8
The machine has no address, or only a link-local oneInstallNo DHCP on this network
The installer stops before downloading anything, quoting memory or free diskInstallThe resource check fails
Name resolution works and nothing gets outInstallThe appliance cannot get out
The install finished and the browser shows a blank page or refuses the connectionFirst bootThe dashboard does not load
The wizard's connectivity step returns a server errorFirst bootThe connectivity step returns 500
The wizard completes and the appliance asks for setup againFirst bootThe wizard loops
Settings you save disappear after a restartFirst bootSaved state does not stick
The wizard's provider step shows an empty listFirst bootThe providers step is empty
A licence upload is rejected as a bad signatureLicensingLicense upload fails with 400
The appliance can only ever run the trialLicensingNo licence trust anchor
Every product route answers 402 as soon as setup finishesLicensing402 right after setup
The licence was working and now the product is lockedLicensingThe licence has expired
Nothing answers on 443TLSNothing is listening on 443
The browser reports an expired certificateTLSThe certificate is expiring
The update page shows an obviously wrong versionUpdatesThe version is unknown
The update check finds nothing, or failsUpdatesThe channel is unreachable
Dates are wrong: a valid licence looks expired, a valid certificate looks invalidAnyThe clock is not synchronised

Install

Provisioning stops at 6/8 container images

The install is not broken: the machine has no working path to the registry. Read the indented line above the failure — it is the pull tool's own message, and it is what separates a blocked port from a broken resolver, a stale credential and an inspected TLS connection.

Runbook install-provisioning-stops-at-images is not in this bundle. Run npm run docs:sync to pull the current corpus.

This network has no DHCP

The default boot entry is unattended and expects an address to be offered. A segment that offers none needs the boot entry that asks for the address before touching the disk, or a static address set from the appliance console.

Runbookinstall

This network has no DHCP, and the appliance comes up with no address

You might see: no IPv4 network (no default route) · the VM summary shows only an fe80:: address · the appliance has no IP address after the install · this network has no DHCP

Before you start

Checks

  1. 1

    Check which boot menu entry this appliance was installed from

    expected · The install was started, or will be started, from the "set the network by hand — no DHCP" entry.

  2. 2

    Check whether a static address was set from the appliance console instead

    expected · An IPv4 address, gateway and name servers are set, and a default route exists.

  3. 3

    Verify the name servers you configured actually answer

    expected · Both queries answer. A configured resolver that times out is worse than none, because the failure looks like a network outage.

The resource check fails

The installer measures memory and free disk before it downloads anything, because an undersized machine otherwise fails an hour later as containers that will not stay up. Its own thresholds predate the current supported minimum, so a run that only warned can still be undersized.

Runbookinstall

The installer stops on memory or free disk before anything downloads

You might see: this machine has 4096 MB of RAM — the appliance cannot run below 6 GB · only 12 GB free on / — the release images need about 40 GB · memory is 8192 MB; 16 GB is the designed size · the installer stopped at 0/8 this machine

Before you start

Checks

  1. 1

    Read the memory the installer measured on this machine

    expected · The reported memory is at least 32 GB, the supported minimum for the full stack.

  2. 2

    Read the free disk the installer measured on the root filesystem

    expected · At least 100 GB free, the supported minimum. The installer refuses below 20 GB and warns below 45 GB.

  3. 3

    Check whether the kernel stopped the previous attempt

    expected · No line reports "KILLED BY THE KERNEL".

The appliance cannot get out

Name resolution, a TCP connection on 443, and an authenticated request through the site proxy fail independently. Each of them passes routinely while the install still fails, which is why "this network has full internet access" is usually said in good faith and is usually about a different path.

Runbookinstall

The appliance cannot get out — one or more egress tests failed

You might see: egress tests failed · the appliance cannot reach the registry · ETIMEDOUT after 5000ms · proxy returned 407 Proxy Authentication Required

Before you start

Checks

  1. 1

    Verify the appliance actually ran its outbound probes

    diagnostics · appliance.egress

  2. 2

    Read the name-resolution results for the hosts this appliance must reach

    diagnostics · appliance.dns

  3. 3

    Read whether an outbound proxy is configured on the appliance

    diagnostics · appliance.proxy.configured = true

  4. 4

    Read whether the release channel answered on the last attempt

    diagnostics · appliance.update.channelReachable = true

  5. 5

    Check whether a TLS-inspection device is presenting its own certificate to the appliance

    expected · The issuer is a public certificate authority, not your organisation's inspection CA.

First boot

The dashboard does not load

An appliance installed from the ISO serves HTTPS only, and the front end refuses to start with a certificate it cannot use rather than serving a broken one — so a blank page, a refused connection and a brief upstream error have three different causes and one page.

Runbookfirst-boot

The install finished but the dashboard does not load

You might see: the browser shows a blank white page · https://<ip>/ refuses the connection · HTTPS sidecar FAILED · 3 of 16 containers are running; these are not:

Before you start

Checks

  1. 1

    Read the console's own count of running containers

    expected · Every container is running, and no line reports "N of M containers are running".

  2. 2

    Verify something holds port 443 on the appliance host

    diagnostics · appliance.tls.servedBy

  3. 3

    Verify the gateway itself is reachable

    diagnostics · services[nestjs-core].reachable = true

  4. 4

    Verify the gateway container is not restarting repeatedly

    diagnostics · containers[nestjs-core].restarts = 3

The connectivity step returns 500

Almost always a permissions problem on the appliance's state directory rather than a network problem. The connectivity probe itself may well have succeeded before the write failed.

Runbookfirst-boot

The setup wizard's connectivity step returns 500

You might see: POST /setup/connectivity → 500 · setup wizard connectivity test fails with a server error · Internal server error on the network step of the wizard · wizard will not advance past connectivity

Before you start

Checks

  1. 1

    Verify the gateway container is running and is not restarting repeatedly

    diagnostics · containers[nestjs-core].restarts = 3

  2. 2

    Verify the gateway can write its state directory, where the wizard persists each step

    expected · The command exits 0 and prints nothing. A permission-denied error confirms this cause.

  3. 3

    Verify the hostnames the connectivity step probes actually resolve

    diagnostics · appliance.dns

  4. 4

    Read the outbound connectivity probe results

    diagnostics · appliance.egress

The wizard finishes and asks for setup again

The wizard's completion is written to a file, and that write is wrapped in a handler that logs and continues. An unwritable directory therefore produces a wizard that completes, unlocks the product, and locks it again at the next restart.

Runbookfirst-boot

The setup wizard finishes and the appliance asks for setup again

You might see: 423 SETUP_REQUIRED · Appliance setup is not complete. Finish first-boot setup to use the product. · the wizard completes and the dashboard sends me back to it · every page returns 423 after setup

Before you start

Checks

  1. 1

    Read whether the gateway considers setup complete

    diagnostics · appliance.setupComplete = true

  2. 2

    Verify the gateway can write the state directory the wizard persists into

    expected · The command exits 0 and prints nothing.

  3. 3

    Verify the gateway is not restarting between wizard steps

    diagnostics · containers[nestjs-core].restarts = 3

Saved state does not stick

The same root cause, seen from the other direction: the setup state, the licence, update intents and the diagnostics hand-off all live under one directory, and all four fail silently when it cannot be written.

Runbookfirst-boot

Settings the appliance saves do not survive a restart

You might see: the setup state directory is not writable · setup-state write failed · the licence I uploaded is gone after a restart · the wizard completes and comes back

Before you start

Checks

  1. 1

    Write and remove a probe file in the shared state directory as the gateway's own user

    expected · The command exits 0 and prints nothing. Permission denied or a read-only filesystem confirms this runbook.

  2. 2

    Repeat the probe in each subdirectory the product writes

    expected · All four exit 0.

  3. 3

    Check that the filesystem holding the state directory has space

    diagnostics · host.disks[/].freeGb = 2

The providers step is empty

Provider and model rows come from the database seeder, not from code. Nothing is broken; the data was never inserted.

Runbookfirst-boot

The setup wizard's providers step shows an empty list

You might see: GET /setup/providers returns an empty list · no providers to choose from in the wizard · provider dropdown is empty during setup · cannot select OpenAI or Anthropic in the wizard

Before you start

Checks

  1. 1

    Verify the gateway can reach PostgreSQL — the provider list is read from it, not hard-coded

    diagnostics · datastores.postgres.reachable = true

  2. 2

    Verify no migrations are pending, so the provider and model tables exist in their current shape

    diagnostics · datastores.postgres.migrationsPending

  3. 3

    Ask the setup API for the provider list

    GET /setup/providers

Licensing

Two failures dominate activation, and they share one root cause: an appliance that demands a licence it is structurally unable to verify.

License upload fails with 400 signature

The licence file is usually fine. The appliance has no signing public key to check it against, so every licence looks forged.

Runbooklicensing

License upload fails with 400 "rejected: signature"

You might see: 400 rejected: signature · 400 rejected: ENOENT · License upload → 400 · licence file will not upload

Before you start

Checks

  1. 1

    Verify the licence trust anchor exists on the host

    diagnostics · appliance.license.trustAnchorPresent = true

  2. 2

    Verify the appliance reports an installation id

    diagnostics · appliance.license.installationId

  3. 3

    Verify the host clock is disciplined by NTP

    diagnostics · host.timeSynced = true

  4. 4

    Read the licence state the gateway reports

    GET /admin/license/status → {"state":"active|trial"}

The appliance has no licence trust anchor

The same missing key, before anyone has tried to upload anything. With enforcement off the appliance quietly runs its trial, so the gap is often found only when the trial ends.

Runbooklicensing

This appliance has no licence trust anchor and can only run the trial

You might see: No license trust anchor (/etc/cid/license-pubkey.pem) · no licence can be verified on this box · the appliance only ever runs the built-in trial · every licence file is rejected, whichever one we upload

Before you start

Checks

  1. 1

    Read whether the licence-signing public key exists on the host

    diagnostics · appliance.license.trustAnchorPresent = true

  2. 2

    Read whether licence enforcement is switched on, which decides how bad the missing anchor is

    diagnostics · appliance.license.requireLicense = false

Every request returns 402 after setup

Licence enforcement is on and no licence resolves as valid. Administration stays reachable so the appliance can be licensed without a rescue procedure.

Runbooklicensing

Every request returns 402 LICENSE_EXPIRED after the wizard completes

You might see: 402 LICENSE_EXPIRED · chat returns 402 after finishing setup · the dashboard loads but every action fails with payment required · product blocked immediately after setup

Before you start

Checks

  1. 1

    Read whether licence enforcement is switched on for this deployment

    diagnostics · appliance.license.requireLicense = true

  2. 2

    Read the licence state the gateway resolved at boot

    diagnostics · appliance.license.state = "active|trial"

  3. 3

    Verify the licence trust anchor exists, since without it no licence can ever resolve as active

    diagnostics · appliance.license.trustAnchorPresent = true

  4. 4

    Check how long the installed licence has left

    diagnostics · appliance.license.expiresAt

The licence has expired

An appliance that worked and now blocks its product routes. Check the clock before requesting a renewal: a skewed clock ages a valid licence out early and produces exactly this state.

Runbooklicensing

The licence has expired and licensed endpoints answer 402

You might see: License expired / product locked · 402 LICENSE_EXPIRED · License state is "expired" · the trial ran out

Before you start

Checks

  1. 1

    Read the licence state the gateway resolved

    diagnostics · appliance.license.state = "active|trial"

  2. 2

    Verify the host clock is disciplined, because a skewed clock ages a valid licence out early

    diagnostics · host.timeSynced = true

  3. 3

    Verify the trust anchor exists, since without it no renewal can ever verify either

    diagnostics · appliance.license.trustAnchorPresent = true

  4. 4

    Read the licence status the API reports

    GET /admin/license/status → {"state":"active|trial"}

TLS

Nothing is listening on 443

A refused connection is not a certificate error, and the two share a cause more often than you would expect: the front end refuses to start with an unusable certificate rather than serving a broken one.

Runbooktls

Nothing is listening on 443

You might see: Nothing is listening on 443 · connection refused on 443 · https://<ip>/ refuses the connection · the dashboard cannot be reached over HTTPS

Before you start

Checks

  1. 1

    Read what holds port 443 on the appliance host

    diagnostics · appliance.tls.servedBy

  2. 2

    Verify the appliance has a certificate to serve at all

    diagnostics · appliance.tls.mode = "none"

  3. 3

    Verify the dashboard container the listener proxies to is running

    diagnostics · containers[frontend].state = "running"

The certificate is expiring or has expired

Browsers refuse an expired certificate outright, and the clients configured to trust this appliance fail closed rather than degrading — so enforcement stops at the same moment the dashboard becomes unreachable.

Runbooktls

The appliance HTTPS certificate is expiring or has expired

You might see: The appliance HTTPS certificate expires in 6 day(s) · ERR_CERT_DATE_INVALID · certificate expired · your connection is not private

Before you start

Checks

  1. 1

    Read how many days the served certificate has left

    diagnostics · appliance.tls.daysLeft = 0

  2. 2

    Check whether the certificate has entered the renewal window — 30 days, the `CID_TLS_RENEW_DAYS` default in `appliance/tls/ensure-tls.sh`

    diagnostics · appliance.tls.daysLeft = 30

  3. 3

    Read which kind of certificate the appliance serves, because the renewal path differs

    diagnostics · appliance.tls.mode = "unknown"

Updates

The appliance cannot say which release it runs

The version comes from files the image build and the updater write. When none can be read, the version falls back to a placeholder and every comparison against the channel is meaningless.

Runbookupdates

The appliance cannot say which release it is running

You might see: This box cannot say which release it is running · System Updates shows version 0.0.0 · current version 0.1.0 on a box that is not 0.1.0 · the update page offers nothing and shows no version

Before you start

Checks

  1. 1

    Read the product version the appliance reports

    diagnostics · appliance.version = "0.1.0"

  2. 2

    Read the host-repair status, which is what rewrites the version stamp

    GET /admin/system-update/host-repair

The update channel is unreachable

Expected and harmless on a deliberately air-gapped appliance, which updates from a signed offline bundle. On a connected one it is an egress problem wearing an update-shaped mask.

Runbookupdates

The update channel is not reachable from the appliance

You might see: The update channel host is not reachable from inside the gateway · Check for updates does nothing · update check returns 500 · the appliance never finds a new version

Before you start

Checks

  1. 1

    Verify an update channel is configured at all

    diagnostics · appliance.channel

  2. 2

    Read whether the channel answered on the last attempt

    diagnostics · appliance.update.channelReachable = true

  3. 3

    Read the name-resolution results for the hosts the appliance must reach

    diagnostics · appliance.dns

  4. 4

    Read whether an outbound proxy is configured, on a network that requires one

    diagnostics · appliance.proxy.configured = true

Any phase

The host clock is not synchronised

Licence expiry, certificate validity, token lifetimes and every detection timestamp are decided by this clock. A drifting one produces three failures that each look like something else.

Runbookinstall

The host clock is not synchronised

You might see: The host clock is not synchronised · clock is not synchronised — if the registry login fails on a certificate error, this is why · a valid licence is reported as expired · tokens are rejected as expired immediately after sign-in

Before you start

Checks

  1. 1

    Read whether the host clock is disciplined by a time service

    diagnostics · host.timeSynced = true

  2. 2

    Verify the appliance can reach a time source at all

    expected · The status reports the clock as synchronised, or names a server the network permits.

  3. 3

    Check whether the skew has already aged the licence out

    diagnostics · appliance.license.state = "active|trial"

If none of these match

  • Read the diagnostic snapshot end to end; its findings section names a runbook for every rule that fired.
  • Check the health matrix — a service that answers and reports itself unhealthy usually means a model that did not load.
  • Collect the support bundle and escalate, with the installation id and the appliance version.

Last updated on