MYKOS / DOCUMENTATION · Dashboard · API

Signed RHEL 9 and RHEL 10 host packages

Documentation index

Step-by-step starting points: Packaging README · Testing README.

Supported MYKOS hosts: RHEL 9 and RHEL 10 (x86_64). RHEL 8 host support has been dropped. Guest/image support is separate: RHEL 8 guest recipes remain available.

Each supported host major has its own signed binary RPM, source RPM and repository. Older EL8 package archives are historical artifacts, not a supported host-installation path. Choose the repository matching the host, not the OS you want to run inside a guest.

Install from the matching repository

Host Repository configuration
RHEL 9 https://repo.myk.sh/mykos-1.5-for-x86_64-el9/mykos-el9.repo
RHEL 10 https://repo.myk.sh/mykos-1.5-for-x86_64-el10/mykos-el10.repo

For example, on RHEL 9:

sudo curl -fsSL https://repo.myk.sh/mykos-1.5-for-x86_64-el9/mykos-el9.repo -o /etc/yum.repos.d/mykos-el9.repo
sudo dnf install mykos
rpm -q mykos
sudo systemctl status mykos-firstboot.service --no-pager

On RHEL 10, use el10 in both the URL and destination filename. Keep gpgcheck=1; confirm the signing fingerprint before accepting an imported key: BC14191DE284100A246DD552F4384FD1AD974308. The repository supplies RPM-GPG-KEY-MYKOS. Source and binary RPMs are signed; checksums describe the signed files. Repository-metadata signing is not asserted by gpgcheck=1.

Fresh installation queues mykos-firstboot.service after the RPM transaction. It configures Apache IP access and the application, checks application readiness, then prints MYKOS is running: http://SERVER_IP/mykos/. Check the service journal if the terminal returns before firstboot finishes. It creates no guest, browser password or API key. Existing configured deployments skip automatic firstboot. Create the first browser administrator with:

sudo /usr/local/sbin/mykos-users create NAME --role admin

RHEL BaseOS/AppStream access and a Python package source are needed. EL9 uses Python 3.11 (python3.11 and python3.11-pip); EL10 uses distribution python3 and python3-pip. The package has distinct host release requirements. KVM checks open /dev/kvm and create an empty VM without starting a guest; unavailable KVM produces a warning and retains native Linux use. See desktop prerequisites before attempting VM lifecycle operations.

Default HTTP and optional HTTPS

Default access is http://SERVER_IP/mykos/; it needs no domain or Certbot. Domain virtual hosts and Certbot are configured only by explicit opt-in:

sudo mykos-setup --configure-https
# Or choose the domain and ACME account email explicitly:
sudo mykos-setup --configure-https --domain example.com --email admin@example.com

Public DNS and incoming TCP 80/443 must be ready for that domain. The URL is printed only after app readiness. --public-origin alone configures the app's origin; it does not request a certificate or provision a domain virtual host. See bootstrap details and renewal/removal behavior.

Upgrade and verify

Back up deployment settings and identity data according to installation recovery, and back up guest disks and customer backup data separately. Then:

sudo dnf upgrade mykos
sudo mykos-setup --enable
sudo python3.11 /usr/share/mykos/bin/mykos-install verify
# On RHEL 10, use python3 for this verification command.
rpm -q mykos

mykos-setup uses the installed interpreter, pinned Python dependencies and existing settings. Rerun it after an upgrade to snapshot/configure deployed files and restart the MYKOS services. It does not select a VPN gateway or create images. Use the existing public origin; do not replace a working domain with an example. If verify reports local edits, reconcile them rather than overwriting them. Kickstarts use %config(noreplace); review .rpmnew alongside operator files.

The package owns code under /usr/share/mykos; setup deploys runtime sources and helpers under /usr/local/share/mykos, /usr/local/sbin and /opt/mykos-web. Configuration, identities, inventory, VM disks, intentional snapshots and saved VPNs are runtime state, outside the RPM payload. Updates preserve existing guests and do not migrate older networking automatically. New guests use the configured private bridge; old pipework/macvlan instances need a separately planned migration.

Install a downloaded signed RPM

Historical EL9 filename example (release146); substitute the current signed release filename after downloading the RPM and public key from the matching trusted repository and verifying the key fingerprint:

sudo rpm --import ./RPM-GPG-KEY-MYKOS
rpm -Kv ./mykos-1.5.20261024-146.el9.noarch.rpm
sudo dnf --setopt=localpkg_gpgcheck=1 install ./mykos-1.5.20261024-146.el9.noarch.rpm

On RHEL 10, use the matching .el10 filename. A checksum alone does not authenticate the signer. Do not disable signature checks to bypass a failure.

Build and repository maintenance

Build from the released source, excluding runtime identities/disks and unpublished work. With the target's build prerequisites installed:

python3 bin/mykos-package --output /tmp/mykos-1.5.20261024.tar.gz
mkdir -p ~/rpmbuild/{SOURCES,SPECS}
cp /tmp/mykos-1.5.20261024.tar.gz ~/rpmbuild/SOURCES/
cp packaging/rpm/mykos.spec ~/rpmbuild/SPECS/
rpmbuild -ba --define 'mykos_target_el 9' --define 'dist .el9' ~/rpmbuild/SPECS/mykos.spec

