Air-Gapped Deployment
This server is built to run with the network cable conceptually cut: by default nothing phones home, no license ping carries content, and every way a byte can leave is opt-in and enumerable (the exhaustive list). An air-gapped deployment is therefore not a fight against the product but a provisioning exercise: get the models in without the internet, distribute trust without a public certificate authority, and confirm the five egress channels are closed. This is that exercise, end to end.
1Models come in on the build machine#
Models are the one thing a fresh install normally downloads, so provision them where the internet exists and ship files:
- On a connected build machine:
lmkit modelslists the catalog with download state, andlmkit pull <model-id>downloads by id into the model directory, with progress and meaningful exit codes, no running server required (The Command Line). - Ship the model directory with the image, or copy it to the target and point
LMKIT_MODELS_DIRat it. - On the target,
lmkit modelsshows every shipped model as locally available, and first run serves immediately: the catalog treats a pre-placed file exactly like one it downloaded.
Custom models imported from files follow the same logic: import on the build side, ship the state and model directories together (Backup and Upgrades covers the copy set).
2The golden image#
A repeatable air-gapped install is a normal install captured once:
- the server binary (installer or portable),
- the model directory, pre-pulled,
- the state directory seeded with reviewed
appsettings.jsonposture (section 4's checklist), keys pre-minted if fleet clients need them on first boot, LMKIT_STATE_DIRandLMKIT_MODELS_DIRpinned explicitly, so the image behaves identically wherever it lands.
lmkit doctor is the acceptance test on each provisioned machine: state-directory
writability, model presence and free disk, devices, certificate validity, service
registration, one pass, exit code you can script on.
3HTTPS without the internet#
ACME needs a public CA, so air-gapped TLS is the operator-supplied path, first-class here:
- Provide your organization's certificate for the server's name, or let the server keep its
self-managed certificate and distribute trust yourself:
lmkit cert-exportwrites the public certificate;lmkit cert-installmanages the local trust store; your fleet tooling pushes it to clients (Going Live). - Certificates live under the state directory, so the golden image can carry them, and moves keep them.
4Closing the five channels, explicitly#
Every potential egress is a setting an auditor can read back:
| Channel | Air-gap posture |
|---|---|
| Model downloads | Nothing to close: downloads happen only on demand; with models pre-placed, no pull is ever requested. The admin catalog will simply fail to fetch anything new, loudly, if asked. |
| Web-reaching tools | Server tools are OFF by default; leave the master switch off, or run tools with the egress gate in allowlist mode with an empty or intranet-only list. |
| MCP connectors | Attach none; external MCP servers are an explicit list that stays empty. |
| Telemetry export | Off by default; the admin console's own view works with no export configured. |
| SSO / OIDC | Leave both halves off, or point them at an INTERNAL identity provider, which keeps the exchange inside the perimeter. |
The confirmation that convinces auditors: a default install behind a deny-all outbound firewall serves everything local without a single blocked-connection log line, because nothing is trying to leave.
5Living air-gapped#
- Upgrades arrive the way the image did: new binary through the controlled channel, the
upgrade runbook unchanged,
lmkit doctorand/healthas the after-checks. Version facts are served locally; nothing checks for updates outbound. - New models repeat section 1: pull on the build machine, ship files. Worth planning as a periodic delivery, because model quality moves fast and an air-gapped fleet only benefits when someone carries the files in.
- Documentation travels with the server: these guides and the API reference are served BY the server itself, so the fleet's operators have the manuals inside the perimeter.
- Time still matters: JWT validation and certificate checks care about clocks; keep NTP against an internal time source.
6Stated plainly#
- Air-gapping this server is provisioning, not surgery: pre-pull models with the CLI, ship directories, pin the two path variables, and the image is reproducible.
- TLS works without ACME: bring your certificate or distribute the server's own trust with the cert verbs.
- All five egress channels are opt-in and closable in configuration; a deny-all firewall around a default install blocks nothing, because nothing calls out.
- The manuals ship inside: guides and the API reference are served locally by the server itself.