Tutorials

End-to-end walkthroughs that take a pile of packages all the way to a signed repository your clients can install from.

Each tutorial here is a complete journey: you start with nothing, run every command in order, and finish with something a real dnf or apt client can use. Commands are copy-pasteable and every output block is a real transcript.

If you have not installed SOW yet, start with Installation and Quick Start — those get you to a working flat repository in five minutes. The tutorials below pick up from there and build the production shape.

Which one first

Your situationStart here
You ship RPMs for EL8 / EL9 / EL10Build a YUM Repository
You ship DEBs for Debian or UbuntuBuild an APT Repository
You have a repository and clients complain it is unsignedSign Your Repository
The tree is built but nothing can reach itServe Repositories
You have a createrepo_c cron job or a reprepro databaseMigration

The YUM and APT tutorials share one workspace and are written to be followed in sequence — the APT tutorial adds a second Dist to the repository the YUM tutorial creates. You can also follow either one standalone; each states its own prerequisites.

Conventions used here

Shell blocks contain commands without a $ prefix so you can copy a whole block at once. Output appears in a separate block below the command, or as a comment when it is one line. Where a command needs a value you must substitute, it appears in UPPERCASE.

Every tutorial ends with a verification step. If verification fails, do not continue — the next step assumes the tree is in the state the previous one produced. sow check is the gate that tells you the truth: exit code 0 means the tree is complete and ready to copy, exit code 5 means it is not.


Build a YUM Repository

Create a managed RPM repository with per-architecture views, noise filtering, and a working dnf client configuration.

Build an APT Repository

Create a managed DEB repository with a Debian-style pool, by-hash indexes, and both deb822 and legacy client configurations.

Sign Your Repository

Generate a dedicated GPG key, sign repository metadata and RPM packages, and configure clients to reject anything unsigned.

Serve Repositories

Publish a repository over HTTP with Nginx, preview it locally, and copy it to an air-gapped host without losing deduplication.

Migrate from createrepo_c / reprepro

Take over an existing repository in place or move a reprepro archive into a workspace, with a real side-by-side of what changes.

Last modified: 2026-08-08: init commit (fe725aa)