When running a number of Ubuntu or Debian servers, it can be extremely useful to have a custom APT repo for uploading your own packages, or third party packages that lack their own good repositories to subscribe to.
I recently found a nice Ruby utility called deb-s3 which allows easy uploading of dpkg files into an S3-hosted APT repository. It’s much easier than messing around with tools like reprepro and having to s3 cp or sync files up from a local disk into S3.
One main warning: This will create a *public* repo by default since it works out-of-the-box with the stock OS and (in my case) all the packages I’m serving are public open source programs that don’t need to be secured. If you want a *private* repo, you will need to use apt-transport-s3 to support authenticating with S3 to download files and configure deb-s3 for private upload.
Install like any other Ruby Gem:
gem install deb-s3
Adding packages is easy. First make sure your aws-cli is working OK and an S3 bucket has been created, then upload with:
deb-s3 upload \ --bucket example \ --codename codename \ --preserve-versions \ mypackage.deb
You can then add the repo to a Ubuntu or Debian server with:
# We trust HTTPS rather than GPG for this repo - but you can config # GPG signing if you prefer. cat > /etc/apt/sources.list.d/myrepo.list << EOF deb [trusted=yes] https://example.s3.amazonaws.com codename main EOF # and ensure you update the package info on the server apt-get update
Alternatively, here’s an example of how to add the repo with Puppet:
apt::source { 'myrepo': comment => 'This is our own APT repo', location => 'https://example.s3.amazonaws.com', release => $::os["distro"]["codename"], repos => 'main', allow_unsigned => true, # We don't GPG sign, HTTPS only notify_update => true, # triggers apt-get update }