Setting Up Your Own Linux Package Repository

By DistroPack Team 6 min read

Setting Up Your Own Linux Package Repository: The Complete Guide

Ever wondered how major Linux distributions deliver software updates so seamlessly? The magic lies in package repositories—centralized storage systems that make software distribution efficient and secure. Whether you're a developer distributing your applications, a system administrator managing internal tools, or an organization maintaining custom software, understanding how to create and manage your own package repository is an essential skill.

In this comprehensive guide, we'll walk you through everything you need to know about setting up and managing repositories for major Linux distributions, including apt repository for Debian/Ubuntu systems, yum repository for Fedora/RHEL, and repositories for Arch Linux. You'll learn about package hosting, security best practices, and tools like apt-mirror that simplify the process.

Understanding Package Repository Fundamentals

What is a Package Repository?

A package repository is essentially a storage location where software packages are kept, organized, and made available for installation. Think of it as an app store for your Linux system, but with much more control and flexibility. When you run commands like apt install or dnf install, your system contacts these repositories to download and install software.

Repositories serve several critical functions:

  • Centralized Distribution: Provide a single source for package distribution
  • Dependency Management: Handle complex software dependencies automatically
  • Version Control: Maintain multiple versions of packages
  • Security: Ensure package integrity through cryptographic signing
  • Efficiency: Enable delta updates and optimized downloads

Repository Types by Distribution

Different Linux distributions use different package management systems, each with its own repository format:

Debian/Ubuntu (APT Repositories)

APT repositories require specific components to function properly:

repo/
  dists/
    stable/
      main/
        binary-amd64/
          Packages
          Packages.gz
      Release
      Release.gpg
      InRelease

The key files include the Packages index file, Release metadata, and GPG signatures for security verification.

Fedora/RHEL (YUM/DNF Repositories)

RPM-based systems use a different structure:

repo/
  repodata/
    repomd.xml
    repomd.xml.asc
    primary.xml.gz
    filelists.xml.gz
    other.xml.gz
  packages/
    package-1.0.0-1.x86_64.rpm

The repodata directory contains all metadata, with repomd.xml serving as the main index.

Arch Linux (Pacman Repositories)

Arch uses a simpler structure centered around database files:

repo/
  distropack.db.tar.gz
  distropack.db
  distropack.db.sig
  package-1.0.0-1-x86_64.pkg.tar.zst

Setting Up Your First Repository

Planning Your Repository Structure

Before diving into technical setup, proper planning is crucial. Consider these factors:

  • Purpose: Are you hosting internal tools, public software, or mirrored repositories?
  • Scale: How many packages and users do you expect?
  • Security: What level of security and access control do you need?
  • Maintenance: Who will maintain the repository and how often?

For organizations managing multiple repositories, solutions like DistroPack can significantly simplify package repository management through automated tools and centralized control.

Creating an APT Repository (Debian/Ubuntu)

Let's start with setting up a basic APT repository. First, create the directory structure:

mkdir -p /srv/repo/apt/dists/stable/main/binary-amd64
mkdir -p /srv/repo/apt/pool/main

Add your .deb packages to the pool directory, then generate the Packages index:

cd /srv/repo/apt
dpkg-scanpackages pool/main /dev/null | gzip -9c > dists/stable/main/binary-amd64/Packages.gz

Create the Release file and sign it with GPG:

apt-ftparchive release dists/stable/ > dists/stable/Release
gpg --clearsign -o dists/stable/InRelease dists/stable/Release
gpg -abs -o dists/stable/Release.gpg dists/stable/Release

Setting Up a YUM Repository (Fedora/RHEL)

For RPM-based systems, the process is slightly different. Create the directory structure:

mkdir -p /srv/repo/rpm/packages
mkdir -p /srv/repo/rpm/repodata

Place your .rpm files in the packages directory, then generate metadata:

cd /srv/repo/rpm
createrepo_c .

Sign the repository metadata for security:

gpg --detach-sign --armor repodata/repomd.xml

Using apt-mirror for Repository Mirroring

If you need to mirror existing repositories (like official distribution repos), apt-mirror is an excellent tool. Install it first:

sudo apt install apt-mirror

Configure the mirror by editing /etc/apt/mirror.list:

############# config ##################
set base_path /srv/mirror
set run_postmirror 0
############# end config ##############

