14

CONTEXT

With a local package repository, I'm able to provide my APT instances with a set of software packages and configurations from a server which I control, allowing any client to install this software using just the normal apt install command (providing the repository is added to their /etc/apt/sources.list{,.d/}).

For my attempt at creating a local package repository, I followed this tutorial on bipmedia.com, which roughly consists of:

  1. Generate the .deb
  2. Store the .deb on an Apache2 web server
  3. Generate a Package.gz file

My Attempt

Generating the binary package file

To generate the .deb, the software files are required, a DEBIAN folder with metadata is generated and the following command compiles the code and assembles the package:

dpkg-deb --build [source code tree with DEBIAN directory]

Serve repository files with Apache2 server

I'm skipping this part as it's unrelated to the problem I'm seeking to solve with this question.

Generating a Packages.gz file (repository metadata)

With the an open shell instance whose working directory is the Apache server root folder containing the .deb file from above, I called:

dpkg-scanpackages debian /dev/null | gzip -9c >debian/Packages.gz

PROBLEM

Calling apt update on the client machine, it complains with:

W: The repository 'http://example.com packages/ Release' does not have a Release file.

This necessary file is missing in my local repository. It seems to be a register of package checksums, but after searching on the Internet, my very limited understanding of the topic kept me from being able to find out how to generate it.


Note: My /etc/apt/sources.list file does have the following line:

deb http://example.com packages/

QUESTION

How do I generate the Release file for a local APT package repository?

Adrian Maire
  • 1,896
  • 4
  • 19
  • 30

1 Answers1

13

There are a number of ways of going about this; I use apt-ftparchive.

  1. Create an aptftp.conf file in the root of your repository:

    APT::FTPArchive::Release {
      Origin "Your origin";
      Label "Your label";
      Suite "unstable";
      Codename "sid";
      Architectures "amd64 i386 source";
      Components "main";
      Description "Your description";
    };
    

    with the appropriate values (change “Origin”, “Label”, “Description” at least, and adjust “Architectures” to match the binaries you host).

  2. Create a matching aptgenerate.conf file alongside:

    Dir::ArchiveDir ".";
    Dir::CacheDir ".";
    TreeDefault::Directory "pool/";
    TreeDefault::SrcDirectory "pool/";
    Default::Packages::Extensions ".deb";
    Default::Packages::Compress ". gzip bzip2";
    Default::Sources::Compress ". gzip bzip2";
    Default::Contents::Compress "gzip bzip2";
    
    BinDirectory "dists/unstable/main/binary-amd64" {
      Packages "dists/unstable/main/binary-amd64/Packages";
      Contents "dists/unstable/Contents-amd64";
      SrcPackages "dists/unstable/main/source/Sources";
    };
    
    BinDirectory "dists/unstable/main/binary-i386" {
      Packages "dists/unstable/main/binary-i386/Packages";
      Contents "dists/unstable/Contents-i386";
      SrcPackages "dists/unstable/main/source/Sources";
    };
    
    Tree "dists/unstable" {
      Sections "main"; # contrib non-free";
      Architectures "amd64 i386 source";
    };
    

    (removing i386 if you don’t need that).

  3. In your repository, clear the database:

    rm -f packages-i386.db packages-amd64.db
    
  4. Generate the package catalogs:

    apt-ftparchive generate -c=aptftp.conf aptgenerate.conf
    
  5. Generate the Release file:

    apt-ftparchive release -c=aptftp.conf dists/unstable >dists/unstable/Release
    
  6. Sign it:

    gpg -u yourkeyid -bao dists/unstable/Release.gpg dists/unstable/Release
    gpg -u yourkeyid --clear-sign --output dists/unstable/InRelease dists/unstable/Release
    

    (with the appropriate id instead of yourkeyid).

Whenever you make a change to the repository, you need to run steps 3 to 6 again.

Stephen Kitt
  • 411,918
  • 54
  • 1,065
  • 1,164
  • Can you use something like ` dpkg-scanpackages` rather than `apt-ftparchive`? – Toby Jul 16 '19 at 16:41
  • @Toby you can use `dpkg-scanpackages` to generate the package catalogs, but it won’t handle `Release` for you. The simple option nowadays is probably `aptly`; I should re-write this answer using that. – Stephen Kitt Jul 16 '19 at 17:00
  • Awesome! Thanks. I should have said earlier, I was looking for a cross platform tool which `apt-ftparchive` seems like it's not. So `aptly` sounds good for me and I'll read up on creating the packages. I'm assuming the signing is separate anyway. – Toby Jul 17 '19 at 10:42
  • I have done exactly this, with `focal` instead of `unstable` everywhere, and `amd64` only, and my custom deb file is in `dists/focal/main/binary-amd64`, but when I run step 4, may `Packages` file in `dists/focal/main/binary-amd64` is empty, zero size. And if I try to install the binary on another computer, it does not find the package... – transient_loop Aug 07 '20 at 21:34