airgap is a single Go binary for syncing and serving offline content for disconnected environments.
It supports:
- RPM repository mirroring (EPEL)
- OpenShift binaries and client artifact mirroring
- Container image mirroring metadata/blob sync
- Export/import workflows for physical transfer media
- A built-in web UI + HTTP API
The codebase is active and functional (not just scaffolding). CLI, server, sync engine, provider registry, transfer engine, and SQLite persistence are implemented.
- Go
1.23+(for local builds) - Optional external tools:
skopeo(required forregistry pushoperations)createrepo_c(optional but recommended for RPM metadata regeneration after import)
make build
make testManual build:
go build -o bin/airgap ./cmd/airgap- Copy and edit the example config:
cp configs/airgap.example.yaml ./airgap.yaml- Run a sync (all enabled providers):
./bin/airgap sync- Start the UI/API server:
./bin/airgap serveDefault listen address is 0.0.0.0:8080.
Config file discovery order:
./airgap.yaml/etc/airgap/airgap.yaml$HOME/.config/airgap/airgap.yaml
Top-level sections:
serverexportscheduleproviders
For full details, see docs/configuration.md.
When schedule.enabled is true, recurring jobs are executed by the scheduler while airgap serve is running.
Provider configs are stored in SQLite (provider_configs). YAML provider entries are used for first-run seeding when the table is empty.
Implemented provider types:
epelocp_binariesocp_clientsrhcoscontainer_images
Supported as config/target types:
registry(used as a destination forregistry push)custom_files(accepted config type; sync implementation is not wired yet)
sync: sync one/all providersvalidate: validate local files against provider metadatastatus: provider status summary from store stateexport: create splittar.zsttransfer archives + manifestimport: verify/import transfer archivesserve: web UI + API serverproviders list: list provider configs from SQLiteregistry push: push mirrored container images to a registry targetjobs list|add|pause|resume|run-now|delete: manage scheduled sync/validate jobsconfig show: print loaded configconfig set: persist a typed config value to YAML (KEYdot-path + YAMLVALUE)
Main pages:
/dashboard/providers/providers/{name}/transfer/ocp/clients/jobs
API routes are documented in docs/http-api.md.
For architecture and runtime flow, see docs/architecture.md.
Release/version workflow is changelog-driven. See docs/release-process.md.
All releases are tracked in CHANGELOG.md.