Install Red Hat Edge Manager on an air-gapped Red Hat Enterprise Linux host by using the bundle you prepared in Prepare an offline installation bundle.
Procedure
-
Extract the bundle into a working directory:
mkdir ~/rhem-bundle
tar -xzf ~/rhem-bundle.tar.gz -C ~/rhem-bundle
-
Start a local container registry on the target host. Quadlet services pull images at startup; on an air-gapped host those pulls must come from a local registry. The bundle includes
docker.io/library/registry:2.
Load the registry image into Podman local storage:
skopeo copy \
"dir:$HOME/rhem-bundle/images/library/registry:2" \
"containers-storage:docker.io/library/registry:2"
Create the registry data directory and start the registry container:
mkdir -p ~/registry-data
podman run -d --name local-registry \
--network=host \
--security-opt label=disable \
-v ~/registry-data:/var/lib/registry \
--restart=always \
docker.io/library/registry:2
Verify the registry is ready:
curl http://localhost:5000/v2/
Note
--network=host avoids port-forwarding issues with rootless Podman on Red Hat Enterprise Linux 9. Use --security-opt label=disable in place of the :z volume flag when --network=host is set.
-
Import bundled images into the local registry:
cd ~/rhem-bundle
./import.sh
By default, import.sh targets localhost:5000. To use a different registry address:
./import.sh --registry <host>:<port>
Verify the images are available:
curl http://localhost:5000/v2/_catalog
-
Install the
flightctl-services RPM and dependencies from the bundle:
cd ~/rhem-bundle
./install-rpms.sh
-
Configure registry redirection so Podman pulls from your local registry instead of upstream registries. Edit
/etc/containers/registries.conf and add mirror entries for each source registry. Set <registry_host>:<registry_port> to localhost:5000:
[[registry]]
prefix = "quay.io"
location = "<registry_host>:<registry_port>"
insecure = true
[[registry]]
prefix = "docker.io"
location = "<registry_host>:<registry_port>"
insecure = true
[[registry]]
prefix = "registry.redhat.io"
location = "<registry_host>:<registry_port>"
insecure = true
Important
The insecure = true flag is required when the registry serves plain HTTP. If your registry uses TLS, remove this flag and ensure its CA certificate is trusted on the target system.
-
Configure Red Hat Edge Manager before you start services. Create or edit
/etc/flightctl/service-config.yaml with at minimum:
global:
baseDomain: <baseDomain>
generateCertificates: builtin
auth:
type: oidc
Replace <baseDomain> with the fully qualified domain name clients use to reach the host (not a raw IP address). Set auth.type to oidc to use the built-in PAM OIDC issuer installed with flightctl-services. For DNS, TLS, and certificate planning, see Planning DNS and TLS for the standalone gateway.
-
Enable and start services:
sudo systemctl enable --now flightctl.target
sudo systemctl list-units 'flightctl-*.service'
sudo podman ps
-
Complete Configure authentication credentials to create administrator accounts.
-
Install the Flight Control CLI if the bundle includes
flightctl-cli RPMs:
sudo dnf install -y flightctl-cli
This command uses the repository metadata that install-rpms.sh configured from the bundle.
Results
sudo systemctl status flightctl.target reports active services.
- Required
flightctl-* services are active, including flightctl-gateway.service when your release ships the standalone HTTPS gateway.
- When the CLI is installed, it reports a version:
- The web UI is reachable at
https://<baseDomain>/ on port 443.
- The API responds through the gateway:
curl -k -o /dev/null -w '%{http_code}\n' https://<baseDomain>/api/v1/fleets
The Prometheus and Grafana container images are not included in the standard bundle. If you need the observability stack, mirror those images separately and include the observability RPM in the bundle. See Installing the observability stack in disconnected environments.
For upgrades, build a new bundle for the target release and Upgrading the Red Hat Edge Manager RPM installation.
For installation errors, see Troubleshooting offline RPM installation.