How a vLLM air-gapped deployment differs from a connected install
An air-gapped vLLM deployment is a vLLM inference server that runs with no route to the internet, with model weights, container images and Python packages carried in through an approved transfer process. Teams need one when prompts, documents or generated outputs must stay inside a boundary set by regulation, contract or internal policy, such as utility control networks, defense enclaves or clinical environments with strict egress rules. vLLM is Apache-2.0 open source with no paid edition, so the software itself has no license fee. The cost and the work sit in staging, configuration, verification and ongoing operations, which is where an isolated install differs from a connected one.
The default install assumes internet access in several places. By default vLLM downloads models from Hugging Face, so weights must be staged in a local directory or an internal model store, and the server must be pointed at that location with no remote lookup. The FastAPI /docs page also needs internet access unless the --enable-offline-docs flag is set. Cache directories rooted at VLLM_CACHE_ROOT, which defaults to ~/.cache/vllm, and the Hugging Face cache need to sit on private, controlled storage. Chat completions require a chat template, so confirm that each model ships one or supply it with --chat-template, and confirm that nothing fetches it from outside the boundary at startup.
Network exposure changes the most. The --api-key option protects the /v1, /v2, /inference and /cohere routes, but not /metrics, /health, /pause, /resume, /abort_requests or /invocations. Put a reverse proxy in front of the server that allowlists only the endpoints meant for users, and scrape metrics from a monitoring network that the proxy does not expose. For multi-node runs, the vLLM security documentation states that traffic between nodes is unauthenticated and unencrypted by default, so Ray or multiprocessing links must stay on an isolated network segment. Decide early whether the deployment is single-node or multi-node, because that choice determines how much of the inter-node path you must control.
Verification and operations carry most of the ongoing effort. Every package, image and weight file crossing the boundary should have a recorded hash, a named owner and an import record. Standards such as NERC CIP-013-2 ask for verification of vendor software integrity and authenticity, so ask your compliance lead whether that control or another framework applies to your environment. vLLM ships new minor releases about every two weeks, for example v0.31.0 on October 5, 2026, so the staging process must repeat on a cadence your team can sustain. Ask any implementation partner for a written staging procedure, acceptance tests run inside the boundary and a tested rollback plan before the first production release.
Which air-gapped settings fit each part of the vLLM stack
This table lists the vLLM settings that matter when the server runs with no internet access, from the offline API docs to the cache directories and the endpoints that stay reachable. Each row shows when the setting fits, what it leaves open, and what to confirm in the docs for the version you run. Read it as a checklist: no single row closes the boundary, and the reverse proxy allowlist is the control that limits which endpoints users can reach.
| Setting | When it fits | What it does not cover | What to confirm |
|---|---|---|---|
| --enable-offline-docs | Offline hosts where internal developers still need the FastAPI /docs page. | Covers only the interactive API documentation page, not model files or other network calls. | Confirm the flag exists in your version and that /docs loads with egress blocked. |
| Model source and Hugging Face downloads | Boundaries where approved model weights are copied in from an internal store. | Vendor defaults download from Hugging Face, so the setting alone does not stage weights or tokenizers. | Confirm the offline model loading method for your version and whether a local path is accepted. |
| Hugging Face cache mount in containers | Docker hosts where the cache is pre-populated and mounted at /root/.cache/huggingface. | A mount makes files available but does not verify that they are complete or unmodified. | Confirm the container user's home path matches the mount point in your image. |
| VLLM_CACHE_ROOT (default ~/.cache/vllm) | Hosts where vLLM cache directories must sit on a private, access-controlled volume. | Cache contents load without integrity checks, so a private path does not make untrusted copies safe. | Confirm directory permissions and that only the service account can write to the cache. |
| --api-key | Limiting direct access to the OpenAI-compatible endpoints under /v1, /v2, /inference and /cohere. | Does not protect /invocations, /pause, /resume, /abort_requests, /metrics or /health. | Confirm the current endpoint list in the security docs and test each unprotected path. |
| Reverse proxy allowlist | Any shared deployment, passing only the endpoints meant for users and blocking the rest. | Only as complete as its rule set; an omitted path stays open to every caller that reaches the server. | Confirm the allowlist against the routes your version serves and test that denied paths return errors. |
Staging model weights, container images and Python packages across the boundary
Start with the model weights, because vLLM downloads models from Hugging Face by default and an isolated host has no route to fetch them. Every model you serve has to be obtained outside the boundary, checked, and moved in through an approved transfer process, under the same change control you would apply to any other software entering the environment. Decide who may request a model, who approves it, and where the approved copy is kept. The vLLM Docker guide mounts the Hugging Face cache at /root/.cache/huggingface, so plan the staged location to match the path your serving process reads from. Confirm the exact file set with the model's publisher, including weight shards, configuration files, tokenizer files and any chat template the model needs. The chat completions endpoint requires a chat template, either built into the model or supplied with --chat-template, so check that requirement in the vLLM documentation for your version before the transfer starts.
Container images and Python packages form a second transfer stream that is easy to overlook. The vLLM server runs from a container image or a Python environment, and both resolve dependencies from public registries and package indexes unless you change where they come from. Mirror the image into an internal registry and place the wheels in an internal package index or a local wheelhouse. Record the image digest, package versions and hashes so the set that arrives inside matches the set you approved outside. Pin to a release your team has tested. vLLM ships new minor releases about every two weeks, for example v0.31.0 on October 5, 2026, so an unpinned pull can change the software between two transfers. Settle who may add packages to the approved list and whether any dependency resolution is ever allowed inside the boundary.
Verification is the control that makes the transfer defensible. NERC CIP-013-2 requires electric utilities to address, in their supply chain procurement processes, how they verify the software integrity and authenticity of vendor software and patches. If you are not an electric utility, map the same idea to the framework your auditors use. In practice, verify the publisher's checksums or signatures for each artifact, scan the container image again on the inside, and compare hashes after the artifacts cross the boundary. Treat the vLLM cache with particular care. vLLM loads cache contents without integrity checks and warns against copying cache contents from untrusted sources, so do not drop cache directories from outside into the directory set by VLLM_CACHE_ROOT. Move artifacts into their verified locations only after they pass these checks.
Turn each transfer into a record you can hand to an auditor. A transfer manifest should list every artifact with its name, version, source, hash, approver, date and destination path. Then prove the staged set works before go-live. Start vLLM on the isolated network with outbound traffic blocked, confirm that the model loads from local paths, and confirm that the chat endpoint answers. A network error at that point usually means a file is missing from the manifest. Plan the process to repeat, since releases arrive every two weeks and each new version or model may bring different files. Ask any implementation partner to write the transfer procedure, verification steps and manifest template into the agreed scope, so your team owns the process after handover.
How to set up vLLM in an air-gapped network, step by step
This sequence takes a vLLM server from a planned hardware and network layout to a verified air-gapped service. Each step names who completes it and the check that shows it is finished. The result is an internal endpoint that serves chat completions with no outbound connections.
Plan endpoints and accelerator hosts
The platform or infrastructure team lists which hosts will run vLLM, which GPU or other accelerator types they carry, and which internal clients will call the API. Record the network zone, the internal address and port for the API, and the monitoring host that will scrape /metrics. Check each accelerator and driver combination against the vLLM installation documentation before any media is staged. This step is done when the plan names every host, its accelerator, its listening address, and every client allowed to reach it.
Stage the container image and packages
The infrastructure team downloads the vLLM image or wheels and their dependencies on a connected staging machine, then moves them through your approved media process into the enclave. Verify each artifact against the checksum or digest published by its source, and record the hashes in your change record. This supports the software integrity and authenticity verification that NERC CIP-013-2 addresses for vendor software and patches. Install from a local repository on the isolated host and confirm that vllm imports and reports the staged version. Done when the host runs that version with no package manager reaching outside.
Stage model weights and set the model path
The platform or data science team copies the model weights, tokenizer and configuration files from an approved source into a directory on the internal host, and records the model license and file checksums. Point vLLM at that local directory when starting the server so it does not attempt a Hugging Face download. Confirm that the architecture and chat template match what you intend to serve. Check the first start log to confirm the model loads from the local path with no outbound name lookups for the model. Done when the server reports that the model loaded from the staged directory.
Set a private cache root
The platform team sets VLLM_CACHE_ROOT to a directory owned by the service account, with permissions that block other local users from writing to it. The vLLM security documentation treats cache directories as private and trusted because cache contents load without integrity checks. Do not copy cache contents from untrusted sources or from another environment. In Docker deployments, mount the Hugging Face cache at /root/.cache/huggingface from a host path that holds only staged content, so the container reads your model files. Done when a directory listing shows owner-only write access and the cache holds only files produced by your staging process.
Enable offline API docs
The platform engineer adds the offline docs flag to the vllm serve command, so the FastAPI documentation page is served from the server instead of loading its resources from the internet. The /docs endpoint needs an internet connection by default, so omitting this flag leaves the page broken on a closed network. Load /docs from a client on the internal network and confirm the page renders with its assets. Done when the page loads and the traffic capture from the verification step shows no requests leaving the segment.
Confirm the chat template for chat completions
The model owner checks that the model's tokenizer configuration includes a chat template matching its instruction format. If the model does not provide one, supply a template file with the chat template option, using a file from your staging area so nothing is fetched at start-up. Keep the template under change control, because a template mismatch changes model output. Send one message to /v1/chat/completions and confirm the reply is coherent and the role formatting matches the model documentation. Done when the request returns a completion with no template error.
Run vllm serve on an internal address
The platform engineer starts vllm serve bound to an internal interface address and a port that the segment firewall opens only to approved clients. Set --api-key as one layer of protection, but note that it does not cover /metrics, /health, /pause, /resume, /abort_requests or /invocations. Place a reverse proxy in front of the server that allowlists only the endpoints users need, and keep admin paths reachable only from operator networks. Multi-node deployments send traffic without authorization or encryption by default, so keep those nodes on an isolated network. Done when the listening socket shows only the internal address and the proxy blocks admin paths from user networks.
Verify the air-gapped service end to end
The security or operations team runs the final checks from a host on the isolated network with default outbound routes removed. Load /docs, send a test request to /v1/chat/completions, and confirm that /metrics returns Prometheus-format data to the monitoring host only. Capture traffic on the server interfaces during startup and during the test request, and confirm the capture shows no egress to addresses outside the boundary. Save the capture, the configuration and the checksum records as evidence for your assessor. Done when every check passes, the evidence is filed, and the checks are repeated after each upgrade.
Private cache directories and usage reporting inside a closed network
Treat vLLM's cache directories as trusted local state that never crosses a trust boundary. The vLLM security documentation assumes that cache directories rooted at VLLM_CACHE_ROOT are private and trusted, because cache contents load without integrity checks. A tampered cache file is therefore loaded as if vLLM had produced it. The default root is under the home directory of the account running the server, at ~/.cache/vllm. In a closed network, the practical rule is that you do not copy cache contents from a laptop, a shared drive or another team's host, even when the source sits inside your boundary. Move model weights and container images through your staging process, and let the target host build its own cache.
Decide where the cache lives before the first start. Set VLLM_CACHE_ROOT to a dedicated path on a volume owned by the service account, and restrict write access to that account. Remove group and world write permissions from the directory tree. If the server runs in a container, mount the cache on a volume that no other container shares unless that container runs inside the same trust boundary. The Docker deployment guide mounts the Hugging Face cache at /root/.cache/huggingface, which is a separate store with its own location. It needs the same ownership and access rules, and it should appear in your runbook alongside the vLLM cache path, since both are easy to overlook during an audit.
Confirm how to disable usage statistics and any other outbound telemetry for the exact vLLM version you deploy. The configuration switch can change between releases, and this topic does not verify one for every version, so check the installation and configuration documentation and the release notes for your version. Also list the other outbound paths the server might use, such as model downloads, package index access during image builds, and any dependency that reports usage. Record each disabled setting in your configuration baseline and add it to the review for every upgrade, so that a new release cannot silently reintroduce an external call.
Test the deployment with the network blocked to find outbound attempts you did not expect. Run the server in a test environment with egress denied at the network layer, load the model from staged files, and send representative requests to each endpoint you plan to expose. Application logs may not show silent connection failures, so also review firewall deny logs and DNS query logs during the run. A clean test is evidence for the configuration you tested, not proof for every code path. Repeat the test after each vLLM upgrade and after any change to the model, image or cache location.
Internal ports and endpoints to keep closed in a vLLM air-gapped deployment
The --api-key option covers the /v1 routes but leaves several other HTTP paths and the inter-node ports reachable by any caller who can connect to them. In an air-gapped deployment, the boundary alone does not close these paths, so each card below names a surface to close at the proxy or network layer and a test to confirm it stays closed before go-live.
Prometheus metrics endpoint
The /metrics endpoint serves Prometheus-format data from the API server, including request counts, token throughput, latency histograms and KV cache use. The vLLM security docs state that --api-key does not protect it, so any client that can reach the port can read it without credentials. Test by requesting /metrics with no credentials from a user network segment and from a host outside the boundary, and confirm that the proxy refuses both requests.
Control and health endpoints
The /health, /invocations, /pause, /resume and /abort_requests paths sit outside the coverage of --api-key. Pause, resume and abort requests act on the engine's request handling, so an exposed path can disrupt service as well as reveal information. Send an unauthenticated request to each path through the proxy and confirm that the proxy returns an error for every path that end users do not need.
Reverse proxy allowlist
The vLLM security docs recommend a reverse proxy in front of the server that forwards only the endpoints meant for users, such as the OpenAI-compatible /v1 routes your applications call. Deny every other path by default. Build the allowlist from the endpoints your clients actually use, and keep administrative paths off it. Test by sending requests to each path the server exposes, including paths nobody listed, and confirm that only allowlisted routes return responses.
Scoped metrics scraping
Limit access to /metrics to the internal monitoring system that scrapes it, usually a Prometheus server on a management network. Allow that source address at the network layer and at the proxy, and deny it to user networks. Metrics can reveal workload patterns, model usage and capacity limits, so handle them as internal operational data. Verify by scraping from the approved monitoring host and confirming that a scrape from a user subnet fails.
Isolated API and inter-node ports
The vLLM security docs state that communication between nodes in a multi-node deployment is insecure by default, with no authorization or encryption, and must be protected by an isolated network. Place inter-node traffic, such as the traffic Ray or the multiprocessing backend uses, on a dedicated segment reachable only by cluster members. Keep the API port on a separate segment behind the proxy. Confirm with a host outside the cluster that connections to the inter-node ports fail.
Protecting multi-node traffic inside the air-gapped boundary
The first thing to settle is whether your vLLM deployment spans more than one node at all. The vLLM security documentation states that communication between nodes in a multi-node deployment is insecure by default, with no authorization and no encryption, and that the nodes must be protected by placing them on an isolated network. Inside an air-gapped boundary, that isolation is the starting point and still needs a design decision behind it. Treat every node-to-node path as an internal interface that needs an owner, a documented purpose, and a list of ports and hosts allowed to reach it. If your topology does not need multiple nodes, keeping the model on one host removes this entire class of exposure and simplifies your evidence.
Parallelism choice determines what crosses the wire. vLLM uses tensor parallelism within a node and pipeline parallelism across nodes, so inter-node traffic is shaped by the pipeline stages and the data they pass between hosts. For multi-node runs, vLLM relies on either Ray or its own multiprocessing backend. Each option brings different process management, dependencies and network requirements, and the chosen backend determines which services must be reachable between hosts. Confirm with the vLLM parallelism and scaling documentation which backend and transport fit your topology, and whether data parallel deployment applies to your mixture-of-experts model. Record that decision before writing firewall rules, because the rules follow from it.
Encryption is where the default falls short. The documentation describes inter-node traffic as unencrypted by default, so the isolated network alone may not satisfy your control set. Where policy requires encryption of traffic between nodes, plan an external layer that you can validate and operate, such as a FIPS-validated transport layer if your hosts run in FIPS mode. Ask the platform team to confirm which layer terminates the connection on each side, who manages its certificates or keys, and how the layer is retested after upgrades. Do not assume that vLLM's own configuration covers this requirement, and record the answer in the design file before the first multi-node test.
Verification and operations complete the section. Test the isolation rather than assuming it: from each node, attempt connections to every other node on the ports your backend uses, and confirm that nothing else is reachable. Capture the results with the configuration baseline so an assessor can see the boundary as built. Monitor for new listeners after upgrades, since backend and port behavior can change between minor releases. Assign an owner for the inter-node path, and include it in change review whenever the vLLM version, the parallel layout or the network segmentation changes.
What to confirm about your vLLM air-gapped deployment before go-live
The points below are not settled by the documentation alone, so each one needs an answer before go-live. Each card names who can confirm it: the vLLM project, the model publisher, or your own environment test.
Offline docs behavior across the release line
The --enable-offline-docs flag serves the FastAPI /docs page without internet access. Ask the vLLM project whether the flag and the usage-stats setting behave the same way in every minor version you plan to run, since your chosen release line may change. Then confirm on a staging host that /docs loads with outbound traffic blocked and that no external asset requests appear. Confirm this with the vendor, then repeat the test in your own environment.
Components that pull at start-up
vLLM downloads model weights from Hugging Face by default, and container or Kubernetes deployments may pull images, Helm charts, init containers and Python packages on first start. Build an inventory of every outbound destination by running the server with egress blocked and logging DNS lookups and connection attempts. Each hit must be satisfied from a pre-staged artifact or removed. This is your own environment test, and it should be repeated after every image or configuration change.
Model licenses and gated access
Model weights carry their own license terms, and many publishers gate access behind an account, an accepted agreement and a token. Confirm with each model publisher which license applies, whether its terms allow your intended internal use, and whether gated weights can be downloaded once and copied into the boundary. Also confirm that the chat template each model needs is included with the staged files, because the chat completions API requires one unless you supply it with --chat-template.
Accelerator driver and runtime offline installs
GPU drivers, the CUDA, ROCm or XPU runtime, and the container runtime each need their own installation packages inside the boundary. Confirm with the accelerator vendor which offline package sets exist for your operating system and driver version, and whether the vLLM image you run expects a specific runtime version. Then test the full install on an isolated build host, because a missing kernel module or runtime library often appears only when the GPU is first used.
Hardware plugin availability
vLLM runs on NVIDIA CUDA, AMD ROCm and Intel XPU GPUs, and on several CPU architectures. Accelerators beyond those are supported through third-party hardware plugins that live outside the main repository. Confirm with the plugin maintainer whether the plugin can be installed from offline packages, which vLLM versions it supports, and who issues its security fixes. If a plugin is required for your hardware, its release cycle becomes a dependency of your own patch plan.
Staging new minor releases
vLLM publishes new minor releases about every two weeks. The published dates for v0.28.0 (August 26), v0.29.0 (September 9), v0.30.0 (September 22) and v0.31.0 (October 5, 2026) show the pace. Define how each release is mirrored into the boundary, scanned and integrity-checked, then tested against your models, endpoints and offline behavior before promotion. Agree with your change board how many releases you will skip, and confirm with the vLLM project which release notes flag breaking changes.
Common questions about vLLM air-gapped deployment cost, effort and ownership
Does vLLM cost money to license for an air-gapped deployment?
No. vLLM is open-source software licensed under Apache-2.0 and has no paid edition, so the cost of running it sits elsewhere. You pay for accelerator capacity (GPUs or other accelerators), the surrounding infrastructure such as storage, networking, hosts and monitoring, the implementation work, and the people who operate the system afterward. Hardware, build and testing are usually one-time costs. Power, hardware refresh, staff time, support retainers and upgrades recur. Ask any partner to separate these lines in the quote so you can see what each one covers and who is paid for it.
What makes a vLLM air-gapped implementation take more effort?
The main drivers are the number of models, the number of accelerator hosts, the network topology and the controls around what crosses the boundary. Each model adds staging, compatibility checks and decisions about chat templates. Each host adds driver, image and configuration work. A multi-node run adds cluster design, because the vLLM security documentation states that communication between nodes is insecure by default and must be protected by an isolated network. Kubernetes adds a cluster that has to be built and maintained without internet access. Approval workflows for transfers and the evidence your assessors expect often take as long as the technical build.
Can our internal team deploy vLLM in an air-gapped network alone?
Often yes, if the team has Linux, GPU driver, container and Python operations skills and enough time to own the work. Because vLLM is open source with no paid edition, nothing blocks an internal build. The harder questions are whether the team has staged an offline package and model set before, whether it can check model behavior against the API your applications expect, and whether it can keep up with releases, which arrive about every two weeks. Identify who will pull, scan, approve and install the next release inside the boundary. If that answer is unclear, a scoped partner engagement or a retainer may suit you better. A skills and capacity review against the points in this section will show where the gaps are.
What do we need to provide before a vLLM air-gapped project starts?
Four things are needed from your side: network access, transfer approvals, hardware and a named owner. Network access covers the staging environment, the isolated network, and the internal registries and package mirrors the build will use. Transfer approvals cover each model, container image and package carried across the boundary, including who signs off and how checksums are recorded. Hardware means the accelerator hosts, storage and networking, delivered on dates agreed in the plan. A named owner makes decisions on scope, acceptance and access. Confirm each item in the written scope so a missing approval does not stall the work partway through.
How long does a vLLM air-gapped deployment take to complete?
Duration depends on scope, and no fixed figure applies to every environment. The schedule follows the number of models and hosts, whether multi-node or Kubernetes is involved, how long your transfer approvals take and how much evidence your assessors need. A single host with one approved model is a very different job from a multi-node cluster with a formal approval chain. Ask any partner for a timeline tied to named milestones, with client dependencies listed and assumptions written down. DeployOpen agrees scope, deliverables and timelines in writing before work starts, so the schedule is set against a defined scope.
What should a vLLM air-gapped implementation quote include?
A useful quote follows from a written scope, so ask for that scope first. It should list the models, accelerator hosts and topology, any Kubernetes scope, and the offline artifacts to be built, such as images, weights, packages and documentation. Look for the transfer and approval process, testing and acceptance criteria, the evidence package, handover and training, and the client dependencies. Ask which items are one-time and which recur, including support retainers, upgrades and security testing. Check the exclusions too, such as hardware purchases and your own assessor fees. DeployOpen does not publish a price list, and a quote follows from the written scope.
Does vLLM need ongoing maintenance after an air-gapped deployment goes live?
Yes. The vLLM project ships new minor releases about every two weeks, so a deployment left unchanged will fall behind. Each upgrade inside an air-gapped boundary repeats the transfer cycle: fetching the release, verifying its integrity and authenticity, testing it against your models and API clients, then installing it. If your sector falls under supply chain rules such as NERC CIP-013-2, which addresses verification of vendor software and patches, the evidence for each transfer matters for audits. Plan a release policy, a named owner and a test environment. Ongoing support and upgrades can run as a DeployOpen retainer, scoped in writing.
How DeployOpen scopes, delivers and supports an air-gapped vLLM deployment
DeployOpen plans, implements, hardens, documents and supports self-hosted open-source platforms inside the client's own infrastructure, including air-gapped networks. For vLLM, that means fixing the model, image and cache inventory before installation, then testing that the server runs with no outbound path. Engagements are fixed-scope, so the boundary, deliverables and timeline are agreed in writing before work starts.
How we scope
- Inventory of model weights, container images, Python packages and their sources crossing the boundary
- Accelerator, node count and parallelism settings confirmed against the hardware inside the network
- Required API endpoints, the reverse proxy allowlist and every internal port that must stay closed
How we build
- Stage weights and images through an approved transfer path, then verify checksums before import
- Set the offline docs flag, point caches at private directories under VLLM_CACHE_ROOT, and confirm no model download fires
- Turn off usage statistics collection using the method confirmed for the installed vLLM release
How we hand over
- Egress test logs showing the server and its dependencies make no outbound connections during startup and serving
- Runbooks for updating model weights, images and packages through the same controlled import path
- Written record of the boundary, port matrix, cache locations and allowlisted endpoints for your assessors
How we support
- Retainer option for tracking frequent vLLM minor releases and staging each upgrade inside the boundary
- Ongoing review of the endpoint allowlist, /metrics exposure and internal port rules as configuration changes
- Scheduled re-verification of the offline package set, including vulnerability checks on imported artifacts