deb-amd64 https://archive.ubuntu.com/ubuntu jammy main restricted
deb-amd64 https://archive.ubuntu.com/ubuntu jammy-updates main restricted

Run the mirroring process:

sudo apt-mirror

This creates a local mirror that you can use for faster package installation within your network.

Security: GPG Signing and Verification

Why Package Signing is Non-Negotiable

GPG signing is crucial for package repository security. It ensures that:

  • Packages haven't been tampered with during distribution
  • Software comes from a trusted source
  • Users can verify authenticity before installation
  • Man-in-the-middle attacks are prevented

Generating GPG Keys

Start by generating a GPG key pair for signing:

gpg --full-generate-key

Choose RSA (4096 bits) for strong security, set appropriate expiration, and use identifying information that matches your organization.

Signing Packages and Metadata

Each distribution has specific signing requirements:

For Debian/Ubuntu packages:

dpkg-sig --sign builder package.deb

For RPM packages:

rpm --addsign package.rpm

For repository metadata:

# APT repositories
gpg --clearsign -o InRelease Release

# YUM repositories
gpg --detach-sign --armor repodata/repomd.xml

Client Configuration

Configuring APT Clients

Users need to configure their systems to use your repository. For APT-based systems:

# Add repository to sources.list
echo "deb https://repo.example.com/apt stable main" | sudo tee -a /etc/apt/sources.list

# Add GPG key
wget -qO - https://repo.example.com/pubkey.asc | sudo apt-key add -

# Update package lists
sudo apt update

Configuring YUM/DNF Clients

For RPM-based systems, create a repository file:

sudo tee /etc/yum.repos.d/myrepo.repo << EOF
[myrepo]
name=My Repository
baseurl=https://repo.example.com/rpm
enabled=1
gpgcheck=1
gpgkey=https://repo.example.com/pubkey.asc
EOF

sudo dnf makecache

Configuring Pacman Clients

For Arch Linux systems, add to /etc/pacman.conf:

[myrepo]
SigLevel = Required
Server = https://repo.example.com/arch

Advanced Repository Management

Automating Repository Updates

Manual repository management becomes impractical at scale. Consider automating:

  • Package addition/removal: Scripts that handle metadata updates
  • Signing processes: Automated GPG signing pipelines
  • Testing procedures: Automated testing before publishing
  • Backup systems: Regular backups of repository data

Handling Multiple Architectures

If you need to support multiple architectures (amd64, arm64, etc.), organize your repository accordingly:

apt/
  dists/
    stable/
      main/
        binary-amd64/
        binary-arm64/
        binary-armhf/

Each architecture directory will have its own Packages index.

Best Practices for Package Hosting

Effective package hosting involves more than just storing files:

  • Use HTTPS: Always serve repositories over HTTPS
  • Implement CDN: Use content delivery networks for global distribution
  • Monitor Performance: Track download statistics and performance
  • Regular Maintenance: Schedule regular repository health checks
  • Documentation: Provide clear setup instructions for users

Common Challenges and Solutions

Metadata Synchronization Issues

One of the most common problems is metadata getting out of sync with actual packages. This can cause installation failures. The solution is to always update metadata immediately after adding or removing packages, and consider using tools that automate this process.

GPG Key Management

Managing GPG keys across multiple repositories and users can be challenging. Establish clear key rotation policies, secure key storage procedures, and consider using dedicated signing servers for production environments.

Repository Size Management

As repositories grow, storage and bandwidth can become issues. Implement cleanup policies for old package versions, consider differential updates, and use efficient compression techniques.

Conclusion: Mastering Package Repository Management

Setting up and managing your own package repository is a powerful skill that gives you complete control over software distribution. Whether you're creating an apt repository for Debian systems, a yum repository for Red Hat derivatives, or repositories for other distributions, the principles remain similar: proper structure, security through signing, and consistent maintenance.

Remember that effective package hosting is an ongoing process. Regular updates, security monitoring, and performance optimization are essential for maintaining a reliable repository. Tools like apt-mirror can help with specific tasks, but comprehensive solutions like DistroPack provide enterprise-grade management capabilities.

By following the best practices outlined in this guide, you'll be well-equipped to create robust, secure, and efficient package repositories that serve your users reliably.