Use the appropriate target major and approved signing workflow. A local build is not automatically signed or published. Signing keys are maintained outside source and packages. Keep MYKOS repositories separate from synchronized Red Hat mirrors; refresh only the intended custom repository's metadata after approved publication. Never add arbitrary RPMs to a mirrored upstream tree whose metadata omits them.

Validation scope

Release package/application/login checks on fresh RH9 and RH10 used isolated RHEL UBI init systems with repositories available. These checks cover installation, IP-first setup and authenticated HTTP sessions, not full bare-metal virtualization, physical NIC routing, CRIU compatibility or VM lifecycle validation. The user's vanilla RH9 server testing remains independent. See validation record.

Repository visibility and production storage

The current deployment serves repository files directly from production (prod.myk.sh, LAN 192.168.222.80), under /home/mykos-repositories. The trusted /home/html and /var/www/html aliases point to that same storage. Publish new accepted MYKOS releases there; the former repository server is no longer the publication destination.

Public download trees are limited to:

updateos is LAN-only, along with the RHEL mirrors and other private trees. The only public repositories are MYKOS EL9 and MYKOS EL10.

The same policy applies to the legacy mykol.com hostname and the production repository listing. RHEL mirrors, historical EL8 MYKOS packages, support, ostools and the inventory endpoint remain local/LAN only. The repository root page lists the three public trees. Serving historical EL8 files on the LAN does not restore EL8 MYKOS host support.

LAN repository clients resolve repo.myk.sh to 192.168.222.80, keeping trusted HTTPS hostname verification while avoiding a public-address hairpin. Known production, dev and legacy-server clients use this mapping. Existing HTTP clients using the old server's 192.168.222.5 address receive a compatibility redirect to production's LAN IP; old repository data is preserved for rollback. Do not send new publication jobs to the old host.

Production collects its own repository inventory. Dev reads production's LAN-only inventory endpoint. The old inventory timer is disabled. Package checks, metadata reads and repository cutover do not require guest/image builds, a web application restart, a physical NIC move or changes to customer disks.

Safely synchronize the RHEL mirrors

Run synchronization on the production repository host. It requires cgroup v2, root access, installed Podman, GNU cp with reflink-capable storage, and valid upstream RHEL entitlements. Workers use matching upstream definitions when available; missing standard RHEL 7–10 definitions are authenticated against fixed Red Hat CDN paths using the host entitlement certificate and CA mounted read-only. Production and dev use reflink-enabled XFS. Missing upstream access, keys, COW support or free space stops the job without publishing an incomplete repository. The public MYKOS-only and LAN-only updateos policy above is unchanged by mirror sync.

Start the normal RHEL 7–10 job and follow its journal:

sudo systemctl start --no-block mykos-repo-sync.service
sudo journalctl -fu mykos-repo-sync.service
# Inspect the final result, including a failed/interrupted run:
sudo systemctl show mykos-repo-sync.service -p ActiveState -p Result -p ExecMainStatus

To synchronize one major, for example RHEL 9:

sudo /usr/local/share/mykos/repo/bin/sync_repos 9

The direct command also enters the managed background slice and waits for its transient mykos-repo-sync-cli.service, collecting that unit after completion. Both entry points share the sync lock; the dashboard recognizes either one and blocks repository deletion while sync holds the lock. RH6 is rejected.

The entire job receives one CPU of quota, a 2 GiB soft memory threshold and 3 GiB hard limit, CPU/IO weights of 10, nice value 15 and best-effort IO priority 7. Each worker is additionally limited to one CPU, 2 GiB RAM with no additional swap and 256 processes. Background processes have an increased OOM score so they are preferred for termination under memory pressure. Package-manager downloads use one parallel transfer and a 20 MiB/s throttle. Workers can write only private staging storage, not the served repository tree; normal host subscription secrets remain read-only. Required Red Hat RPM keys are imported inside the disposable worker, and reposync signature checking and TLS verification are explicitly enabled.

The host verifies every referenced metadata file and package checksum before publication. Existing repository data is cloned using COW, never writable hard links; no full-copy fallback or package deletion is used. Prior immutable package and metadata URLs remain available for clients holding an older manifest. Each complete repository is switched with Linux atomic directory exchange. A failure in one component prevents publication of that major's staged components; already completed repository switches from earlier work remain valid.

For a normal cancellation:

sudo systemctl stop mykos-repo-sync.service mykos-repo-sync-cli.service

The job stops only its recorded, labeled worker and removes unpublished scratch. A hard kill or power failure can leave a root-private .mykos-sync-* workspace. The next invocation recovers only recognized, root-owned workspaces and verifies worker ownership before cleanup; unknown entries are retained for inspection. Do not delete repository roots or shared images to clear a failed job. Worker images are reusable operational caches, not guest builds. A mirror sync does not refresh MYKOS application RPMs; publish those through the signed release workflow.